面向對象開發原則.高內聚.低耦合

面向對象開發原則.高內聚.低耦合

軟件設計中通常用耦合度和內聚度作爲衡量模塊獨立程度的標準。劃分摸塊的一個準則就是高內聚低耦合。

這是軟件工程中的概念,是判斷設計好壞的標準,主要是面向OO的設計,主要是看類的內聚性是否高,偶合度是否低.

每一個類完成特定的獨立的功能,這個就是高內聚。耦合就是類之間的互相調用關係,如果耦合很強,互相牽扯調用很多,那麼會牽一髮而動全身,不利於維護和擴展。

類之間的設置應該要低耦合,但是每個類應該要高內聚.耦合是類之間相互依賴的尺度.如果每個對象都有引用其它所有的對象,那麼就有高耦合,這是不合乎要求的,因爲在兩個對象之間,潛在性地流動了太多信息.低耦合是合乎要求的:它意味着對象彼此之間更獨立的工作.低耦合最小化了修改一個類而導致也要修改其它類的”連鎖反應”. 內聚是一個類中變量與方法連接強度的尺度.高內聚是值得要的,因爲它意味着類可以更好地執行一項工作.低內聚是不好的,因爲它表明類中的元素之間很少相關.成分之間相互有關聯的模塊是合乎要求的.每個方法也應該高內聚.大多數的方法只執行一個功能.不要在方法中添加’額外’的指令,這樣會導致方法執行更多的函數.

推廣開來說,這個思想並不限於類與類之間的關係。模塊和模塊,子系統之間也都要遵守這個原則,纔可以設計出延展性比較強的系統。

什麼是耦合

定義

耦合性也稱塊間聯繫。指軟件系統結構中各模塊間相互聯繫緊密程度的一種度量。模塊之間聯繫越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決於模塊間接口的複雜性、調用的方式及傳遞的信息。

耦合度就是某模塊(類)與其它模塊(類)之間的關聯、感知和依賴的程度,是衡量代碼獨立性的一個指標,也是軟件工程設計
及編碼質量評價的一個標準。耦合的強度依賴於以下幾個因素:
(1)一個模塊對另一個模塊的調用;
(2)一個模塊向另一個模塊傳遞的數據量;
(3)一個模塊施加到另一個模塊的控制的多少;
(4)模塊之間接口的複雜程度。

耦合分類

耦合按從強到弱的順序可分爲以下幾種類型:
a)非直接耦合:兩模塊間沒有直接關係,之間的聯繫完全是通過主模塊的控制和調用來實現的   
b)數據耦合:指兩個模塊之間有調用關係,傳遞的是簡單的數據值,相當於高級語言的值傳遞; 
c)標記耦合:指兩個模塊之間傳遞的是數據結構,如高級語言中的數組名、記錄名、文件名等這些名字即標記,其實傳遞的是這個數據結構的地址;  
d)控制耦合:一指一個模塊調用另一個模塊時,傳遞的是控制變量(如開關、標誌等),被調模塊通過該控制變量的值有選擇地執行塊內某一功能; 
e)外部耦合:一組模塊都訪問同一全局簡單變量而不是同一全局數據結構,而且不是通過參數傳遞該全局變量的信息   
f)公共耦合:一組模塊都訪問同一個公共數
據環境。該公共數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等。   
g)內容耦合:這是最高程度的耦合,也是最差的耦合。當一個模塊直接使用另一個模塊的內部數據,或通過非正常入口而轉入另一個模塊內部。

爲什麼要低耦合(解耦合)

在面向對象編程中,對象自身是內聚的,是保管好自己的數據,完成好自己的操作的,而對外界呈現出自己的狀態和行爲。但是,沒有絕對的自力更生,對外開放也是必要的!一個對象,往往需要跟其他對象打交道,既包括獲知其他對象的狀態,也包括仰賴其他對象的行爲,而一旦這樣的事情發生時,我們便稱該對象依賴於另一對象。只要兩個對象之間存在一方依賴一方的關係,那麼我們就稱這兩個對象之間存在耦合。 比如媽媽和baby,媽媽要隨時關注baby的睡、醒、困、哭、尿等等狀態,baby則要仰賴媽媽的餵奶、哄睡、換紙尿褲等行爲,從程序的意義上說,二者互相依賴,因此也存在耦合。首先要說,耦合是必要的。

耦合的程度就是耦合度,也就是雙方依賴的程度。上文所說的媽媽和baby就是強耦合。而你跟快遞小哥之間則是弱耦合。一般來說耦合度過高並不是一件好事。就拿作爲IT精英的你來說吧,上級隨時敦促你的工作進度,新手頻繁地需要你指導問題,隔三差五還需要參加酒局飯局,然後還要天天看領導的臉色、關注老婆的心情,然後你還要關注代碼中的bug 、bug、bug,和需求的變化、變化、變化,都夠焦頭爛額了,還猝不及防的要關注眼睛、頸椎、前列腺和頭髮的狀態,然後你再炒個股,這些加起來大概就是個強耦合了。從某種意義上來說,耦合天生就與自由爲敵,無論是其他對象依賴於你,還是你依賴其他對象。比如有人嗜煙、酗酒,你有多依賴它們就有多不自由;比如有人家裏生了七八個娃,還有年邁的父母、岳父母,他們有多依賴你,你就有多不自由。所以老子這樣講:“五音令人耳聾,五色令人目盲,馳騁狩獵令人心發狂,難得之貨令人行妨。”盧梭也是不無悲涼的說“人生而自由,卻又無往而不在枷鎖中”。因此,要想自由,就必須要降低耦合,而這個過程就叫做解耦和。

