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


連載:麵向對象葵花寶典:思想、技巧與實踐(28) - 設計原則:內聚&耦合

前麵通過實例講解了一個一環扣一環的麵向對象的開發流程:用例模型 -> 領域模型 -> 設計模型(類模型 + 動態模型),解答了麵向對象如何做的問題。接下來我們就要講“如何做好麵向對象設計”的技巧了


===================================================================

【內聚】

參考維基百科的解釋,內聚的含義如下:

cohesion refers to the degree to which the elements of a module belong together.

(https://en.wikipedia.org/wiki/Cohesion_(computer_science))

翻譯一下即:內聚指一個模塊內部元素彼此結合的緊密程度

 

看起來很好理解,但深入思考一下,其實沒有那麼簡單。

首先:“模塊”如何理解?

你一定會說,“模塊”當然就是我們所說的係統裏的“XX模塊”了,例如一個ERP係統的“權限”模塊,一個電子商務的“支付”模塊,一個論壇網站的“用戶管理”模塊。。。。。。等等

 

你說的沒錯,但在麵向對象領域,談到“內聚”的時候,模塊的概念遠遠不止我們通常所理解的“係統內的某個模塊”這個範圍,而是可大可小,大到一個子係統,小到一個函數,你都可以理解為內聚裏所說的“模塊”。

 

所以,你可以用“內聚”來判斷一個函數設計是否合理,一個類設計是否合理,一個接口設計是否合理,一個包設計是否合理,一個模塊/子係統設計是否合理。

 

其次:“元素”究竟是什麼?

有了前麵對“模塊”的深入研究後,元素的含義就比較容易明確了(不同語言稍有不同)。

函數:函數的元素就是“代碼”

類/接口:類的元素是“函數、屬性”

包:包的元素是“類、接口、全局數據”等

模塊:模塊的元素是“包、命名空間”等

 

再次:“結合”是什麼?

英文的原文是“belong”,有“屬於”的意思,翻譯成中文“結合”,更加貼近中文的理解。但“結合”本身這個詞容易引起誤解。絕大部分人看到“結合”這個單詞,想到的肯定是“你中有我、我中有你”這樣的含義,甚至可能會聯想到“美女和帥哥”的結合,抑或“青蛙王子和公主”的結合這種情況。

這樣的理解本身也並沒有錯,但比較狹隘。

我們以類的設計為例:假如一個類裏麵的函數都是隻依賴本類其它函數(當然不能循環調用啦),那內聚性肯定是最好的,因為“結合”得很緊密。

 

但如果這個類的函數並不依賴本類的函數呢?我們就一定能說這個類的內聚性不好麼?

其實也不盡然,最常見的就是CRUD操作類,這幾個函數相互之間沒有任何結合關係(某些設計可能會先查詢再修改,但這樣的設計不是事務安全的),但其實這幾個函數的內聚性非常高。

 

所以,關於內聚的結合概念,我認為不是非常恰當的描述。那麼,就究竟什麼才是真正的“內聚”呢?

答案就藏在顯而易見的地方,翻開你的詞典,仔細看看cohesion的含義,你會看到另外一個解釋:凝聚力!

 

“凝聚力”就是“內聚”的核心思想,拋開麵向對象不談,我們日常工作中幾乎隨處可見“凝聚力”:

你可能會說,你的團隊很有凝聚力。。。。。。

領導可能會說:我們要增強團隊的凝聚力。。。。。。

成功學大師會說:凝聚力是一個團隊成功的基石。。。。。。。

 

麵向對象領域的“凝聚力”,和團隊的“凝聚力”是一樣的概念。

l 判斷團隊凝聚力時,我們關注團隊成員是否都專注於團隊的目標;判斷麵向對象模塊的凝聚力時,我們同樣關注元素是否專注於模塊的目標,即:模塊本身的職責!

l 判斷團隊凝聚力時,我們還會關注團隊成員之間是否互相吸引和幫助;判斷麵向對象模塊凝聚力時,我們同樣關注元素間的結合關係;

 

雖然判斷內聚性的時候我們會考慮元素的結合情況,但其實是否專注模塊的職責,才是內聚性的充要條件

當模塊的元素全部都專注於模塊的職責的時候,即使元素間的結合不是很緊密,也是符合內聚性的要求的,這也是CRUD設計符合內聚性的原因。

 

所以,判斷一個模塊(函數、類、包、子係統)“內聚性”的高低,最重要的是關注模塊的元素是否都忠於模塊的職責,簡單來說就是“不要掛羊頭賣狗肉”


【耦合】

參考維基百科,耦合的定義如下:

 coupling or dependency is the degree to which each program module relies on each one of the other modules

(https://en.wikipedia.org/wiki/Coupling_(computer_science))

簡單翻譯一下:耦合(或者稱依賴)是程序模塊相互之間的依賴程度。

 

從定義來看,耦合和內聚是相反的:內聚關注模塊內部的元素結合程度,耦合關注模塊之間的依賴程度

 

理解耦合的關鍵有兩點:什麼是模塊,什麼是依賴。

 

什麼是模塊?

模塊和內聚裏麵提到的模塊一樣,耦合中的模塊其實也是可大可小。常見的模塊有:函數、類、包、子模塊、子係統等

 

什麼是依賴?

依賴這個詞很好理解,通俗的講就是某個模塊用到了另外一個模塊的一些元素

例如:A類使用了B類作為參數,A類的函數中使用了B類來完成某些功能。。。。。。等等


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


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

  上一篇:go 九度題目1530:最長不重複子串
  下一篇:go java base64編碼和解碼的三種方式