Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          軟件設(shè)計(jì)“內(nèi)聚度”“耦合度”介紹
          ?
          ?
          一、聯(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)系多,則模塊的相對獨(dú)立性就差,系統(tǒng)結(jié)構(gòu)就混亂;相反,模塊間的聯(lián)系少,各個(gè)模塊相對獨(dú)立性就強(qiáng),系統(tǒng)結(jié)構(gòu)就比較理想。同時(shí),一個(gè)模塊內(nèi)部各成份聯(lián)系越緊密,該模塊越易理解和維護(hù)。
          ?
          ?
          二、評判模塊結(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ú)立性(Moduleindependence)是軟件設(shè)計(jì)的重要原則。具有良好獨(dú)立性的模塊劃分,模塊功能完整獨(dú)立,數(shù)據(jù)接口簡單,程序易于實(shí)現(xiàn),易于理解和維護(hù)。獨(dú)立性限制了錯(cuò)誤的作用范圍,使錯(cuò)誤易于排除,因而可使軟件開發(fā)速度快,質(zhì)量高。
          ?
          ??? 為了進(jìn)一步測量和分析模塊獨(dú)立性,軟件工程學(xué)引入了兩個(gè)概念,從兩個(gè)方面來定性地度量模塊獨(dú)立性的程度,這兩個(gè)概念是模塊的內(nèi)聚度和模塊的耦合度
          ?
          ??? 2.塊內(nèi)聯(lián)系的度量——內(nèi)聚度
          ?
          ??? 軟件概要設(shè)計(jì)是以需求分析所產(chǎn)生的文檔為依據(jù),著手解決實(shí)現(xiàn)“需求”的軟件體系結(jié)構(gòu),簡稱軟件結(jié)構(gòu)。這一階段確定軟件結(jié)構(gòu)的具體任務(wù)是將系統(tǒng)分解成模塊,確定各模塊的功能及調(diào)用關(guān)系,將用戶的需求分配到適當(dāng)?shù)奈恢蒙先?,得出系統(tǒng)的結(jié)構(gòu)圖。
          ?
          ??? 軟件概要設(shè)計(jì)的原則是模塊化、抽象化和信息隱藏,要達(dá)到這些原則,就要求模塊具有獨(dú)立性。模塊內(nèi)聚度用于衡量模塊內(nèi)部各成分之間彼此結(jié)合的緊密程度,模塊內(nèi)聚度由強(qiáng)到弱的順序如圖:
          ?
          ??? 高<----------------------------- 內(nèi)聚度 -----------------------------低
          ??? | 功能內(nèi)聚 | 信息內(nèi)聚 | 通信內(nèi)聚 | 過程內(nèi)聚 | 時(shí)間內(nèi)聚 | 邏輯內(nèi)聚 | 巧合內(nèi)聚 |
          ??? 強(qiáng)<--------------------------- 模塊獨(dú)立性 ----------------------------弱
          ?
          ??? 1> 功能內(nèi)聚 (Functional Cohesion)
          ?
          ????功能內(nèi)聚是內(nèi)聚度最高的一種模塊類型。如果模塊僅完成一個(gè)單一的功能,且該模塊的所有部分是實(shí)現(xiàn)這一功能所必須的,沒有多余的語句,則該模塊為功能內(nèi)聚。功能內(nèi)聚模塊的結(jié)構(gòu)緊湊、界面清晰,易于理解和維護(hù),因而可靠性強(qiáng);又由于其功能單一,故復(fù)用率高。所以它是模塊劃分時(shí)應(yīng)注意追求的一種模塊類型。
          ?
          ??? 2> 信息內(nèi)聚 (Informational Cohesion)
          ?
          ??? 這種模塊完成多個(gè)功能,各個(gè)功能都在同一數(shù)據(jù)結(jié)構(gòu)上操作,每一項(xiàng)功能都一個(gè)唯一的入口。這個(gè)模塊將根據(jù)不同的要求,確定該執(zhí)行哪一個(gè)功能。由于這個(gè)模塊的所有功能都是基于同一數(shù)據(jù)結(jié)構(gòu)(符號表),因此它是一個(gè)信息內(nèi)聚模塊。
          ?
          ??? 信息內(nèi)聚模塊可以看作多個(gè)功能內(nèi)聚模塊的組合,并且達(dá)到信息的隱蔽。即把某個(gè)數(shù)據(jù)結(jié)構(gòu)、資源或設(shè)備隱蔽在一個(gè)模塊內(nèi),不為別的模塊所知曉。如果一個(gè)模塊的各個(gè)成分和同一個(gè)功能密切相關(guān),而且一個(gè)成分的輸出作為另一個(gè)成分的輸入,則稱為順序內(nèi)聚
          ?
          ??? 順序內(nèi)聚的模塊內(nèi),后執(zhí)行的語句或語句段往往依賴先執(zhí)行的語句或語句段,以先執(zhí)行的部分為條件。由于模塊內(nèi)各處理元素間存在著這種邏輯聯(lián)系,所以順序內(nèi)聚模塊的可理解性很強(qiáng),屬高內(nèi)聚度類型模塊。
          ?
          ??? 3> 通信內(nèi)聚 (Communication Cohesion)
          ?
          ??? 若一個(gè)模塊中的各處理元素需引用共同的數(shù)據(jù)(同一數(shù)據(jù)項(xiàng)、數(shù)據(jù)區(qū)或文件),即使用了相同的輸入數(shù)據(jù)或輸出數(shù)據(jù),則稱其元素間的聯(lián)系為通信內(nèi)聚。通信內(nèi)聚的各部分間是借助共同使用的數(shù)據(jù)聯(lián)系在一起的,故有較好的可理解性。通常內(nèi)聚模塊是通過數(shù)據(jù)流圖來定義的。
          ?
          ??? 4> 過程內(nèi)聚 (Procedural Cohesion)
          ?
          ??? 如果一個(gè)模塊內(nèi)的各個(gè)處理元素是相關(guān)的,而且必須按固定的次序執(zhí)行,這種內(nèi)聚就叫做過程內(nèi)聚。過程內(nèi)聚的各模塊內(nèi)往往體現(xiàn)為有次序的流程。
          ?
          ??? 在使用流程圖作為工具設(shè)計(jì)程序時(shí),把流程圖中的某一部分劃出組成模塊,就得到過程內(nèi)聚模塊。例如把流程圖中的循環(huán)部分、判定部分、計(jì)算部分分成三個(gè)模塊,則這三個(gè)模塊都是過程內(nèi)聚的。
          ?
          ??? 5> 時(shí)間內(nèi)聚 (Classical Cohesion)
          ?
          ??? 時(shí)間內(nèi)聚又稱為經(jīng)典內(nèi)聚或瞬時(shí)內(nèi)聚。時(shí)間內(nèi)聚是指一個(gè)模塊中包含的任務(wù)需要在同一時(shí)間內(nèi)執(zhí)行(如初始化,結(jié)束等所需操作)。與巧合內(nèi)聚和邏輯內(nèi)聚相比,這種內(nèi)聚類型要稍強(qiáng)些,因?yàn)橹辽僭跁r(shí)間上,這些任務(wù)可以一起完成。但時(shí)間內(nèi)聚和偶然內(nèi)聚、邏輯內(nèi)聚一樣,都屬低內(nèi)聚度類型。
          ?
          ??? 6> 邏輯內(nèi)聚 (Logical Cohesion)
          ?
          ??? 一個(gè)模塊完成的任務(wù)在邏輯上屬于相同或相似的一類(例如用一個(gè)模塊產(chǎn)生各種類型的輸出),則該種模塊內(nèi)的聯(lián)系稱為邏輯內(nèi)聚。每次調(diào)用模塊時(shí),由傳送給模塊的判定參數(shù)來確定該模塊應(yīng)執(zhí)行哪一種功能。
          ?
          ??? 邏輯內(nèi)聚的模塊各成分之間在功能上并無關(guān)系,即使局部功能的修改有時(shí)也會(huì)影響全局,因此主要的困難有:
          ?
          ??? ① 修改困難,調(diào)用模塊中有一個(gè)要對其改動(dòng),還要考慮到其它調(diào)用模塊;
          ??? ② 模塊內(nèi)需要增加開關(guān),以判別是誰調(diào)用,因而增加了塊間聯(lián)系;
          ??? ③ 實(shí)際上每次調(diào)用只執(zhí)行模塊中的一部分,而其它部分也一同被裝入內(nèi)存,因而效率不高。
          ?
          ??? 7> 巧合內(nèi)聚(Coincidental Cohesion)
          ?
          ??? 塊內(nèi)的各個(gè)任務(wù)(通過語句或指令來實(shí)現(xiàn)的)沒有什么有意義的聯(lián)系,它們之所以能構(gòu)成一個(gè)模塊完全是偶然的原因。
          ?
          ??? 這類模塊內(nèi)部沒有實(shí)質(zhì)性的聯(lián)系,很可能在某種情況下一個(gè)調(diào)用模塊需要對它修改而別的模塊不需要。這時(shí)就很難處理。同時(shí),這種模塊的含義也不易理解,甚至難以為它取一個(gè)合適的名字,偶然內(nèi)聚的模塊也難于測試。所以,在空間允許的情況下,不應(yīng)使用這種模塊。
          ?
          ??? 2.塊間聯(lián)系的度量——耦合度
          ?
          ??? 耦合度是對一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量。耦合強(qiáng)弱取決于模塊間接口的復(fù)雜程度、進(jìn)入訪問一個(gè)模塊的點(diǎn)及通過接口的數(shù)據(jù)。在軟件設(shè)計(jì)中應(yīng)該追求盡可能松散的耦合系統(tǒng),在這樣的系統(tǒng)中可以研究、測試或修改、維護(hù)任何一個(gè)模塊,而不需要對系統(tǒng)的其它模塊有很多的了解或影響其它模塊的實(shí)現(xiàn)。此外,當(dāng)某處發(fā)生錯(cuò)誤時(shí),低耦合度系統(tǒng)的錯(cuò)誤傳播的范圍相對小些。
          ?
          ??? 耦合度取決于各個(gè)模塊間接口的復(fù)雜程度、調(diào)用模塊的方式,以及哪些信息通過接口。耦合度的強(qiáng)弱依賴以下幾個(gè)因素:
          ?
          ??? (1)一個(gè)模塊對另一個(gè)模塊的調(diào)用
          ??? (2)一個(gè)模塊向另一個(gè)模塊傳遞的數(shù)據(jù)量
          ??? (3)一個(gè)模塊施加到另一個(gè)模塊的控制的多少
          ??? (4)模塊之間接口的復(fù)雜度
          ?
          ??? 一般模塊之間可能的連接方式有以下幾種,耦合度由低到高如下所示:
          ?
          ??? 低<------------------------------ 耦合性 ------------------------------低
          ??? |?非直接耦合 |?數(shù)據(jù)耦合 |?標(biāo)記耦合 |?控制耦合 |?外部耦合 |?公共耦合 |?內(nèi)容耦合 |
          ??? 強(qiáng)<---------------------------- 模塊獨(dú)立性 -----------------------------弱
          ?
          ??? 1> 非直接耦合 (Nondirective Coupling)
          ?
          ??? 指兩個(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ù)耦合 (Data Coupling)
          ?
          ??? 兩個(gè)模塊彼此交換數(shù)據(jù),如一個(gè)模塊的輸出數(shù)據(jù)是另一個(gè)模塊的輸入數(shù)據(jù),或一個(gè)模塊帶參數(shù)調(diào)用另一個(gè)模塊,下層模塊又返回參數(shù),則稱為數(shù)據(jù)耦合。注意這里的數(shù)據(jù)指的是簡單數(shù)據(jù),而不包括控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量。
          ?
          ??? 應(yīng)該說,在一個(gè)軟件系統(tǒng)中,此種耦合是不可避免的,且有其積極意義。因?yàn)槿魏喂δ艿膶?shí)現(xiàn)都離不開數(shù)據(jù)的產(chǎn)生、表示和傳遞。數(shù)據(jù)耦合的聯(lián)系程度也較低。
          ?
          ??? 3> 標(biāo)記耦合 (Stamp Coupling)
          ?
          ??? 如果一組模塊通過參數(shù)傳遞記錄信息,這稱為標(biāo)記耦合。這個(gè)記錄是某一數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),而不是簡單變量。
          ?
          ??? 4> 控制耦合 (Control Coupling)
          ?
          ??? 如果一個(gè)模塊通過開關(guān)、標(biāo)志、名字等控制信息,明顯得控制選擇另一模塊功能,這種耦合稱為控制耦合。控制耦合屬于中等程度的耦合,較之?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ī)模相對較小,彼此共性較多,使用控制耦合還是合算的。
          ?
          ??? 5> 外部耦合 (External Coupling)
          ?
          ??? 一組模塊都訪問同一全局簡單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)傳遞該全局變量的信息,則稱之為外部耦合。
          ?
          ??? 6> 公共耦合 (Common Coupling)
          ?
          ??? 公共耦合又稱公共環(huán)境耦合或數(shù)據(jù)區(qū)耦合。若多個(gè)模塊對同一個(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ù)性差。
          ?
          ??? 7> 內(nèi)容耦合 (Content Coupling)
          ?
          ??? 內(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ù)測。 內(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)化的高級語言,如COBOL中也可能出現(xiàn));
          ??? ④一個(gè)模塊有多個(gè)入口(這意味著一個(gè)模塊有多種功能)。
          ?
          ??? 一般講,在模塊劃分時(shí),應(yīng)當(dāng)盡量使用數(shù)據(jù)耦合。少用控制耦合(盡量轉(zhuǎn)成數(shù)據(jù)耦合),限制公共耦合的范圍,完全不用內(nèi)容耦合。
          ?
          ?
          ?
          ?




          -The End-

          posted on 2009-05-15 21:08 decode360-3 閱讀(3061) 評論(0)  編輯  收藏 所屬分類: Exam
          主站蜘蛛池模板: 隆德县| 梁山县| 寻乌县| 通海县| 北票市| 偏关县| 九江县| 大悟县| 赣榆县| 津市市| 久治县| 长治市| 万宁市| 习水县| 太湖县| 大余县| 黎川县| 芜湖县| 黑河市| 长丰县| 韶关市| 湖口县| 罗城| 庄浪县| 连平县| 原平市| 丰都县| 锦州市| 永川市| 白城市| 工布江达县| 茶陵县| 乌拉特后旗| 台湾省| 随州市| 正镶白旗| 长乐市| 仁寿县| 灵台县| 财经| 上高县|