敏捷核心思想、設計模式與過度設計
這兒只談敏捷開發的核心思想,而不談其他表現形式比如結對程式設計,測試驅動等。本文不是談設計模式,而是談何時該用設計模式。
敏捷開發的核心思想是:只對當前已經發生過>=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次這個條件。如果理解了敏捷思想,就能恰當的去使用抽象,封裝,設計模式,而不會造成過度設計。敏捷思想需要廣大軟體設計人員一起去落實才能使軟體程式碼朝敏捷方向發展。