軟件設(shè)計(jì)之高內(nèi)聚低耦合

內(nèi)聚(Cohesion)是一個(gè)模塊內(nèi)部各成分之間相關(guān)聯(lián)程度的度量。耦合(Coupling)是模塊之間依賴程度的度量。內(nèi)聚和耦合是密切相關(guān)的,與其它模塊存在強(qiáng)耦合的模塊通常意味著弱內(nèi)聚,而強(qiáng)內(nèi)聚的模塊通常意味著與其它模塊之間存在弱耦合。模塊設(shè)計(jì)追求強(qiáng)內(nèi)聚,弱耦合。

一、什么是耦合度

軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚度作為衡量模塊獨(dú)立程度的標(biāo)準(zhǔn)。劃分摸塊的一個(gè)準(zhǔn)則就是高內(nèi)聚低耦合。 耦合度(Coupling)是對(duì)模塊間關(guān)聯(lián)程度的度量。耦合的強(qiáng)弱取決與模塊間接口的復(fù)雜性、調(diào)用模塊的方式以及通過界面?zhèn)魉蛿?shù)據(jù)的多少。 模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強(qiáng),同時(shí)表明其獨(dú)立性越差。降低模塊間的耦合度能減少模塊間的影響,防止對(duì)某一模塊修改所引起的“牽一發(fā)動(dòng)全身”的水波效應(yīng),保證系統(tǒng)設(shè)計(jì)順利進(jìn)行。 內(nèi)聚和耦合密切相關(guān),同其它模塊存在強(qiáng)耦合關(guān)系的模塊常意味這弱內(nèi)聚,強(qiáng)內(nèi)聚常意味著弱耦合。

耦合度就是某模塊(類)與其它模塊(類)之間的關(guān)聯(lián)、感知和依賴的程度,是衡量代碼獨(dú)立性的一個(gè)指標(biāo),也是軟件工程設(shè)計(jì)及編碼質(zhì)量評(píng)價(jià)的一個(gè)標(biāo)準(zhǔn)。耦合的強(qiáng)度依賴于以下幾個(gè)因素:

(1)一個(gè)模塊對(duì)另一個(gè)模塊的調(diào)用;

(2)一個(gè)模塊向另一個(gè)模塊傳遞的數(shù)據(jù)量;

(3)一個(gè)模塊施加到另一個(gè)模塊的控制的多少;

(4)模塊之間接口的復(fù)雜程度。

1、內(nèi)聚強(qiáng)度

內(nèi)聚按強(qiáng)度從低到高有以下幾種類型:

(1) 偶然內(nèi)聚。如果一個(gè)模塊的各成分之間毫無關(guān)系,則稱為偶然內(nèi)聚。

(2) 邏輯內(nèi)聚。幾個(gè)邏輯上相關(guān)的功能被放在同一模塊中,則稱為邏輯內(nèi)聚。如一個(gè)模塊讀取各種不同類型外設(shè)的輸入。盡管邏輯內(nèi)聚比偶然內(nèi)聚合理一些,但邏輯內(nèi)聚的模塊各成分在功能上并無關(guān)系,即使局部功能的修改有時(shí)也會(huì)影響全局,因此這類模塊的修改也比較困難。

(3) 時(shí)間內(nèi)聚。如果一個(gè)模塊完成的功能必須在同一時(shí)間內(nèi)執(zhí)行(如系統(tǒng)初始化),但這些功能只是因?yàn)闀r(shí)間因素關(guān)聯(lián)在一起,則稱為時(shí)間內(nèi)聚。

(4) 過程內(nèi)聚。如果一個(gè)模塊內(nèi)部的處理成分是相關(guān)的,而且這些處理必須以特定的次序執(zhí)行,則稱為過程內(nèi)聚。

(5) 通信內(nèi)聚。如果一個(gè)模塊的所有成分都操作同一數(shù)據(jù)集或生成同一數(shù)據(jù)集,則稱為通信內(nèi)聚。

(6) 順序內(nèi)聚。如果一個(gè)模塊的各個(gè)成分和同一個(gè)功能密切相關(guān),而且一個(gè)成分的輸出作為另一個(gè)成分的輸入,則稱為順序內(nèi)聚。

(7) 功能內(nèi)聚。模塊的所有成分對(duì)于完成單一的功能都是必須的,則稱為功能內(nèi)聚。

2、耦合強(qiáng)度

耦合的強(qiáng)度依賴于以下幾個(gè)因素:(1)一個(gè)模塊對(duì)另一個(gè)模塊的調(diào)用;(2)一個(gè)模塊向另一個(gè)模塊傳遞的數(shù)據(jù)量;(3)一個(gè)模塊施加到另一個(gè)模塊的控制的多少;(4)模塊之間接口的復(fù)雜程度。

耦合按從強(qiáng)到弱的順序可分為以下幾種類型:

