什么是高內(nèi)聚泽示、低耦合?

概述
內(nèi)聚是從功能角度來度量模塊內(nèi)的聯(lián)系蜜氨,一個好的內(nèi)聚模塊應(yīng)當(dāng)恰好做一件事械筛。它描述的是模塊內(nèi)的功能聯(lián)系;
耦合是軟件結(jié)構(gòu)中各模塊之間相互連接的一種度量记劝,耦合強弱取決于模塊間接口的復(fù)雜程度变姨、進入或訪問一個模塊的點以及通過接口的數(shù)據(jù)。

定義

高內(nèi)聚低耦合厌丑,是軟件工程中的概念定欧,是判斷設(shè)計好壞的標(biāo)準(zhǔn),主要是面向?qū)ο蟮脑O(shè)計怒竿,主要是看類的內(nèi)聚性是否高砍鸠,耦合度是否低。

概念

耦合性:也稱塊間聯(lián)系耕驰。指軟件系統(tǒng)結(jié)構(gòu)中各模塊間相互聯(lián)系緊密程度的一種度量爷辱。模塊之間聯(lián)系越緊密,其耦合性就越強朦肘,模塊的獨立性則越差饭弓。模塊間耦合高低取決于模塊間接口的復(fù)雜性、調(diào)用的方式及傳遞的信息媒抠。

內(nèi)聚性:又稱塊內(nèi)聯(lián)系弟断。指模塊的功能強度的度量,即一個模塊內(nèi)部各個元素彼此結(jié)合的緊密程度的度量趴生。若一個模塊內(nèi)各元素(語名之間阀趴、程序段之間)聯(lián)系的越緊密昏翰,則它的內(nèi)聚性就越高。

所謂高內(nèi)聚是指一個軟件模塊是由相關(guān)性很強的代碼組成刘急,只負責(zé)一項任務(wù)棚菊,也就是常說的單一責(zé)任原則。

耦合:一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量叔汁。

對于低耦合统求,粗淺的理解是:一個完整的系統(tǒng),模塊與模塊之間攻柠,盡可能的使其獨立存在球订。也就是說后裸,讓每個模塊瑰钮,盡可能的獨立完成某個特定的子功能。模塊與模塊之間的接口微驶,盡量的少而簡單浪谴。如果某兩個模塊間的關(guān)系比較復(fù)雜的話,最好首先考慮進一步的模塊劃分因苹。這樣有利于修改和組合苟耻。

擴展

耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:

  1. 內(nèi)容耦合:一個模塊直接訪問另一模塊的內(nèi)容扶檐,則稱這兩個模塊為內(nèi)容耦合凶杖。
    若在程序中出現(xiàn)下列情況之一,則說明兩個模塊之間發(fā)生了內(nèi)容耦合:
    1). 一個模塊直接訪問另一個模塊的內(nèi)部數(shù)據(jù)款筑。
    2). 一個模塊不通過正常入口而直接轉(zhuǎn)入到另一個模塊的內(nèi)部智蝠。
    3). 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。
    4). 一個模塊有多個入口奈梳。
    內(nèi)容耦合可能在匯編語言中出現(xiàn)杈湾。大多數(shù)高級語言都已設(shè)計成不允許出現(xiàn)內(nèi)容耦合。這種耦合的耦合性最強攘须,模塊獨立性最弱漆撞。

  2. 公共耦合:一組模塊都訪問同一個全局?jǐn)?shù)據(jù)結(jié)構(gòu),則稱之為公共耦合于宙。公共數(shù)據(jù)環(huán)境可以是全局?jǐn)?shù)據(jù)結(jié)構(gòu)浮驳、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等捞魁。如果模塊只是向公共數(shù)據(jù)環(huán)境輸入數(shù)據(jù)至会,或是只從公共數(shù)據(jù)環(huán)境取出數(shù)據(jù),這屬于比較松散的公共耦合署驻;如果模塊既向公共數(shù)據(jù)環(huán)境輸入數(shù)據(jù)又從公共數(shù)據(jù)環(huán)境取出數(shù)據(jù)奋献,這屬于較緊密的公共耦合健霹。
    公共耦合會引起以下問題:
    1).無法控制各個模塊對公共數(shù)據(jù)的存取,嚴(yán)重影響了軟件模塊的可靠性和適應(yīng)性瓶蚂。
    2). 使軟件的可維護性變差糖埋。若一個模塊修改了公共數(shù)據(jù),則會影響相關(guān)模塊窃这。
    3). 降低了軟件的可理解性瞳别。不容易清楚知道哪些數(shù)據(jù)被哪些模塊所共享,排錯困難杭攻。
    一般地祟敛,僅當(dāng)模塊間共享的數(shù)據(jù)很多且通過參數(shù)傳遞很不方便時,才使用公共耦合兆解。

  3. 外部耦合:一組模塊都訪問同一全局簡單變量馆铁,而且不通過參數(shù)表傳遞該全局變量的信息,則稱之為外部耦合锅睛。

  4. 控制耦合:模塊之間傳遞的不是數(shù)據(jù)信息埠巨,而是控制信息例如標(biāo)志、開關(guān)量等现拒,一個模塊控制了另一個模塊的功能辣垒。

  5. 標(biāo)記耦合:調(diào)用模塊和被調(diào)用模塊之間傳遞數(shù)據(jù)結(jié)構(gòu)而不是簡單數(shù)據(jù),同時也稱作特征耦合印蔬。標(biāo)記耦合的模塊間傳遞的不是簡單變量勋桶,而是像高級語言中的數(shù)據(jù)名、記錄名和文件名等數(shù)據(jù)結(jié)果侥猬,這些名字即為標(biāo)記例驹,其實傳遞的是地址。

  6. 數(shù)據(jù)耦合:調(diào)用模塊和被調(diào)用模塊之間只傳遞簡單的數(shù)據(jù)項參數(shù)陵究。相當(dāng)于高級語言中的值傳遞眠饮。

  7. 非直接耦合:兩個模塊之系,它們之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實現(xiàn)的铜邮。耦合度最弱仪召,模塊獨立性最強。

總結(jié):耦合是影響軟件復(fù)雜程度和設(shè)計質(zhì)量的一個重要因素松蒜,為提高模塊的獨立性扔茅,應(yīng)建立模塊間盡可能松散的系統(tǒng),在設(shè)計上我們應(yīng)采用以下原則:若模塊間必須存在耦合秸苗,應(yīng)盡量使用數(shù)據(jù)耦合召娜,少用控制耦合,慎用或有控制地使用公共耦合惊楼,并限制公共耦合的范圍玖瘸,盡量避免內(nèi)容耦合秸讹。

