这儿只谈敏捷开发的核心思想,而不谈其他表现形式比如结对编程,测试驱动等。本文不是谈设计模式,而是谈何时该用设计模式。
敏捷开发的核心思想是:只对当前已经发生过>=2次的同类需求变更,去应用抽象,封装,或设计模式来调整当前架构,以使之能够灵活适应下次同类需求变更(即下次的同类变更我们能以最少的成本和时间去完成)。
实例一:商场优惠方式。
这个场景很多人在读设计模式时都见过,大家都知道会用到策略模式。但是,不是一开始就应该去使用策略模式,策略模式是为了适应场景变化渐渐引入的。
1)比如一开始,商场优惠方式是打8折。有如下工具类,简化的代码:
class Utils{
public double calculate(int originPrice){
return originPrice*0.8;
}
}
class Client{//调用端。
void main(){
Utils.calculate(100);
}
}
最初我们的代码就应该如上面这样简洁,而不是包含策略模式。如果到目前商场都没有推出其他优惠方式,那上面的代码不需要做任何改动。
2)如果今天这个版本商场增加一种优惠方式:满100减10.
那么现在同类需求(这里是优惠方式增加的需求)变化发生了2次,按照敏捷思想,这时候就应该应用设计模式或抽象来重构代码以使之能适应下一次增加优惠方式这种需求的变化。这里使用了策略模式,简化代码:
Interface Calculator{
double calculate(double originPrice);
}
Class Factory{
Public static Calculator createCalculator(String name){
Switch(name){
Case “8折”:
Return new EightDiscountCalculator ();
Case “满100减10”:
Return new ManjianCalculator();
Default:
Return null;
}
}
}
Class EightDiscountCalculator implements Calculator{
Double calculate(double originPrice){
Return originPrice*0.8;
}
}
Class ManjianCalculator implements Calculator{
Double calculate(double originPrice){
Return originPrice>=100?originPrice-10:originPrice;
}
}
Class Client{//调用端。
Void main(){
Factory.createCalculator(“8折”).calculate(100);
Factory.createCalculator(“满100减10”).calculate(100);
}
}
到这步时,如果有下次这类需求的变化,比如增加一种新的优惠价格方式,我们可以轻易增加一个NewCalculator来实现。从上面可以看出,敏捷思想是允许再一再二但不许再三再四。
第一次就采用策略模式会导致过度设计,因为有可能永远只有8折这种优惠方式,我们预留接口是无意义的。
但是一旦发生了第二次,我们就应该应用模式去调整架构以使之适应第三次,四次。。。同类需求变更。
总结:上面介绍了敏捷思想的一个场景,其实还有很多场景,比如你在设计一个组件的时候,
如果目前只有一个地方在使用,就没必要把它抽取出来预备给其他地方使用。但是如果今天有个地方突然要用跟这个组件相同的功能(注意此时发生了2次),就应该抽取成公用组件以便于复用。所以理解敏捷设计思想一定要注重发生2次这个条件。如果理解了敏捷思想,就能恰当的去使用抽象,封装,设计模式,而不会造成过度设计。敏捷思想需要广大软件设计人员一起去落实才能使软件代码朝敏捷方向发展。