(1)內(nèi)容耦合。當(dāng)一個(gè)模塊直接修改或操作另一個(gè)模塊的數(shù)據(jù),或者直接轉(zhuǎn)入另一個(gè)模塊時(shí),就發(fā)生了內(nèi)容耦合。此時(shí),被修改的模塊完全依賴于修改它的模塊。

(2)公共耦合。兩個(gè)以上的模塊共同引用一個(gè)全局?jǐn)?shù)據(jù)項(xiàng)就稱為公共耦合。

(3)控制耦合。一個(gè)模塊在界面上傳遞一個(gè)信號(hào)(如開關(guān)值、標(biāo)志量等)控制另一個(gè)模塊,接收信號(hào)的模塊的動(dòng)作根據(jù)信號(hào)值進(jìn)行調(diào)整,稱為控制耦合。

(4)標(biāo)記耦合。模塊間通過參數(shù)傳遞復(fù)雜的內(nèi)部數(shù)據(jù)結(jié)構(gòu),稱為標(biāo)記耦合。此數(shù)據(jù)結(jié)構(gòu)的變化將使相關(guān)的模塊發(fā)生變化。

(5)數(shù)據(jù)耦合。模塊間通過參數(shù)傳遞基本類型的數(shù)據(jù),稱為數(shù)據(jù)耦合。

(6)非直接耦合。模塊間沒有信息傳遞時(shí),屬于非直接耦合。
如果模塊間必須存在耦合,就盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共耦合的范圍,堅(jiān)決避免使用內(nèi)容耦合。

二、為什么要低耦合

了解什么是耦合及耦合的分類后,我想大家對(duì)為什么要降低耦合度已經(jīng)有一定的認(rèn)識(shí),并且多數(shù)開發(fā)人員也大概嘗盡了高耦合帶來的苦頭。道理很簡單,耦合度很高的情況下,維護(hù)代碼時(shí)修改一個(gè)地方會(huì)牽連到很多地方,如果修改時(shí)沒有理清這些耦合關(guān)系,那么帶來的后果可能會(huì)是災(zāi)難性的,特別是對(duì)于需求變化較多以及多人協(xié)作開發(fā)維護(hù)的項(xiàng)目,修改一個(gè)地方會(huì)引起本來已經(jīng)運(yùn)行穩(wěn)定的模塊錯(cuò)誤,嚴(yán)重時(shí)會(huì)導(dǎo)致惡性循環(huán),問題永遠(yuǎn)改不完,開發(fā)和測試都在各種問題之間奔波勞累,最后導(dǎo)致項(xiàng)目延期,用戶滿意度降低,成本也增加了,這對(duì)用戶和開發(fā)商影響都是很惡劣的,各種風(fēng)險(xiǎn)也就不言而喻了。

為了預(yù)防這些問題的發(fā)生,其中一個(gè)重要手段就是降低代碼的耦合度。但也不可能有絕對(duì)的零耦合,比如基于J2EE編程那就必須和JDK耦合,而且高耦合也不是一無是處,如果在設(shè)計(jì)前期預(yù)料到某功能后期基本不用修改,那么即使高耦合了也關(guān)系不大。但是,在還沒有能力設(shè)計(jì)出基本不用修改的代碼前,還得要求以低耦合為標(biāo)準(zhǔn)。那么怎樣才能最大限度地降低耦合度呢?下面介紹降低耦合度的幾種方法。

三、降低耦合度的方法

1、少使用類的繼承,多用接口隱藏實(shí)現(xiàn)的細(xì)節(jié)。 Java面向?qū)ο缶幊桃虢涌诔酥С侄鄳B(tài)外, 隱藏實(shí)現(xiàn)細(xì)節(jié)也是其中一個(gè)目的。

2、模塊的功能化分盡可能的單一,道理也很簡單,功能單一的模塊供其它模塊調(diào)用的機(jī)會(huì)就少。(其實(shí)這是高內(nèi)聚的一種說法,高內(nèi)聚低耦合一般同時(shí)出現(xiàn),為了限制篇幅,我們將在以后的版期中討論)。

3、遵循一個(gè)定義只在一個(gè)地方出現(xiàn)。

4、少使用全局變量。

5、類屬性和方法的聲明少用public,多用private關(guān)鍵字,

6、多用設(shè)計(jì)模式,比如采用MVC的設(shè)計(jì)模式就可以降低界面與業(yè)務(wù)邏輯的耦合度。

7、盡量不用“硬編碼”的方式寫程序,同時(shí)也盡量避免直接用SQL語句操作數(shù)據(jù)庫。

8、最后當(dāng)然就是避免直接操作或調(diào)用其它模塊或類(內(nèi)容耦合);如果模塊間必須存在耦合,原則上盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共耦合的范圍,避免使用內(nèi)容耦合。