耦合度很高的情況下,維護代碼時修改一個地方會牽連到很多地方,如果修改時沒有理清這些耦合關係,那麼帶來的後果
可能會是災難性的,特別是對於需求變化較多以及多人協作開發維護的項目,修改一個地方會引起本來已經運行穩定的模塊錯誤,嚴重時會導致惡性循環,問題永遠改不完,開發和測試都在各種問題之間奔波勞累,最後導致項目延期,用戶滿意度降低,成本也增加了,這對用戶和開發商影響都是很惡劣的,各種風險也就不言而喻了。

如何降低耦合(解耦合)

  1. 少使用類的繼承,多用接口隱藏實現的細節。 Java面向對象編程引入接口除了支持多態外, 隱藏實現細節也是其中一個目的。
  2. 模塊的功能化分儘可能的單一,道理也很簡單,功能單一的模塊供其它模塊調用的機會就少。(其實這是高內聚的一種說法,高內聚低耦合一般同時出現,爲了限制篇幅,我們將在以後的版期中討論)。
  3. 遵循一個定義只在一個地方出現。
  4. 少使用全局變量。
  5. 類屬性和方法的聲明少用public,多用private關鍵字,
  6. 多用設計模式,比如採用MVC的設計模式就可以降低界面與業務邏輯的耦合度。
  7. 儘量不用“硬編碼”的方式寫程序,同時也儘量避免直接用SQL語句操作數據庫。
  8. 最後當然就是避免直接操作或調用其它模塊或類(內容耦合);如果模塊間必須存在耦合,原則上儘量使用數據耦合,少用控制耦合,
    限制公共耦合的範圍,避免使用內容耦合。

什麼是內聚

內聚,通俗的來講,就是自己的東西自己保管,自己的事情自己做。每個模塊儘可能獨立完成自己的功能,不依賴於模塊外部的代碼。

對象是什麼?對象就是保管好自己的東西,做好自己的事情的程序模塊——這就是內聚!當然,對象的內聚只是內聚的一個層次,在不同的尺度下其實都有內聚的要求,比如方法也要講內聚,架構也要講內聚。

內聚: 內聚性又稱塊內聯繫。指模塊的功能強度的度量,即一個模塊內部各個元素彼此結合的緊密程度的度量。若一個模塊內各元素(語名之間、程序段之間)聯繫的越緊密,則它的內聚性就越高。

高內聚:類與類之間的關係而定,高,意思是他們之間的關係要簡單,明瞭,不要有很強的關係,不然,運行起來就會出問題。一個類的運行影響到其他的類。由於高內聚具備魯棒性,可靠性,可重用性,可讀性等優點,模塊設計推薦採用高內聚。

內聚度是指內部各元素之間聯繫的緊密程度,模塊的內聚種類通常可分爲7種,按其內聚度從低
到高的次序依此爲:偶然內聚、邏輯內聚、瞬時內聚、過程內聚、通信內聚、順序內聚、功能內聚。

1 偶然內聚: 指一個模塊內的各處理元素之間沒有任何聯繫。
2 邏輯內聚: 指模塊內執行幾個邏輯上相似的功能,通過參數確定該模塊完成哪一個功能。
3 時間內聚: 把需要同時執行的動作組合在一起形成的模塊爲時間內聚模塊。
4 通信內聚: 指模塊內所有處理元素都在同一個數據結構上操作(有時稱之爲信息內聚),或者指各處理使用相同的輸入數據或者產生相同的輸出數據。
5 順序內聚: 指一個模塊中各個處理元素都密切相關於同一功能且必須順序執行,前一功能元素輸出就是下一功能元素的輸入。
6 功能內聚: 這是最強的內聚,指模塊內所有元素共同完成一個功能,缺一不可。與其他模塊的耦合是最弱的。

例子:

有個例子很容易明白:一個程序有50個函數,這個程序執行得非常好;然而一旦你修改其中一個函數,其他49個函數都需要做修改,這就是高耦合的後果。
一旦你理解了它,你編寫概要設計的時候設計類或者模塊自然會考慮到“高內聚,低耦合”。

可能也可以這樣理解:
高內聚相對的是方法的獨立性,減少外部(全局參數)的影響。低耦合相對的是方法的依賴性低,可用搭積木的方式構建程序。內聚類似積木,耦合類似蓋房子,而高內聚低耦合的方式是比較效率並個性化構建房屋的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章