## 連載:面向對象葵花寶典:思想、技巧與實踐(4) - 面向對象是瑞士軍刀還是一把錘子?
**為什么要面向對象?**
可以說,面向過程和計算機是如影隨形的。從計算機誕生之日起,面向過程就是占據著主導地位的思想,即使到了現在,面向過程也是無處不在的,C語言、操作系統、協議棧、驅動系統,都是面向過程的代表。?
那為什么還會有面向對象的誕生并流行呢?當然是面向過程存在某些不足,如果面向過程足夠好,誰還費心費力的去搞另外一套呢??
前面我們提到,面向過程是一種機器的思想,我們以流水線作為類比,那么我們先拋開面向過程,來看看流水線有什么不足。?
舉個簡單的流水線例子:啤酒生產流水線。啤酒生產流水線分為“洗瓶”,“灌裝”,“壓蓋”,“殺菌”等幾個階段,這些階段總體上來說對生產一瓶醋是差不多的,但是一條啤酒生產線能夠生產醋么?應該是不行的,即使行,估計也要換一些東西,但是換了東西后,又不能生產啤酒了。?
面向過程同樣就有流水線的這個缺點,即:流程和原料相對固定,擴展比較麻煩。?
對于工業系統來說,流水線的缺點幾乎可以微不足道,因為工業化講究的是效率,而擴展性卻不是那么重要,一旦一條生產線建成,至少需要運行幾年,甚至運行十幾年都有。?
而對于軟件系統來說,很難想象一個軟件開發完成后,幾年都不變,大部分的情況是,軟件可能是1年擴展多次,甚至還沒有開發完,客戶新的需求又來了。?
在軟件系統這種環境下,面向過程顯得就比較吃力了,每次需求的變更,可能都要將流程的每個步驟、原料、中間產品都進行修改,這樣的代價在軟件系統中幾乎是不可接受的,因為每次修改都需要對全系統改動一次,不但工作量上大大增加,同時風險也是大大增加。?
而面向對象正是為了解決面向過程的這個缺點兒誕生的,因此面向對象其實也不是什么復雜和玄妙的技術,面向對象思想的核心是“可擴展性”!?
注:中文“可擴展性”對應英文有兩種解釋:extensibility?和?scalability,extensibility指系統需求變化后,能夠比較容易的擴展以支持新需求;scalability指系統訪問壓力增加后,能夠通過簡單的增加更多硬件設備以支撐訪問壓力,又翻譯為“可伸縮性”。?本文的可擴展性是指extensibility。
**面向對象應用范圍**
能做什么?
既然面向對象思想的核心是“可擴展性”,那么其適用范圍就顯而易見了:經常變化的地方就是面向對象應用的地方。?
對于軟件系統來說,常見的可變的主要集中在客戶需求部分,而不變的一般都是屬于計算機系統的基礎。?
因此,操作系統、數據庫、協議(TCP、3GPP等)這些并不適合面向對象大展身手,因為這些基礎軟件一般都比較穩定(相對穩定,并不是不變)。而對于企業應用、互聯網等應用,需求經常變更,功能不斷擴展,這正是面向對象大展身手的地方。
?
不能做什么?
下圖是一個軟件質量屬性的全圖:?
?
大家可以看到,“可擴展性”只是軟件質量屬性中很小的一部分,其它的屬性都不是面向對象能夠解決的。?
明白了面向對象的特點和適用范圍,是應用面向對象的關鍵,經過前面的分析,我們知道,面向對象不是瑞士軍刀,而只是一個普通的錘子而已,千萬不要拿著錘子到處敲!
- 前言
- (1) - 程序設計思想的發展
- (2) - 面向對象語言發展歷史
- (3) - 面向過程 vs 面向對象
- (4) - 面向對象是瑞士軍刀還是一把錘子?
- (5) - 面向對象迷思:面向對象導致性能下降?
- (6) - 不要說你懂“類”
- (7) - “對象”新解
- (8) - “接口” 詳解
- (9) - “抽象類” 詳解
- (10) - “抽象” 詳解
- (11) - “封裝” 詳解
- (12) - “繼承” 詳解
- (13) - “多態” 詳解
- (14) - 面向對象開發技術流程
- (15) - 需求詳解
- (16) - 需求分析終極目的
- (17) - 需求分析518方法
- (18) - 用例分析
- (19) - 功能點提取
- (20) - 用例圖的陷阱
- (21) - SSD
- (22) - 領域模型
- (23) - 領域建模三字經
- (24) - 設計模型
- (25) - 類模型
- (26) - 類模型三板斧
- (27) - 動態模型設計
- (28) - 設計原則:內聚&耦合
- (29) - 高內聚低耦合
- (30) - SRP原則
- (31) - OCP原則
- (32) - LSP原則
- (33) - ISP原則
- (34) - DIP原則
- (35) - NOP原則
- (36) - 設計原則如何用?
- (37) - 設計模式:瑞士軍刀 or 錘子?
- (38) - 設計模式之道
- (39) - 設計原則 vs 設計模式
- (40) - DECORATOR模式
- (完)- 書籍已經出版