概述
內(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ù)雜的話,最好首先考慮進一步的模塊劃分因苹。這樣有利于修改和組合苟耻。
擴展
耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:
內(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)容耦合。這種耦合的耦合性最強攘须,模塊獨立性最弱漆撞。公共耦合:一組模塊都訪問同一個全局?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ù)傳遞很不方便時,才使用公共耦合兆解。外部耦合:一組模塊都訪問同一全局簡單變量馆铁,而且不通過參數(shù)表傳遞該全局變量的信息,則稱之為外部耦合锅睛。
控制耦合:模塊之間傳遞的不是數(shù)據(jù)信息埠巨,而是控制信息例如標(biāo)志、開關(guān)量等现拒,一個模塊控制了另一個模塊的功能辣垒。
標(biāo)記耦合:調(diào)用模塊和被調(diào)用模塊之間傳遞數(shù)據(jù)結(jié)構(gòu)而不是簡單數(shù)據(jù),同時也稱作特征耦合印蔬。標(biāo)記耦合的模塊間傳遞的不是簡單變量勋桶,而是像高級語言中的數(shù)據(jù)名、記錄名和文件名等數(shù)據(jù)結(jié)果侥猬,這些名字即為標(biāo)記例驹,其實傳遞的是地址。
數(shù)據(jù)耦合:調(diào)用模塊和被調(diào)用模塊之間只傳遞簡單的數(shù)據(jù)項參數(shù)陵究。相當(dāng)于高級語言中的值傳遞眠饮。
非直接耦合:兩個模塊之系,它們之間的聯(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)聚度由弱到強排列如下:
偶然內(nèi)聚:一個模塊內(nèi)的各處理元素之間沒有任何聯(lián)系雅倒,只是偶然地被湊到一起璃诀。這種模塊也稱為巧合內(nèi)聚,內(nèi)聚程度最低蔑匣。
邏輯內(nèi)聚:這種模塊把幾種相關(guān)的功能組合在一起劣欢, 每次被調(diào)用時,由傳送給模塊參數(shù)來確定該模塊應(yīng)完成哪一種功能 裁良。
時間內(nèi)聚:把需要同時執(zhí)行的動作組合在一起形成的模塊稱為時間內(nèi)聚模塊凿将。
過程內(nèi)聚:構(gòu)件或者操作的組合方式是,允許在調(diào)用前面的構(gòu)件或操作之后价脾,馬上調(diào)用后面的構(gòu)件或操作牧抵,即使兩者之間沒有數(shù)據(jù)進行傳遞。簡單的說就是如果一個模塊內(nèi)的處理元素是相關(guān)的彼棍,而且必須以特定次序執(zhí)行則稱為過程內(nèi)聚灭忠。
通信內(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)座硕。
順序內(nèi)聚:一個模塊中各個處理元素和同一個功能密切相關(guān),而且這些處理必須順序執(zhí)行涕蜂,通常前一個處理元素的輸出是后一個處理元素的輸入华匾。
例如某模塊完成工業(yè)產(chǎn)值求值的功能,前一個功能元素求總產(chǎn)值机隙,后一個功能元素求平均產(chǎn)值蜘拉,顯然該模塊內(nèi)兩部分緊密關(guān)聯(lián)。
順序內(nèi)聚的內(nèi)聚度比較高有鹿,但缺點是不如功能內(nèi)聚易于維護旭旭。功能內(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ā)展的障礙置逻。