耦合性與�(nèi)聚性是模塊�(dú)立性的兩�(gè)定性標(biāo)�(zhǔn),將軟件系統(tǒng)劃分模塊�(shí),盡量做到高�(nèi)聚低耦合,提高模塊的�(dú)立性,為設(shè)�(jì)高質(zhì)量的軟件�(jié)�(gòu)奠定基礎(chǔ)。內(nèi)聚是從功能角度來(lái)度量模塊�(nèi)的聯(lián)�,一�(gè)好的�(nèi)聚模塊應(yīng)�(dāng)恰好做一件事,它描述的是模塊�(nèi)的功能聯(lián)�;耦合是軟件結(jié)�(gòu)中各模塊之間相互連接的一種度�,耦合�(qiáng)弱取決于模塊間接口的�(fù)雜程度、�(jìn)入或訪問(wèn)一�(gè)模塊的點(diǎn)以及通過(guò)接口的數(shù)�(jù)�
�(nèi)聚就是一�(gè)模塊�(nèi)各�(gè)元素彼此�(jié)合的緊密程度,高�(nèi)聚就是一�(gè)模塊�(nèi)各�(gè)元素彼此�(jié)合的緊密程度��
所謂高�(nèi)聚是指一�(gè)軟件模塊是由相關(guān)性很�(qiáng)的代碼組�,只�(fù)�(zé)一�(xiàng)任務(wù),也就是常說(shuō)的單一�(zé)任原則�
耦合:一�(gè)軟件�(jié)�(gòu)�(nèi)不同模塊之間互連程度的度量(耦合性也叫塊間聯(lián)�。指軟件系統(tǒng)�(jié)�(gòu)中各模塊間相互聯(lián)系緊密程度的一種度�。模塊之間聯(lián)系越緊密,其耦合性就越強(qiáng),模塊的�(dú)立性則越差,模塊間耦合的高低取決于模塊間接口的�(fù)雜�,調(diào)用的方式以及傳遞的信��)
�(duì)于低耦合,粗淺的理解是:一�(gè)完整的系�(tǒng),模塊與模塊之間,盡可能的使其獨(dú)立存�。也就是�(shuō),讓每�(gè)模塊,盡可能的獨(dú)立完成某�(gè)特定的子功能。模塊與模塊之間的接�,盡量的少而簡(jiǎn)單。如果某兩�(gè)模塊間的�(guān)系比較復(fù)雜的�(huà),首先考慮�(jìn)一步的模塊劃分。這樣有利于修改和組合�
軟件架構(gòu)�(shè)�(jì)的目的簡(jiǎn)單說(shuō)就是在保持軟件內(nèi)在聯(lián)系的前提下,分解軟件系統(tǒng),降低軟件系�(tǒng)�(kāi)�(fā)的復(fù)雜�,而分解軟件系�(tǒng)的基本方法無(wú)外乎分層和分�。但是在保持軟件�(nèi)在聯(lián)系的前提�,如何分層分割系�(tǒng),分層分割到什么樣的力�,并不是一件容易的事,這方面有各種各樣的分解方�,比如:�(guān)注點(diǎn)分離,面向方面,面向?qū)ο?,面向接口,面向�?wù),依�(lài)注入,以及各種各樣的�(shè)�(jì)原則等,
耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:
?�?)內(nèi)容耦合:一�(gè)模塊直接訪問(wèn)另一模塊的內(nèi)容,則稱(chēng)這兩�(gè)模塊為內(nèi)容耦合�
若在程序中出�(xiàn)下列情況之一,則�(shuō)明兩�(gè)模塊之間�(fā)生了�(nèi)容耦合�
1.一�(gè)模塊直接訪問(wèn)另一�(gè)模塊的內(nèi)部數(shù)�(jù)�
2.一�(gè)模塊不通過(guò)正常入口而直接轉(zhuǎn)入到另一�(gè)模塊的內(nèi)��
3.兩�(gè)模塊有一部分代碼重疊(該部分代碼具有一定的�(dú)立功能)�
4.一�(gè)模塊有多�(gè)入口�
�(nèi)容耦合可能在匯編語(yǔ)言中出�(xiàn)。大多數(shù)�(yǔ)言都已�(shè)�(jì)成不允許出現(xiàn)�(nèi)容耦合。這種耦合的耦合性最�(qiáng),模塊獨(dú)立性最��
?�?)公共耦合:一組模塊都訪問(wèn)同一�(gè)全局?jǐn)?shù)�(jù)�(jié)�(gòu),則�(chēng)之為公共耦合。公共數(shù)�(jù)�(huán)境可以是全局?jǐn)?shù)�(jù)�(jié)�(gòu)、共享的通信區(qū)、內(nèi)存的公共�(fù)蓋區(qū)�。如果模塊只是向公共�(shù)�(jù)�(huán)境輸入數(shù)�(jù),或是只從公共數(shù)�(jù)�(huán)境取出數(shù)�(jù),這數(shù)�(jù)比較松散的公共耦合;如果模塊既向公共數(shù)�(jù)�(huán)境輸入數(shù)�(jù)又從公共�(shù)�(jù)�(huán)境取出數(shù)�(jù),這屬于較緊密的公共耦合�
公共耦合�(huì)引起以下�(wèn)題:
1.�(wú)法控制各�(gè)模塊�(duì)公共�(shù)�(jù)的存�,嚴(yán)重影響了軟件模塊的可靠性和適應(yīng)��
2.使軟件的可維�(hù)性變�。若一�(gè)模塊修改了公共數(shù)�(jù),則�(huì)影響相關(guān)模塊�
3.降低了軟件的可理解�。不容易清楚知道哪些�(shù)�(jù)被哪些模塊所共享,排�(cuò)困難�
一般地,僅�(dāng)模塊間共享的�(shù)�(jù)很多且通過(guò)參數(shù)傳遞很不方便�(shí),才使用公共耦合�
?�?)外部耦合:一組模塊都訪問(wèn)同一全局�(jiǎn)單變�,而且不通過(guò)參數(shù)表傳遞該全局變量的信�,則�(chēng)之為外部耦合�
�4)控制耦合:模塊之間傳遞的不是�(shù)�(jù)信息,而是控制信息例如�(biāo)志、開(kāi)�(guān)量等,一�(gè)模塊控制了另一�(gè)模塊的功能�
?�?)標(biāo)記耦合:調(diào)用模塊和被調(diào)用模塊之間傳遞數(shù)�(jù)�(jié)�(gòu)而不是簡(jiǎn)單數(shù)�(jù),同�(shí)也稱(chēng)作特征耦合。表就和的模塊間傳遞的不是簡(jiǎn)單變�,而是像語(yǔ)言中的�(shù)�(jù)�、記錄名和文件名等數(shù)�(jù)�(jié)�,這些名字即為�(biāo)�,其�(shí)傳遞的是地址�
?�?)數(shù)�(jù)耦合:調(diào)用模塊和被調(diào)用模塊之間只傳遞�(jiǎn)單的�(shù)�(jù)�(xiàng)參數(shù)。相�(dāng)于語(yǔ)言中的值傳��
?�?)非直接耦合:兩�(gè)模塊之間�(méi)有直接關(guān)�,它們之間的�(lián)系完全是通過(guò)主模塊的控制和調(diào)用來(lái)�(shí)�(xiàn)�。耦合度最�,模塊獨(dú)立性最�(qiáng)�
總結(jié):耦合是影響軟件復(fù)雜程度和�(shè)�(jì)�(zhì)量的一�(gè)重要因素,為提高模塊的獨(dú)立�,應(yīng)建立模塊間盡可能松散的系�(tǒng),在�(shè)�(jì)上我們應(yīng)采用以下原則:若模塊間必須存在耦合,應(yīng)盡量使用�(shù)�(jù)耦合,少用控制耦合,慎用或有控制地使用公共耦合,并限制公共耦合的范�,盡量避免內(nèi)容耦合�
�(nèi)聚有如下的種�(lèi),它們之間的�(nèi)聚度由弱到強(qiáng)排列如下�
�1)偶然內(nèi)聚:一�(gè)模塊�(nèi)的各處理元素之間�(méi)有任何聯(lián)�,只是偶然地被湊到一�。這種模塊也稱(chēng)為巧合內(nèi)聚,�(nèi)聚程��
?�?)邏輯內(nèi)聚:這種模塊把幾種相�(guān)的功能組合在一�,每次被�(diào)用時(shí),由傳送給模塊參數(shù)�(lái)確定該模塊應(yīng)完成哪一種功��
?�?)時(shí)間內(nèi)聚:把需要同�(shí)�(zhí)行的�(dòng)作組合在一起形成的模塊�(chēng)為時(shí)間內(nèi)聚模��
?�?)過(guò)程內(nèi)聚:�(gòu)件或者操作的組合方式�,允許在�(diào)用前面的�(gòu)件或操作之后,馬上調(diào)用后面的�(gòu)件或操作,即使兩者之間沒(méi)有數(shù)�(jù)�(jìn)行傳�。簡(jiǎn)單的�(shuō)就是如果一�(gè)模塊�(nèi)的處理元素是相關(guān)�,而且必須以特定次序執(zhí)行則�(chēng)為過(guò)程內(nèi)��
?�?)通信�(nèi)聚:指模塊內(nèi)所有處理元素都在同一�(gè)�(shù)�(jù)�(jié)�(gòu)上操作或所有處理功能都通過(guò)公用�(shù)�(jù)而發(fā)生關(guān)�(lián)(有�(shí)�(chēng)之為信息�(nèi)聚)。即指模塊內(nèi)各�(gè)組成部分都使用相同的�(shù)�(jù)�(shù)�(jù)或產(chǎn)生相同的�(shù)�(jù)�(jié)�(gòu)�
?�?)順序內(nèi)聚:一�(gè)模塊中各�(gè)處理元素和同一�(gè)功能密切相關(guān),而且這些處理必須順序�(zhí)行,通常前一�(gè)處理元素的輸出時(shí)后一�(gè)處理元素的輸��
例如某模塊完成工�(yè)�(chǎn)值求值的功能,前一�(gè)功能元素求總�(chǎn)�,后一�(gè)功能元素求平均產(chǎn)值,顯然該模塊內(nèi)兩部分緊密關(guān)�(lián)�
順序�(nèi)聚的�(nèi)聚度比較�,但缺點(diǎn)是不如功能內(nèi)聚易于維�(hù)�
�7)功能內(nèi)聚:模塊�(nèi)所有元素的各�(gè)組成部分全部都為完成同一�(gè)功能而存�,共同完成一�(gè)單一的功�,模塊已不可再分。即模塊僅包括為完成某�(gè)功能所必須的所有成�,這些成分緊密�(lián)系、缺一不可�
功能�(nèi)聚是最�(qiáng)的內(nèi)�,其�(yōu)�(diǎn)是它的功能明�。判斷一�(gè)模塊是否功能�(nèi)�,一般從模塊名稱(chēng)就能看出。如果模塊名�(chēng)只有一�(gè)�(dòng)詞和一�(gè)特定的目�(biāo)(單�(shù)名詞�,一般來(lái)�(shuō)就是功能�(nèi)聚,如:“計(jì)算水�(fèi)�、“計(jì)算產(chǎn)值”等模塊。功能內(nèi)聚一般出�(xiàn)在軟件結(jié)�(gòu)圖的較低層次��
功能�(nèi)聚模塊的一�(gè)重要特點(diǎn)是:他是一�(gè)“暗盒�,對(duì)于該模塊的調(diào)用者來(lái)�(shuō),只需要知道這�(gè)模塊能做什�,而不需要知道這�(gè)模塊是如何做的�
總結(jié):在模塊劃分�,要遵循“一�(gè)模塊,一�(gè)功能”的原則,盡可能使模塊達(dá)到功能內(nèi)��
高內(nèi)�,低耦合的系�(tǒng)有什么好處呢?事�(shí)�,短期來(lái)看,并沒(méi)有很明顯的好�,甚至短期內(nèi)�(huì)影響系統(tǒng)的開(kāi)�(fā)�(jìn)�,因?yàn)楦邇?nèi)�,低耦合的系�(tǒng)�(duì)�(kāi)�(fā)�(shè)�(jì)人員提出了更高的要求。高�(nèi)�,低耦合的好處體�(xiàn)在系�(tǒng)持續(xù)�(fā)展的�(guò)程中,高�(nèi)�,低耦合的系�(tǒng)具有更好的重用性,維護(hù)�,擴(kuò)展�,可以更高效的完成系�(tǒng)的維�(hù)�(kāi)�(fā),持�(xù)的支持業(yè)�(wù)的發(fā)�,而不�(huì)成為�(yè)�(wù)�(fā)展的障礙