什么是软件的内聚度和耦合度
一、聯(lián)系
當(dāng)一個(gè)程序段或語句(指令) 引用了其它程序段或語句(指令)中所定義或使用的數(shù)據(jù)名(即存貯區(qū)、地址等)或代碼時(shí),他們之間就發(fā)生了聯(lián)系。一個(gè)程序被劃分為若干模塊時(shí),聯(lián)系既可存在于模塊之間,也可存在于一個(gè)模塊內(nèi)的程序段或語句之間,即模塊內(nèi)部。聯(lián)系反映了系統(tǒng)中程序段或語句之間的關(guān)系,不同類型的聯(lián)系構(gòu)成不同質(zhì)量的系統(tǒng)。因此,聯(lián)系是系統(tǒng)設(shè)計(jì)必須考慮的重要問題。
系統(tǒng)被分成若干模塊后,模塊同模塊的聯(lián)系稱為塊間聯(lián)系;一個(gè)模塊內(nèi)部各成份的聯(lián)系稱為塊內(nèi)聯(lián)系。顯然,模塊之間的聯(lián)系多,則模塊的相對(duì)獨(dú)立性就差,系統(tǒng)結(jié)構(gòu)就混亂;相反,模塊間的聯(lián)系少,各個(gè)模塊相對(duì)獨(dú)立性就強(qiáng),系統(tǒng)結(jié)構(gòu)就比較理想。同時(shí),一個(gè)模塊內(nèi)部各成份聯(lián)系越緊密,該模塊越易理解和維護(hù)。
二、評(píng)判模塊結(jié)構(gòu)的標(biāo)準(zhǔn)
1.模塊獨(dú)立性
模塊化是軟件設(shè)計(jì)和開發(fā)的基本原則和方法,是概要設(shè)計(jì)最主要的工作。模塊的劃分應(yīng)遵循一定的要求,以保證模塊劃分合理,并進(jìn)一步保證以此為依據(jù)開發(fā)出的軟件系統(tǒng)可靠性強(qiáng),易于理解和維護(hù)。根據(jù)軟件設(shè)計(jì)的模塊化、抽象、信息隱蔽和局部化等原則,可直接得出模塊化獨(dú)立性的概念。所謂模塊獨(dú)立性,即:不同模塊相互之間聯(lián)系盡可能少,應(yīng)盡可能減少公共的變量和數(shù)據(jù)結(jié)構(gòu);一個(gè)模塊應(yīng)盡可能在邏輯上獨(dú)立,有完整單一的功能。
模塊獨(dú)立性(Module independence)是軟件設(shè)計(jì)的重要原則。具有良好獨(dú)立性的模塊劃分,模塊功能完整獨(dú)立,數(shù)據(jù)接口簡(jiǎn)單,程序易于實(shí)現(xiàn),易于理解和維護(hù)。獨(dú)立性限制了錯(cuò)誤的作用范圍,使錯(cuò)誤易于排除,因而可使軟件開發(fā)速度快,質(zhì)量高。
為了進(jìn)一步測(cè)量和分析模塊獨(dú)立性,軟件工程學(xué)引入了兩個(gè)概念,從兩個(gè)方面來定性地度量模塊獨(dú)立性的程度,這兩個(gè)概念是模塊的內(nèi)聚度和模塊的耦合度。
2.塊間聯(lián)系的度量―耦合度
耦合度是從模塊外部考察模塊的獨(dú)立性程度。它用來衡量多個(gè)模塊間的相互聯(lián)系。一般來說,耦合度應(yīng)從以下三方面來考慮,即:
耦合內(nèi)容的數(shù)量,即模塊間發(fā)生聯(lián)系的數(shù)據(jù)和代碼的多少,同這些數(shù)據(jù)和代碼發(fā)生聯(lián)系的模塊的多少,多的耦合強(qiáng),少的耦合弱;
模塊的調(diào)用方式,即模塊間代碼的共享方式。可分為用CALL語句調(diào)用方式和用GOTO語句直接訪問方式;
模塊間的耦合類型。耦合類型有以下幾種方式:
①獨(dú)立耦合
②數(shù)據(jù)耦合
③控制耦合
④公共耦合
⑤內(nèi)容耦合
下面重點(diǎn)對(duì)各種類型的耦合作進(jìn)一步的說明。
(1)獨(dú)立耦合
指兩個(gè)模塊彼此完全獨(dú)立,沒有直接聯(lián)系。它們之間的唯一聯(lián)系僅僅在于它們同屬于一個(gè)軟件系統(tǒng)或同有一個(gè)上層模塊。這是耦合程度最低的一種。當(dāng)然,系統(tǒng)中只可能有一部分模塊屬此種聯(lián)系,因?yàn)橐粋€(gè)程序系統(tǒng)中不可能所有的模塊都完全沒有聯(lián)系。
(2)數(shù)據(jù)耦合
指兩個(gè)模塊彼此交換數(shù)據(jù)。如一個(gè)模塊的輸出數(shù)據(jù)是另一個(gè)模塊的輸入數(shù)據(jù),或一個(gè)模塊帶參數(shù)調(diào)用另一個(gè)模塊,下層模塊又返回參數(shù)。應(yīng)該說,在一個(gè)軟件系統(tǒng)中,此種耦合是不可避免的,且有其積極意義。因?yàn)槿魏喂δ艿膶?shí)現(xiàn)都離不開數(shù)據(jù)的產(chǎn)生、表示和傳遞。數(shù)據(jù)耦合的聯(lián)系程度也較低。
(3)控制耦合
若在調(diào)用過程中,兩個(gè)模塊間傳遞的不是數(shù)據(jù)參數(shù)而是控制參數(shù),則模塊間的關(guān)系即為控制耦合。控制耦合屬于中等程度的耦合,較之?dāng)?shù)據(jù)耦合模塊間的聯(lián)系更為緊密。但控制耦合不是一種必須存在的耦合。
當(dāng)被調(diào)用模塊接收到控制信息作為輸入?yún)?shù)時(shí),說明該模塊內(nèi)部存在多個(gè)并列的邏輯路徑,即有多個(gè)功能。控制變量用以從多個(gè)功能中選擇所要執(zhí)行的部分,因而控制耦合是完全可以避免的。排除控制耦合可按如下步驟進(jìn)行:
①找出模塊調(diào)用時(shí)所用的一個(gè)或多個(gè)控制變量;
②在被調(diào)模塊中根據(jù)控制變量找出所有的流程;
③將每一個(gè)流程分解為一個(gè)獨(dú)立的模塊;
④將原被調(diào)模塊中的流程選擇部分移到上層模塊,變?yōu)檎{(diào)用判斷。
通過以上變換,可以將控制耦合變?yōu)閿?shù)據(jù)耦合。由于控制耦合增加了設(shè)計(jì)和理解的復(fù)雜程度,因此在模塊設(shè)計(jì)時(shí)要盡量避免使用。當(dāng)然,如果模塊內(nèi)每一個(gè)控制流程規(guī)模相對(duì)較小,彼此共性較多,使用控制耦合還是合算的。
(4)公共耦合
公共耦合又稱公共環(huán)境耦合或數(shù)據(jù)區(qū)耦合。若多個(gè)模塊對(duì)同一個(gè)數(shù)據(jù)區(qū)進(jìn)行存取操作,它們之間的關(guān)系稱為公共耦合。公共數(shù)據(jù)區(qū)可以是全程變量、共享的數(shù)據(jù)區(qū)、內(nèi)存的公共復(fù)蓋區(qū)、外存上的文件、物理設(shè)備等。當(dāng)兩個(gè)模塊共享的數(shù)據(jù)很多,通過參數(shù)傳遞可能不方便時(shí),可以使用公共耦合。公共耦合共享數(shù)據(jù)區(qū)的模塊越多,數(shù)據(jù)區(qū)的規(guī)模越大,則耦合程度越強(qiáng)。公共耦合最弱的一種形式是:兩個(gè)模塊共享一個(gè)數(shù)據(jù)變量,一個(gè)模塊只向里寫數(shù)據(jù),另一個(gè)模塊只從里讀數(shù)據(jù)。
當(dāng)公共耦合程度很強(qiáng)時(shí),會(huì)造成關(guān)系錯(cuò)綜復(fù)雜,難以控制,錯(cuò)誤傳遞機(jī)會(huì)增加,系統(tǒng)可靠性降低,可理解、維護(hù)性差。
(5)內(nèi)容耦合
內(nèi)容耦合是耦合程序最高的一種形式。若一個(gè)模塊直接訪問另一模塊的內(nèi)部代碼或數(shù)據(jù),即出現(xiàn)內(nèi)容耦合。內(nèi)容耦合的存在嚴(yán)重破壞了模塊的獨(dú)立性和系統(tǒng)的結(jié)構(gòu)化,代碼互相糾纏,運(yùn)行錯(cuò)綜復(fù)雜,程序的靜態(tài)結(jié)構(gòu)和動(dòng)態(tài)結(jié)構(gòu)很不一致,其惡劣結(jié)果往往不可預(yù)測(cè)。
內(nèi)容耦合往往表現(xiàn)為以下幾種形式:
①一個(gè)模塊訪問另一模塊的內(nèi)部代碼或數(shù)據(jù);
②一個(gè)模塊不通過正常入口而轉(zhuǎn)到另一個(gè)模塊的內(nèi)部(如使用GOTO語句或JMP指令直接進(jìn)入另一模塊內(nèi)部);
③兩個(gè)模塊有一部分代碼重迭(可能出現(xiàn)在匯編程序中,在一些非結(jié)構(gòu)化的高級(jí)語言,如COBOL中也可能出現(xiàn));
④一個(gè)模塊有多個(gè)入口(這意味著一個(gè)模塊有多種功能)。
一般講,在模塊劃分時(shí),應(yīng)當(dāng)盡量使用數(shù)據(jù)耦合,少用控制耦合(盡量轉(zhuǎn)成數(shù)據(jù)耦合),限制公共耦合的范圍,完全不用內(nèi)容耦合。
3.塊內(nèi)聯(lián)系的度量――內(nèi)聚度
內(nèi)聚度(Cohesion)是模塊內(nèi)部各成份(語句或語句段)之間的聯(lián)系。顯然,模塊內(nèi)部各成份聯(lián)系越緊,即其內(nèi)聚度越大,模塊獨(dú)立性就越強(qiáng),系統(tǒng)越易理解和維護(hù)。具有良好內(nèi)聚度的模塊應(yīng)能較好地滿足信息局部化的原則,功能完整單一。同時(shí),模塊的高內(nèi)聚度必然導(dǎo)致模塊的低耦合度。理想的情況是:一個(gè)模塊只使用局部數(shù)據(jù)變量,完成一個(gè)功能。
按由弱到強(qiáng)的順序,模塊的內(nèi)聚度可分為以下7類,現(xiàn)分述于下。
(1)偶然內(nèi)聚
塊內(nèi)的各個(gè)任務(wù)(通過語句或指令來實(shí)現(xiàn)的)沒有什么有意義的聯(lián)系,它們之所以能構(gòu)成一個(gè)模塊完全是偶然的原因。如下圖3-4-1所示。
在模塊T有三條語句。至少?gòu)谋砻嫔峡床怀鲞@三條語句之間有什么聯(lián)系,只是由于P,Q,R,S四個(gè)模塊中都有這三條語句,為了節(jié)省空間才把它們作為一個(gè)模塊放在一起。這完全是偶然性的。偶然內(nèi)聚的模塊有很多缺點(diǎn):由于模塊內(nèi)
沒有實(shí)質(zhì)性的聯(lián)系,很可能在某種情況下一個(gè)調(diào)用模塊需要對(duì)它修改而別的模塊不需要。這時(shí)就很難處理。同時(shí),這種模塊的含義也不易理解,甚至難以為它取一個(gè)合適的名字,偶然內(nèi)聚的模塊也難于測(cè)試。所以,在空間允許的情況下,不應(yīng)使用這種模塊。
(2)邏輯內(nèi)聚
一個(gè)模塊完成的任務(wù)在邏輯上屬于相同或相似的一類(例如,用一個(gè)模塊產(chǎn)生各種類型的輸出),則該種模塊內(nèi)的聯(lián)系稱為邏輯內(nèi)聚。如圖3-4-2a和3-2-2b所示。
在圖3-4-2a中,模塊A,B,C的功能相似但不相同,如果把它們合并成一個(gè)模塊ABC,如圖3-4-2b所示,則這個(gè)模塊就為邏輯內(nèi)聚,因?yàn)樗鼈兪怯捎谶壿嬌舷嗨贫l(fā)生聯(lián)系的。邏輯內(nèi)聚是一種較弱的聯(lián)系。實(shí)際執(zhí)行時(shí),當(dāng)X,Y,Z調(diào)用合成的模塊ABC時(shí),由于原A,B,C并不完全相同,所以還要判別是執(zhí)行不同功能的哪一部分。
邏輯內(nèi)聚存在的問題是:
①修改困難,調(diào)用模塊中有一個(gè)要對(duì)其改動(dòng),還要考慮到其它調(diào)用模塊;
②模塊內(nèi)需要增加開關(guān),以判別是誰調(diào)用,因而增加了塊間聯(lián)系;
③實(shí)際上每次調(diào)用只執(zhí)行模塊中的一部分,而其它部分也一同被裝入內(nèi)存,因而效率不高。
(3)時(shí)間內(nèi)聚
時(shí)間內(nèi)聚是指一個(gè)模塊中包含的任務(wù)需要在同一時(shí)間內(nèi)執(zhí)行(如初始化,結(jié)束等所需操作)。如圖3―4―3所示的模塊。與偶然內(nèi)聚和邏輯內(nèi)聚相比,這種內(nèi)聚類型要稍強(qiáng)些,因?yàn)橹辽僭跁r(shí)間上,這些任務(wù)可以一起完成。但時(shí)間內(nèi)聚和偶然內(nèi)聚、邏輯內(nèi)聚一樣,都屬低內(nèi)聚度類型。
(4)過程內(nèi)聚
如果一個(gè)模塊內(nèi)的各個(gè)處理元素是相關(guān)的,而且必須按固定的次序執(zhí)行,這種內(nèi)聚就叫做過程內(nèi)聚。過程內(nèi)聚的各模塊內(nèi)往往體現(xiàn)為有次序的流程。
(5)通信內(nèi)聚
若一個(gè)模塊中的各處理元素需引用共同的數(shù)據(jù)(同一數(shù)據(jù)項(xiàng)、數(shù)據(jù)區(qū)或文件),則稱其元素間的聯(lián)系為通信內(nèi)聚。通信內(nèi)聚的各部分間是借助共同使用的數(shù)據(jù)聯(lián)系在一起的,故有較好的可理解性。通信內(nèi)聚和過程內(nèi)聚都屬中內(nèi)聚度型模塊。
(6)順序內(nèi)聚
若一個(gè)模塊內(nèi)的各處理元素關(guān)系密切,必須按規(guī)定的處理次序順序執(zhí)行,這樣的模塊為順序內(nèi)聚類型。順序內(nèi)聚的模塊內(nèi),后執(zhí)行的語句或語句段往往依賴先執(zhí)行的語句或語句段,以先執(zhí)行的部分為條件。由于模塊內(nèi)各處理元素間存在著這種邏輯聯(lián)系,所以順序內(nèi)聚模塊的可理解性很強(qiáng),屬高內(nèi)聚度類型模塊。
(7)功能內(nèi)聚
功能內(nèi)聚是內(nèi)聚度最高的一種模塊類型。如果模塊僅完成一個(gè)單一的功能,且該模塊的所有部分是實(shí)現(xiàn)這一功能所必須的,沒有多余的語句,則該模塊為功能內(nèi)聚。功能內(nèi)聚模塊的結(jié)構(gòu)緊湊、界面清晰,易于理解和維護(hù),因而可靠性強(qiáng);又由于其功能單一,故復(fù)用率高。所以它是模塊劃分時(shí)應(yīng)注意追求的一種模塊類型。如圖3―4―7是模塊劃分時(shí)得到的功能內(nèi)聚模塊。
在模塊設(shè)計(jì)時(shí)應(yīng)力爭(zhēng)做到高內(nèi)聚,并且能夠辨別出低內(nèi)聚的模塊,加以修改使之提高內(nèi)聚度并降低模塊間的耦合度。具體設(shè)計(jì)時(shí),應(yīng)注意:
①設(shè)計(jì)功能獨(dú)立單一的模塊;
②控制使用全局?jǐn)?shù)據(jù);
③模塊間盡量傳遞數(shù)據(jù)型信息。
轉(zhuǎn)自 http://blog.sina.com.cn/s/blog_4ca059540100jnk7.html
總結(jié)
以上是生活随笔為你收集整理的什么是软件的内聚度和耦合度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 指令
- 下一篇: python数据结构之字典(未完成)