內(nèi)聚: 故名思議,表示內(nèi)部間聚集、關(guān)聯(lián)的長度,那么高內(nèi)聚就是指要高度的聚集和關(guān)聯(lián)。

高內(nèi)聚:類與類之間的關(guān)系而定,高,意思是他們之間的關(guān)系要簡單,明了,不要有很強(qiáng)的關(guān)系,不然,運(yùn)行起來就會(huì)出問題。一個(gè)類的運(yùn)行影響到其他的類。由于高內(nèi)聚具備魯棒性,可靠性,可重用性,可讀性等優(yōu)點(diǎn),模塊設(shè)計(jì)推薦采用高內(nèi)聚。

這是軟件工程中的概念,是判斷設(shè)計(jì)好壞的標(biāo)準(zhǔn),主要是面向OO的設(shè)計(jì),主要是看類的內(nèi)聚性是否高,偶合度是否低

“高內(nèi)聚,低耦合”,首先要知道一個(gè)軟件是由多個(gè)子程序組裝而成,而一個(gè)程序由多個(gè)模塊(方法)構(gòu)成!“高內(nèi)聚,低耦合”主要是闡述的面向?qū)ο笙到y(tǒng)中,各個(gè)類需要職責(zé)分離的思想。 每一個(gè)類完成特定的獨(dú)立的功能,這個(gè)就是高內(nèi)聚。耦合就是類之間的互相調(diào)用關(guān)系,如果耦合很強(qiáng),互相牽扯調(diào)用很多,那么會(huì)牽一發(fā)而動(dòng)全身,不利于維護(hù)和擴(kuò)展。

類之間的設(shè)置應(yīng)該要低耦合,但是每個(gè)類應(yīng)該要高內(nèi)聚.耦合是類之間相互依賴的尺度.如果每個(gè)對(duì)象都有引用其它所有的對(duì)象,那么就有高耦合,這是不合乎要求的,因?yàn)樵趦蓚€(gè)對(duì)象之間,潛在性地流動(dòng)了太多信息.低耦合是合乎要求的:它意味著對(duì)象彼此之間更獨(dú)立的工作.低耦合最小化了修改一個(gè)類而導(dǎo)致也要修改其它類的”連鎖反應(yīng)”. 內(nèi)聚是一個(gè)類中變量與方法連接強(qiáng)度的尺度.高內(nèi)聚是值得要的,因?yàn)樗馕吨惪梢愿玫貓?zhí)行一項(xiàng)工作.低內(nèi)聚是不好的,因?yàn)樗砻黝愔械脑刂g很少相關(guān).成分之間相互有關(guān)聯(lián)的模塊是合乎要求的.每個(gè)方法也應(yīng)該高內(nèi)聚.大多數(shù)的方法只執(zhí)行一個(gè)功能.不要在方法中添加’額外’的指令,這樣會(huì)導(dǎo)致方法執(zhí)行更多的函數(shù).

推廣開來說,這個(gè)思想并不限于類與類之間的關(guān)系。模塊和模塊,子系統(tǒng)之間也都要遵守這個(gè)原則,才可以設(shè)計(jì)出延展性比較強(qiáng)的系統(tǒng)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)聚(Cohesion)是一個(gè)模塊內(nèi)部各成分之間相關(guān)聯(lián)程度的度量。耦合(Coupling)是模塊之間依賴程度的度量...
    whuangxm閱讀 1,076評(píng)論 0 0
  • 面向?qū)ο笤瓌t:高內(nèi)聚、低耦合。多聚合、少繼承 2017年12月18日 19:28:38 望崖 閱讀數(shù) 13358 ...
    Rainysong閱讀 1,238評(píng)論 0 1
  • 前言 高內(nèi)聚低耦合,是軟件工程中的概念,是判斷設(shè)計(jì)好壞的標(biāo)準(zhǔn),主要是面向?qū)ο蟮脑O(shè)計(jì),看類的內(nèi)聚性是否高,耦合度是否...
    王永迪閱讀 3,398評(píng)論 1 13
  • 原文地址 前言 高內(nèi)聚低耦合,是軟件工程中的概念,是判斷設(shè)計(jì)好壞的標(biāo)準(zhǔn),主要是面向?qū)ο蟮脑O(shè)計(jì),看類的內(nèi)聚性是否高,...
    精神病患者link常閱讀 1,294評(píng)論 1 0
  • 概述內(nèi)聚是從功能角度來度量模塊內(nèi)的聯(lián)系,一個(gè)好的內(nèi)聚模塊應(yīng)當(dāng)恰好做一件事。它描述的是模塊內(nèi)的功能聯(lián)系;耦合是軟件結(jié)...
    人總要靠自己_趁年輕去努力閱讀 4,171評(píng)論 1 14

友情鏈接更多精彩內(nèi)容