內(nèi)聚有如下的種類,它們之間的內(nèi)聚度由弱到強排列如下:

  1. 偶然內(nèi)聚:一個模塊內(nèi)的各處理元素之間沒有任何聯(lián)系雅倒,只是偶然地被湊到一起璃诀。這種模塊也稱為巧合內(nèi)聚,內(nèi)聚程度最低蔑匣。

  2. 邏輯內(nèi)聚:這種模塊把幾種相關(guān)的功能組合在一起劣欢, 每次被調(diào)用時,由傳送給模塊參數(shù)來確定該模塊應(yīng)完成哪一種功能 裁良。

  3. 時間內(nèi)聚:把需要同時執(zhí)行的動作組合在一起形成的模塊稱為時間內(nèi)聚模塊凿将。

  4. 過程內(nèi)聚:構(gòu)件或者操作的組合方式是,允許在調(diào)用前面的構(gòu)件或操作之后价脾,馬上調(diào)用后面的構(gòu)件或操作牧抵,即使兩者之間沒有數(shù)據(jù)進行傳遞。簡單的說就是如果一個模塊內(nèi)的處理元素是相關(guān)的彼棍,而且必須以特定次序執(zhí)行則稱為過程內(nèi)聚灭忠。

  5. 通信內(nèi)聚:指模塊內(nèi)所有處理元素都在同一個數(shù)據(jù)結(jié)構(gòu)上操作或所有處理功能都通過公用數(shù)據(jù)而發(fā)生關(guān)聯(lián)(有時稱之為信息內(nèi)聚)膳算。即指模塊內(nèi)各個組成部分都使用相同的數(shù)據(jù)或產(chǎn)生相同的數(shù)據(jù)結(jié)構(gòu)座硕。

  6. 順序內(nèi)聚:一個模塊中各個處理元素和同一個功能密切相關(guān),而且這些處理必須順序執(zhí)行涕蜂,通常前一個處理元素的輸出是后一個處理元素的輸入华匾。
    例如某模塊完成工業(yè)產(chǎn)值求值的功能,前一個功能元素求總產(chǎn)值机隙,后一個功能元素求平均產(chǎn)值蜘拉,顯然該模塊內(nèi)兩部分緊密關(guān)聯(lián)。
    順序內(nèi)聚的內(nèi)聚度比較高有鹿,但缺點是不如功能內(nèi)聚易于維護旭旭。

  7. 功能內(nèi)聚:模塊內(nèi)所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能葱跋,模塊已不可再分持寄。即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯(lián)系娱俺、缺一不可稍味。
    功能內(nèi)聚是最強的內(nèi)聚,其優(yōu)點是它的功能明確荠卷。判斷一個模塊是否功能內(nèi)聚模庐,一般從模塊名稱就能看出。如果模塊名稱只有一個動詞和一個特定的目標(biāo)(單數(shù)名詞)油宜,一般來說就是功能內(nèi)聚掂碱,如:“計算水費”怜姿、“計算產(chǎn)值”等模塊。功能內(nèi)聚一般出現(xiàn)在軟件結(jié)構(gòu)圖的較低層次上疼燥。
    功能內(nèi)聚模塊的一個重要特點是:他是一個“暗盒”社牲,對于該模塊的調(diào)用者來說,只需要知道這個模塊能做什么悴了,而不需要知道這個模塊是如何做的搏恤。

總結(jié):在模塊劃分時,要遵循“一個模塊湃交,一個功能”的原則熟空,盡可能使模塊達到功能內(nèi)聚。

高內(nèi)聚搞莺,低耦合的系統(tǒng)有什么好處呢息罗?事實上,短期來看才沧,并沒有很明顯的好處迈喉,甚至短期內(nèi)會影響系統(tǒng)的開發(fā)進度,因為高內(nèi)聚温圆,低耦合的系統(tǒng)對開發(fā)設(shè)計人員提出了更高的要求挨摸。高內(nèi)聚,低耦合的好處體現(xiàn)在系統(tǒng)持續(xù)發(fā)展的過程中岁歉,高內(nèi)聚得运,低耦合的系統(tǒng)具有更好的重用性,維護性锅移,擴展性熔掺,可以更高效的完成系統(tǒng)的維護開發(fā),持續(xù)的支持業(yè)務(wù)的發(fā)展非剃,而不會成為業(yè)務(wù)發(fā)展的障礙置逻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市备绽,隨后出現(xiàn)的幾起案子券坞,更是在濱河造成了極大的恐慌,老刑警劉巖疯坤,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件报慕,死亡現(xiàn)場離奇詭異,居然都是意外死亡压怠,警方通過查閱死者的電腦和手機眠冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜗顽,你說我怎么就攤上這事布卡。” “怎么了雇盖?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵忿等,是天一觀的道長。 經(jīng)常有香客問我崔挖,道長贸街,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任狸相,我火速辦了婚禮薛匪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脓鹃。我一直安慰自己逸尖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布瘸右。 她就那樣靜靜地躺著娇跟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪太颤。 梳的紋絲不亂的頭發(fā)上苞俘,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音栋齿,去河邊找鬼苗胀。 笑死,一個胖子當(dāng)著我的面吹牛瓦堵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歌亲,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼菇用,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陷揪?” 一聲冷哼從身側(cè)響起惋鸥,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悍缠,沒想到半個月后卦绣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡飞蚓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年滤港,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趴拧。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡溅漾,死狀恐怖山叮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情添履,我是刑警寧澤屁倔,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站暮胧,受9級特大地震影響锐借,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜往衷,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一瞎饲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炼绘,春花似錦嗅战、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脚曾,卻和暖如春东且,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背本讥。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工珊泳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拷沸。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓色查,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撞芍。 傳聞我的和親對象是個殘疾皇子秧了,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348