“軟件設計的重點在于抽象”,不記得這句話是哪位說的了,我想改正一下:“保證軟件靈活性設計的重點是抽象”,由此可知,抽象的作用是“保證軟件的靈活性設計”。越來越多的語言、平臺構建在OO思想之上,這充分說明了OO的正確性。OO,一種思想,一種談到軟件設計時必須涉及的思想,越來越多的人開始追捧它,當然,我也是其中之一。有了它,軟件設計可以提升到一個“美”的境界;有了它,軟件的可讀性、可維護性、靈活性、可擴展性等等一大堆的“性”得到了很大的提高。為什么會這樣?因為面向對象思想把軟件跟現實更緊密地聯系了起來,便得一些現實物理世界中的思想可以很容易的運用到軟件中去。這幾年,“設計模式”、“架構”等等一系列的名詞越來越受到人們的關注。所有這些東西,其實就是為了實現一個抽象層次的編程,以保證軟件的靈活性。
那什么是抽象?引用一位網友的話:“抽象就是有選擇的忽略”,中國有句真理,叫“太極生兩儀,兩儀生四象,四象生八卦,八卦生萬物”。從太極到萬物,這種金字塔式的結構在復雜的軟件工程中也是存在的,越接近金字塔的頂端,越要有選擇的忽略掉更多的東西,從而具有更高的抽象程度。舉個例子,兩個功能A、B都是實現對數據的增刪改,A是針對“客戶”的,B是針對“產品”的,我們可以做一個增刪改服務或者容器之類的東西來支持所有的增刪改功能,A、B功能代碼只用對使用這些服務然后再實現一些各自特殊的東西就可以了。這樣做就把“增刪改邏輯”給抽象了出來。再比如說O/R映射工具,它其實就是把數據操作抽象了出來。“抽象”的反義詞應該是“具體”,我們可以把抽象理解為活的,具體理解為死的。各個具體的事物之間肯定會有重復,比如男人和女人都會走路,都會吃飯;比如你沒有使用O/R映射工具的數據層的各個類都要實現一些相同的邏輯。軟件設計中有一個原則:“Don't? Repeat”,就是不要重復。理想狀態下,一個系統的任何代碼、邏緝、概念在這個系統中都是唯一的,這樣的系統肯定是非常靈活,因為“抽象”對應“活”。唯一性很容易保證,但是邏緝、概念的唯一性就很難保證,應該說是根本保證不了,概念這東西抽象到最上層什么都沒有了。什么事情都有個度,只能說是軟件的靈活性會隨抽象程度的提高而提高。
這么說,是不是就意味著抽象程度越高越好?不是!剛才說了,任何事物抽象到最上層就是叫“事物”,還從哪來軟件?一些書目中或明或暗地提到軟件設計肯定有個最好的抽象程度,而且我們應該去努力達到這個抽象程度。不錯,說得很對。但是,項目與項目之間是不同的,不存在適用于所有項目的最好抽象程度。
我的一個同事給我說過一句話:“軟件項目的成功標志是什么?有三點:客戶滿意,公司滿意,員工滿意”。客戶怎么滿意?軟件按照預算工期、成本完成,并為為他們創造價值;公司怎么滿意?軟件按照預算工期、成本完成,并為公司創造利益;員工怎么滿意?軟件按照預算工期、成本完成,開發過程順利,自已的利益得到保證。得到的結論就是軟件項目順利的按照預算工期、成本完成,就算是成功了。運用抽象的最終目的肯定是促使項目成功,并不是讓你搞“科研”。一個項目的所有因素決定了這個項目最好的抽象程度,項目經理、架構師需要反復思考,軟件設計時究竟抽象到什么程度最好?這肯定要根據現有的資源(開發人員、工具等)來確定,如果過于抽象,你水平到位,可以理解,那么下面的開發人員呢?你必須要考慮培訓成本、溝通成本,過于抽象,會延長工期,甚至讓項目遙遙無期。
說了這么多,并沒有給出一套權衡的方法,在下實在水平有限,其實在自已帶領的項目中也并沒有把這些東西把握得很好,希望認真思考過這個問題的人能留下你的只言片語。