閱讀986 返回首頁    go 技術社區[雲棲]


連載:麵向對象葵花寶典:思想、技巧與實踐(6) - 不要說你懂“類”

方以類聚,物以群分——《周易 易傳》。 


類是麵向對象領域裏最基礎的一個概念,也是麵向對象分析和設計的基石。 

然而,如此重要的一個概念,竟然很難找到深入的說明,絕大部分介紹麵向對象的書籍或者資料基本上都是這麼解釋的:“類是一組對象的抽象”,這個解釋看起來清晰明了,但實際上犯了一個邏輯上的錯誤:以未明確的概念來解釋待明確的概念,什麼是對象,什麼是抽象,我們都還不知道,你卻用這個概念來解釋類?那當然看不懂了。 

還有另外一個解釋:類就是屬性和方法的集合!甚至還會給出如下這樣的樣例:

Class Person{

Int  age;

String  name;

Void play();

}

這種解釋深究一下,其實很容易發現其犯了本末倒置的錯誤:類是本,代碼是末,隻有清晰地掌握了類的概念,才能寫出好的代碼。否則,即使寫出了代碼,也是一堆爛代碼。

 

那究竟何為類呢? 

其實,拋開麵向對象,拋開程序開發,即使在我們的現實世界中,類也是無處不在的:

古語雲: 物以類聚,人以群分,這裏的“類”,其實和麵向對象中的“類”的邏輯含義並無不同。

我們的生物學將生物分為動物、植物、微生物等種類,這裏的“類”,和麵向對象中的類概念也是一致的。 

因此,當我們在定義什麼才是“類”的時候,其實完全不需要和麵向對象扯上關係。簡單來說,類就是一組相似事物的統稱 

這個定義看起來再簡單不過了,但為了避免在實踐過程中設計不合理的類,我們還要深挖背後的玄機,玄機在哪裏呢?

 

玄機就在定義裏麵,我們來認真分析一下定義:

首先:請看“一組”,思考一下為什麼是“一組”,不是“一個”?

其次:請看“相似”,思考一下為什麼是“相似”,不是“相同”?

最後:請看“統稱”,思考一下為什麼是“統稱”,不是“名稱”? 

第一個玄機——“一組”:一組的玄機在於“多個“,單個事物無法成為類。

一個很簡單的例子:“人“可以是一類,但“我”就不是一個類(那又是什麼呢,請看後文分解?) 

第二個玄機——“相似”:相似的玄機在於“比較像,但不完全相同”。

還是“人”這個例子:奧巴馬和克林頓都是美國總統,都是人,有很多相似的地方,但他們兩個絕對不是完全相同的。 

第三個玄機——“統稱”:統稱的玄機在於“統”,也可以叫做“通稱”,統稱要能夠概括這多個事物。

還是上一個例子:奧巴馬和克林頓的統稱可以為“人”、“男人”、“總統”,但不會統稱為“奧巴馬”,因為奧巴馬是一個具體的人了。 

類的定義玄機我們已經基本解讀,看起來已經比較清晰了,但不要高興太早,還有一個更大的玄機:我們怎麼劃分類?

 

一個很簡單的問題:你和我是一類麼?

。。。應該是:)

再一個簡單的問題:你和豬是一類麼?

你肯定會跳起來:我怎麼和豬是一類呢?

但我要說,我們和豬確實是一類,我們都是“哺乳動物“。

再一個簡單的問題:你和鬆樹是一類麼?

這次你可能學乖了:也是一類,都是“生物“。

。。。。。。

到這裏你可能已經迷惑了“到底我和什麼是一類“?

這個問題引出了類最重要的一個玄機:“如何定義類“? 

其實答案就隱藏在我們前麵的問題中:“隻要有相似點的就是同一類“!

我和你都是一類,是因為我們都是“人“;

你和豬是一類,是因為都是“哺乳動物“;

你和樹一類,是因為都是“生物“;

。。。。。。

 

但這樣又引出另外一個問題:如果隻要有相似點就是同一類,那麼最後是不是隻要用一個類“事物”或者“東西”就可以了呢,幹嘛還用得著分那麼多類麼?

萬法歸一,所有的事物當然最後都可以歸為一類(例如在Java中就有一個大一統的類Class),但這顯然遠遠不能滿足我們的要求,實際應用中我們肯定需要不同的、多種多樣的類,那麼具體如何操作呢? 

有一句廣告詞可以很好的概括:角度決定看法

也就是說:站在你的觀察角度,能夠看到相似點就是同一類!

當你觀察人時,我和你是一類,但你和豬就不是一類了;

當你觀察動物時,我、你、豬都是一類,但樹就不是了;

當你觀察生物時,我、你、豬、樹都是一類

。。。。。。。

所以最後我們總結一下如何劃分類:站在你的觀察角度,具有相似點的事物就是同一類


==================================================
轉載請注明出處:https://blog.csdn.net/yunhua_lee/article/details/17562283
==================================================

最後更新:2017-04-03 12:53:56

  上一篇:go googe眼鏡開發
  下一篇:go Pelican + Github 搭建自己的靜態博客