先找出共通點,然后實現共通點,并把不確定的信息設計為擴展,這就是推遲決策的設計思路。但是,應該指出的是,上面這個例子的設計,仍然有很多的限制,例如,增加的需求(也就是某個ConcreteDecorator)中可能擁有新的接口,例如需要一個AnotherOperate方法,這時候,原先的擴展性設計就又變得難以滿足需要了。在軟件設計中,針對接口設計的靈活性和擴展性雖然比以往的設計增強的許多,但它并不是萬能的,而且取決于設計師對需求的理解能力和設計水平。此外,推遲設計決策要求我們學習抽象的思維,識別和區分軟件中變化和不變的部分。
注重接口,而不是注重實現
Martin Fowler把軟件設計分為三個層面:概念(conceptual)層面、規約(Specification)層面、實現(Implementation)層面。軟件的設計應該盡可能地站在概念、規約層面上進行,而不是過分關注實現層面。之所以有時候我們發現在迭代的過程中,軟件難以承受這種變化,那么,很大的可能是規約層面和實現層面出了問題。我們在前面一節討論重構和審查的時候說,消除重復代碼是一項復雜的工作,針對規約設計就是其中最有效,但也是最難的一種方法。
我們可以把規約層面想象為軟件的接口或是抽象類,或是具體類的公有方法,而把實現層面想象為實現類、實現細節。那么,我們的原則應該盡可能設計穩定的規約層面,并為客戶(可能是真正的客戶,大部分情況下是使用你的代碼的客戶程序員)提供一個優秀的、簡單的界面(接口)。社會發展到現在的水平,任何一個人都不會花費過多的時間來研究你的代碼,如果你的代碼不能夠為他人提供便利性,那么最后被淘汰的一定就是你的代碼。Java語言的成功,很大程度上就在于他在保證其強大功能的同時,還提供了一個簡單、易用、清晰的規約界面。
在軟件設計中,重視規約層面的設計是很普遍的。為什么我們提倡三層架構的軟件設計?最重要的是因為他為軟件結構合理性貢獻巨大,遠遠超過了他的其它價值。在現代的軟件設計中,數據庫、界面、業務建模其實是三種差異較大的技術,這就導致了三者的變化度是不同的。根據區分不同變化度的原則,我們知道,必須對三種技術進行區分。而這正是三層架構的主要思路。從這個思路擴展出去,我們還可以根據變化度的需要,將三層架構演變為四層架構、甚至多層架構。而多個層次之間,正是通過優秀的規約界面來達到最松散的耦合的。
在精益編程中,為了避免浪費,要求每位程序員提高代碼的規約層面的穩定性是非常有必要的。一個系統中,設計優良的規約界面能夠擁有比較好的抗變化能力,能夠較好的適應迭代過程。
回歸
版本2的軟件出現了版本1中不存在的行為,稱為回歸;貧w是軟件開發中的主要問題。在對現有功能修改的同時影響原有的行為,這是造成bug的主要原因。在迭代的過程中,必須避免回歸行為的出現。而避免回歸問題的主要解決方法是構建自動化的測試,實現回歸測試。
文章來源于領測軟件測試網 http://www.kjueaiud.com/