## 連載:面向對象葵花寶典:思想、技巧與實踐(6) - 不要說你懂“類”
方以類聚,物以群分——《周易?易傳》。?
類是面向對象領域里最基礎的一個概念,也是面向對象分析和設計的基石。?
然而,如此重要的一個概念,竟然很難找到深入的說明,絕大部分介紹面向對象的書籍或者資料基本上都是這么解釋的:“類是一組對象的抽象”,這個解釋看起來清晰明了,但實際上犯了一個邏輯上的錯誤:以未明確的概念來解釋待明確的概念,什么是對象,什么是抽象,我們都還不知道,你卻用這個概念來解釋類?那當然看不懂了。?
還有另外一個解釋:類就是屬性和方法的集合!甚至還會給出如下這樣的樣例:
~~~
Class?Person{
Int??age;
String??name;
Void?play();
}
~~~
這種解釋深究一下,其實很容易發現其犯了本末倒置的錯誤:類是本,代碼是末,只有清晰地掌握了類的概念,才能寫出好的代碼。否則,即使寫出了代碼,也是一堆爛代碼。
?
那究竟何為類呢??
其實,拋開面向對象,拋開程序開發,即使在我們的現實世界中,類也是無處不在的:
古語云:?物以類聚,人以群分,這里的“類”,其實和面向對象中的“類”的邏輯含義并無不同。
我們的生物學將生物分為動物、植物、微生物等種類,這里的“類”,和面向對象中的類概念也是一致的。?
因此,當我們在定義什么才是“類”的時候,其實完全不需要和面向對象扯上關系。簡單來說,**類就是一組相似事物的統稱**。?
這個定義看起來再簡單不過了,但為了避免在實踐過程中設計不合理的類,我們還要深挖背后的玄機,玄機在哪里呢?
?
玄機就在定義里面,我們來認真分析一下定義:
首先:請看“一組”,思考一下為什么是“一組”,不是“一個”?
其次:請看“相似”,思考一下為什么是“相似”,不是“相同”?
最后:請看“統稱”,思考一下為什么是“統稱”,不是“名稱”??
第一個玄機——“一組”:一組的玄機在于“多個“,單個事物無法成為類。
一個很簡單的例子:“人“可以是一類,但“我”就不是一個類(那又是什么呢,請看后文分解?)?
第二個玄機——“相似”:相似的玄機在于“比較像,但不完全相同”。
還是“人”這個例子:奧巴馬和克林頓都是美國總統,都是人,有很多相似的地方,但他們兩個絕對不是完全相同的。?
第三個玄機——“統稱”:統稱的玄機在于“統”,也可以叫做“通稱”,統稱要能夠概括這多個事物。
還是上一個例子:奧巴馬和克林頓的統稱可以為“人”、“男人”、“總統”,但不會統稱為“奧巴馬”,因為奧巴馬是一個具體的人了。?
類的定義玄機我們已經基本解讀,看起來已經比較清晰了,但不要高興太早,還有一個更大的玄機:我們怎么劃分類?
?
一個很簡單的問題:你和我是一類么?
。。。應該是:)
再一個簡單的問題:你和豬是一類么?
你肯定會跳起來:我怎么和豬是一類呢?
但我要說,我們和豬確實是一類,我們都是“哺乳動物“。
再一個簡單的問題:你和松樹是一類么?
這次你可能學乖了:也是一類,都是“生物“。
。。。。。。
到這里你可能已經迷惑了“到底我和什么是一類“?
這個問題引出了類最重要的一個玄機:“如何定義類“??
其實答案就隱藏在我們前面的問題中:“只要有相似點的就是同一類“!
我和你都是一類,是因為我們都是“人“;
你和豬是一類,是因為都是“哺乳動物“;
你和樹一類,是因為都是“生物“;
。。。。。。
?
但這樣又引出另外一個問題:如果只要有相似點就是同一類,那么最后是不是只要用一個類“事物”或者“東西”就可以了呢,干嘛還用得著分那么多類么?
萬法歸一,所有的事物當然最后都可以歸為一類(例如在Java中就有一個大一統的類Class),但這顯然遠遠不能滿足我們的要求,實際應用中我們肯定需要不同的、多種多樣的類,那么具體如何操作呢??
有一句廣告詞可以很好的概括:角度決定看法!
也就是說:站在你的觀察角度,能夠看到相似點就是同一類!
當你觀察人時,我和你是一類,但你和豬就不是一類了;
當你觀察動物時,我、你、豬都是一類,但樹就不是了;
當你觀察生物時,我、你、豬、樹都是一類
。。。。。。。
所以最后我們總結一下如何劃分類:**站在你的觀察角度,具有相似點的事物就是同一類**!
- 前言
- (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模式
- (完)- 書籍已經出版