今天要说的重构来自于我日常工作中的发现而不是其它的什么地方,我在日常工作中经常使用这个重构,我想针对今天要解决的问题可能还有其它的解决方案。
在日常的编码中我们经常需要用到异常来控制程序流,下面的代码就是一个例子:
1: public class Microwave
2: {
3: private IMicrowaveMotor Motor { get; set;}
4:
5: public bool Start(object food)
6: {
7: bool foodCooked = false;
8: try
9: {
10: Motor.Cook(food);
11: foodCooked = true;
12: }
13: catch(InUseException)
14: {
15: foodcooked = false;
16: }
17:
18: return foodCooked;
19: }
20: }
异常处理只应该处理异外的行为,像上述代码中的这种异常大部分时候我们可以用更为合适的条件表达式来处理。我们对上面的代码进行基于契约的编码,我们在
执行指南的动作时先确保满足了必要的状态,以减少由于异常处理带来的性能损失。
1: public class Microwave
2: {
3: private IMicrowaveMotor Motor { get; set; }
4:
5: public bool Start(object food)
6: {
7: if (Motor.IsInUse)
8: return false;
9:
10: Motor.Cook(food);
11:
12: return true;
13: }
14: }