<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    軟件設(shè)計“內(nèi)聚度”“耦合度”介紹
    ?
    一、聯(lián)系
    ?
    ??? 當(dāng)個程序段或語句(指令)引用了其它程序段或語句(指令)中所定義或使用的數(shù)據(jù)名(即存貯區(qū)、地址等)或代碼時,他們之間就發(fā)生了聯(lián)系。一個程序被劃分為若干模塊時,聯(lián)系既可存在于模塊之間,也可存在于一個模塊內(nèi)的程序段或語句之間,即模塊內(nèi)部。聯(lián)系反映了系統(tǒng)中程序段或語句之間的關(guān)系,不同類型的聯(lián)系構(gòu)成不同質(zhì)量的系統(tǒng)。因此,聯(lián)系是系統(tǒng)設(shè)計必須考慮的重要問題。
    ?
    ??? 系統(tǒng)被分成若干模塊后,模塊同模塊的聯(lián)系稱為塊間聯(lián)系;一個模塊內(nèi)部各成份的聯(lián)系稱為塊內(nèi)聯(lián)系。顯然,模塊之間的聯(lián)系多,則模塊的相對獨(dú)立性就差,系統(tǒng)結(jié)構(gòu)就混亂;相反,模塊間的聯(lián)系少,各個模塊相對獨(dú)立性就強(qiáng),系統(tǒng)結(jié)構(gòu)就比較理想。同時,一個模塊內(nèi)部各成份聯(lián)系越緊密,該模塊越易理解和維護(hù)。
    ?
    ?
    二、評判模塊結(jié)構(gòu)的標(biāo)準(zhǔn)
    ?
    ??? 1.模塊獨(dú)立性
    ???
    ??? 模塊化是軟件設(shè)計和開發(fā)的基本原則和方法,是概要設(shè)計最主要的工作。模塊的劃分應(yīng)遵循一定的要求,以保證模塊劃分合理,并進(jìn)一步保證以此為依據(jù)開發(fā)出的軟件系統(tǒng)可靠性強(qiáng),易于理解和維護(hù)。根據(jù)軟件設(shè)計的模塊化、抽象、信息隱蔽和局部化等原則,可直接得出模塊化獨(dú)立性的概念。所謂模塊獨(dú)立性,即:不同模塊相互之間聯(lián)系盡可能少,應(yīng)盡可能減少公共的變量和數(shù)據(jù)結(jié)構(gòu);一個模塊應(yīng)盡可能在邏輯上獨(dú)立,有完整單一的功能。
    ?
    ??? 模塊獨(dú)立性(Moduleindependence)是軟件設(shè)計的重要原則。具有良好獨(dú)立性的模塊劃分,模塊功能完整獨(dú)立,數(shù)據(jù)接口簡單,程序易于實(shí)現(xiàn),易于理解和維護(hù)。獨(dú)立性限制了錯誤的作用范圍,使錯誤易于排除,因而可使軟件開發(fā)速度快,質(zhì)量高。
    ?
    ??? 為了進(jìn)一步測量和分析模塊獨(dú)立性,軟件工程學(xué)引入了兩個概念,從兩個方面來定性地度量模塊獨(dú)立性的程度,這兩個概念是模塊的內(nèi)聚度和模塊的耦合度
    ?
    ??? 2.塊內(nèi)聯(lián)系的度量——內(nèi)聚度
    ?
    ??? 軟件概要設(shè)計是以需求分析所產(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ù)奈恢蒙先ィ贸鱿到y(tǒng)的結(jié)構(gòu)圖。
    ?
    ??? 軟件概要設(shè)計的原則是模塊化、抽象化和信息隱藏,要達(dá)到這些原則,就要求模塊具有獨(dú)立性。模塊內(nèi)聚度用于衡量模塊內(nèi)部各成分之間彼此結(jié)合的緊密程度,模塊內(nèi)聚度由強(qiáng)到弱的順序如圖:
    ?
    ??? 高<----------------------------- 內(nèi)聚度 -----------------------------低
    ??? | 功能內(nèi)聚 | 信息內(nèi)聚 | 通信內(nèi)聚 | 過程內(nèi)聚 | 時間內(nèi)聚 | 邏輯內(nèi)聚 | 巧合內(nèi)聚 |
    ??? 強(qiáng)<--------------------------- 模塊獨(dú)立性 ----------------------------弱
    ?
    ??? 1> 功能內(nèi)聚 (Functional Cohesion)
    ?
    ??? 功能內(nèi)聚是內(nèi)聚度最高的一種模塊類型。如果模塊僅完成一個單一的功能,且該模塊的所有部分是實(shí)現(xiàn)這一功能所必須的,沒有多余的語句,則該模塊為功能內(nèi)聚。功能內(nèi)聚模塊的結(jié)構(gòu)緊湊、界面清晰,易于理解和維護(hù),因而可靠性強(qiáng);又由于其功能單一,故復(fù)用率高。所以它是模塊劃分時應(yīng)注意追求的一種模塊類型。
    ?
    ??? 2> 信息內(nèi)聚 (Informational Cohesion)
    ?
    ??? 這種模塊完成多個功能,各個功能都在同一數(shù)據(jù)結(jié)構(gòu)上操作,每一項(xiàng)功能都一個唯一的入口。這個模塊將根據(jù)不同的要求,確定該執(zhí)行哪一個功能。由于這個模塊的所有功能都是基于同一數(shù)據(jù)結(jié)構(gòu)(符號表),因此它是一個信息內(nèi)聚模塊。
    ?
    ??? 信息內(nèi)聚模塊可以看作多個功能內(nèi)聚模塊的組合,并且達(dá)到信息的隱蔽。即把某個數(shù)據(jù)結(jié)構(gòu)、資源或設(shè)備隱蔽在一個模塊內(nèi),不為別的模塊所知曉。如果一個模塊的各個成分和同一個功能密切相關(guān),而且一個成分的輸出作為另一個成分的輸入,則稱為順序內(nèi)聚
    ?
    ??? 順序內(nèi)聚的模塊內(nèi),后執(zhí)行的語句或語句段往往依賴先執(zhí)行的語句或語句段,以先執(zhí)行的部分為條件。由于模塊內(nèi)各處理元素間存在著這種邏輯聯(lián)系,所以順序內(nèi)聚模塊的可理解性很強(qiáng),屬高內(nèi)聚度類型模塊。
    ?
    ??? 3> 通信內(nèi)聚 (Communication Cohesion)
    ?
    ??? 若一個模塊中的各處理元素需引用共同的數(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)
    ?
    ??? 如果一個模塊內(nèi)的各個處理元素是相關(guān)的,而且必須按固定的次序執(zhí)行,這種內(nèi)聚就叫做過程內(nèi)聚。過程內(nèi)聚的各模塊內(nèi)往往體現(xiàn)為有次序的流程。
    ?
    ??? 在使用流程圖作為工具設(shè)計程序時,把流程圖中的某一部分劃出組成模塊,就得到過程內(nèi)聚模塊。例如把流程圖中的循環(huán)部分、判定部分、計算部分分成三個模塊,則這三個模塊都是過程內(nèi)聚的。
    ?
    ??? 5> 時間內(nèi)聚 (Classical Cohesion)
    ?
    ??? 時間內(nèi)聚又稱為經(jīng)典內(nèi)聚或瞬時內(nèi)聚。時間內(nèi)聚是指一個模塊中包含的任務(wù)需要在同一時間內(nèi)執(zhí)行(如初始化,結(jié)束等所需操作)。與巧合內(nèi)聚和邏輯內(nèi)聚相比,這種內(nèi)聚類型要稍強(qiáng)些,因?yàn)橹辽僭跁r間上,這些任務(wù)可以一起完成。但時間內(nèi)聚和偶然內(nèi)聚、邏輯內(nèi)聚一樣,都屬低內(nèi)聚度類型。
    ?
    ??? 6> 邏輯內(nèi)聚 (Logical Cohesion)
    ?
    ??? 一個模塊完成的任務(wù)在邏輯上屬于相同或相似的一類(例如用一個模塊產(chǎn)生各種類型的輸出),則該種模塊內(nèi)的聯(lián)系稱為邏輯內(nèi)聚。每次調(diào)用模塊時,由傳送給模塊的判定參數(shù)來確定該模塊應(yīng)執(zhí)行哪一種功能。
    ?
    ??? 邏輯內(nèi)聚的模塊各成分之間在功能上并無關(guān)系,即使局部功能的修改有時也會影響全局,因此主要的困難有:
    ?
    ??? ① 修改困難,調(diào)用模塊中有一個要對其改動,還要考慮到其它調(diào)用模塊;
    ??? ② 模塊內(nèi)需要增加開關(guān),以判別是誰調(diào)用,因而增加了塊間聯(lián)系;
    ??? ③ 實(shí)際上每次調(diào)用只執(zhí)行模塊中的一部分,而其它部分也一同被裝入內(nèi)存,因而效率不高。
    ?
    ??? 7> 巧合內(nèi)聚(Coincidental Cohesion)
    ?
    ??? 塊內(nèi)的各個任務(wù)(通過語句或指令來實(shí)現(xiàn)的)沒有什么有意義的聯(lián)系,它們之所以能構(gòu)成一個模塊完全是偶然的原因。
    ?
    ??? 這類模塊內(nèi)部沒有實(shí)質(zhì)性的聯(lián)系,很可能在某種情況下一個調(diào)用模塊需要對它修改而別的模塊不需要。這時就很難處理。同時,這種模塊的含義也不易理解,甚至難以為它取一個合適的名字,偶然內(nèi)聚的模塊也難于測試。所以,在空間允許的情況下,不應(yīng)使用這種模塊。
    ?
    ??? 3.塊間聯(lián)系的度量——耦合度
    ?
    ??? 耦合度是對一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量。耦合強(qiáng)弱取決于模塊間接口的復(fù)雜程度、進(jìn)入訪問一個模塊的點(diǎn)及通過接口的數(shù)據(jù)。在軟件設(shè)計中應(yīng)該追求盡可能松散的耦合系統(tǒng),在這樣的系統(tǒng)中可以研究、測試或修改、維護(hù)任何一個模塊,而不需要對系統(tǒng)的其它模塊有很多的了解或影響其它模塊的實(shí)現(xiàn)。此外,當(dāng)某處發(fā)生錯誤時,低耦合度系統(tǒng)的錯誤傳播的范圍相對小些。
    ?
    ??? 耦合度取決于各個模塊間接口的復(fù)雜程度、調(diào)用模塊的方式,以及哪些信息通過接口。耦合度的強(qiáng)弱依賴以下幾個因素:
    ?
    ??? (1)一個模塊對另一個模塊的調(diào)用
    ??? (2)一個模塊向另一個模塊傳遞的數(shù)據(jù)量
    ??? (3)一個模塊施加到另一個模塊的控制的多少
    ??? (4)模塊之間接口的復(fù)雜度
    ?
    ??? 一般模塊之間可能的連接方式有以下幾種,耦合度由低到高如下所示:
    ?
    ??? 低<------------------------------ 耦合性 ------------------------------低
    ??? | 非直接耦合 | 數(shù)據(jù)耦合 | 標(biāo)記耦合 | 控制耦合 | 外部耦合 | 公共耦合 | 內(nèi)容耦合 |
    ??? 強(qiáng)<---------------------------- 模塊獨(dú)立性 -----------------------------弱
    ?
    ??? 1> 非直接耦合 (Nondirective Coupling)
    ?
    ??? 指兩個模塊彼此完全獨(dú)立,沒有直接聯(lián)系。它們之間的唯一聯(lián)系僅僅在于它們同屬于一個軟件系統(tǒng)或同有一個上層模塊。這是耦合程度最低的一種。當(dāng)然,系統(tǒng)中只可能有一部分模塊屬此種聯(lián)系,因?yàn)橐粋€程序系統(tǒng)中不可能所有的模塊都完全沒有聯(lián)系。
    ?
    ??? 2> 數(shù)據(jù)耦合 (Data Coupling)
    ?
    ??? 兩個模塊彼此交換數(shù)據(jù),如一個模塊的輸出數(shù)據(jù)是另一個模塊的輸入數(shù)據(jù),或一個模塊帶參數(shù)調(diào)用另一個模塊,下層模塊又返回參數(shù),則稱為數(shù)據(jù)耦合。注意這里的數(shù)據(jù)指的是簡單數(shù)據(jù),而不包括控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量。
    ?
    ??? 應(yīng)該說,在一個軟件系統(tǒng)中,此種耦合是不可避免的,且有其積極意義。因?yàn)槿魏喂δ艿膶?shí)現(xiàn)都離不開數(shù)據(jù)的產(chǎn)生、表示和傳遞。數(shù)據(jù)耦合的聯(lián)系程度也較低。
    ?
    ??? 3> 標(biāo)記耦合 (Stamp Coupling)
    ?
    ??? 如果一組模塊通過參數(shù)傳遞記錄信息,這稱為標(biāo)記耦合。這個記錄是某一數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),而不是簡單變量。
    ?
    ??? 4> 控制耦合 (Control Coupling)
    ?
    ??? 如果一個模塊通過開關(guān)、標(biāo)志、名字等控制信息,明顯得控制選擇另一模塊功能,這種耦合稱為控制耦合。控制耦合屬于中等程度的耦合,較之?dāng)?shù)據(jù)耦合模塊間的聯(lián)系更為緊密。但控制耦合不是一種必須存在的耦合。
    ?
    ??? 當(dāng)被調(diào)用模塊接收到控制信息作為輸入?yún)?shù)時,說明該模塊內(nèi)部存在多個并列的邏輯路徑,即有多個功能。控制變量用以從多個功能中選擇所要執(zhí)行的部分,因而控制耦合是完全可以避免的。排除控制耦合可按如下步驟進(jìn)行:
    ?
    ??? ① 找出模塊調(diào)用時所用的一個或多個控制變量;
    ??? ② 在被調(diào)模塊中根據(jù)控制變量找出所有的流程;
    ??? ③ 將每一個流程分解為一個獨(dú)立的模塊;
    ??? ④ 將原被調(diào)模塊中的流程選擇部分移到上層模塊,變?yōu)檎{(diào)用判斷。
    ?
    ??? 通過以上變換,可以將控制耦合變?yōu)閿?shù)據(jù)耦合。由于控制耦合增加了設(shè)計和理解的復(fù)雜程度,因此在模塊設(shè)計時要盡量避免使用。當(dāng)然,如果模塊內(nèi)每一個控制流程規(guī)模相對較小,彼此共性較多,使用控制耦合還是合算的。
    ?
    ??? 5> 外部耦合 (External Coupling)
    ?
    ??? 一組模塊都訪問同一全局簡單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)傳遞該全局變量的信息,則稱之為外部耦合。
    ?
    ??? 6> 公共耦合 (Common Coupling)
    ?
    ??? 公共耦合又稱公共環(huán)境耦合或數(shù)據(jù)區(qū)耦合。若多個模塊對同一個數(shù)據(jù)區(qū)進(jìn)行存取操作,它們之間的關(guān)系稱為公共耦合。公共數(shù)據(jù)區(qū)可以是全程變量、共享的數(shù)據(jù)區(qū)、內(nèi)存的公共復(fù)蓋區(qū)、外存上的文件、物理設(shè)備等。當(dāng)兩個模塊共享的數(shù)據(jù)很多,通過參數(shù)傳遞可能不方便時,可以使用公共耦合。公共耦合共享數(shù)據(jù)區(qū)的模塊越多,數(shù)據(jù)區(qū)的規(guī)模越大,則耦合程度越強(qiáng)。公共耦合最弱的一種形式是:兩個模塊共享一個數(shù)據(jù)變量,一個模塊只向里寫數(shù)據(jù),另一個模塊只從里讀數(shù)據(jù)。
    ?
    ??? 當(dāng)公共耦合程度很強(qiáng)時,會造成關(guān)系錯綜復(fù)雜,難以控制,錯誤傳遞機(jī)會增加,系統(tǒng)可靠性降低,可理解、維護(hù)性差。
    ?
    ??? 7> 內(nèi)容耦合 (Content Coupling)
    ?
    ??? 內(nèi)容耦合是耦合程序最高的一種形式。若一個模塊直接訪問另一模塊的內(nèi)部代碼或數(shù)據(jù),即出現(xiàn)內(nèi)容耦合。內(nèi)容耦合的存在嚴(yán)重破壞了模塊的獨(dú)立性和系統(tǒng)的結(jié)構(gòu)化,代碼互相糾纏,運(yùn)行錯綜復(fù)雜,程序的靜態(tài)結(jié)構(gòu)和動態(tài)結(jié)構(gòu)很不一致,其惡劣結(jié)果往往不可預(yù)測。 內(nèi)容耦合往往表現(xiàn)為以下幾種形式:
    ?
    ??? ①一個模塊訪問另一模塊的內(nèi)部代碼或數(shù)據(jù);
    ??? ②一個模塊不通過正常入口而轉(zhuǎn)到另一個模塊的內(nèi)部(如使用GOTO語句或JMP指令直接進(jìn)入另一模塊內(nèi)部);
    ??? ③兩個模塊有一部分代碼重迭(可能出現(xiàn)在匯編程序中,在一些非結(jié)構(gòu)化的高級語言,如COBOL中也可能出現(xiàn));
    ??? ④一個模塊有多個入口(這意味著一個模塊有多種功能)。
    ?
    ??? 一般講,在模塊劃分時,應(yīng)當(dāng)盡量使用數(shù)據(jù)耦合。少用控制耦合(盡量轉(zhuǎn)成數(shù)據(jù)耦合),限制公共耦合的范圍,完全不用內(nèi)容耦合。
    ?
    ?
    ?
    ?
    ?
    posted on 2009-05-15 21:08 decode360 閱讀(480) 評論(0)  編輯  收藏 所屬分類: 01.IT_Base
    主站蜘蛛池模板: 99久久免费国产精精品| 亚洲综合图色40p| 日韩精品无码免费专区午夜| 亚洲日韩一区二区三区| 亚洲AV乱码一区二区三区林ゆな| 国产免费av一区二区三区| 免费无码AV电影在线观看| 99免费观看视频| 99久久婷婷免费国产综合精品| 另类小说亚洲色图| 亚洲kkk4444在线观看| 精品日韩亚洲AV无码一区二区三区 | 亚洲AV日韩AV天堂久久| 亚洲成av人在片观看| 美女黄网站人色视频免费国产| 1a级毛片免费观看| 久久免费高清视频| 在线看片免费人成视频久网下载 | 久久精品免费视频观看| 一级做a爰片性色毛片免费网站 | 无码精品A∨在线观看免费| 久99久精品免费视频热77| 三级黄色片免费看| 99热在线日韩精品免费| 久久毛片免费看一区二区三区| 理论秋霞在线看免费| 美女视频黄视大全视频免费的| 亚洲GV天堂无码男同在线观看| 亚洲一级毛片免观看| 亚洲一级视频在线观看| 亚洲性无码av在线| 亚洲激情黄色小说| 亚洲欧洲日产国产最新| 亚洲中文字幕人成乱码| 亚洲成a人片在线看| 亚洲国产最大av| 亚洲日韩精品无码专区| 亚洲国产综合AV在线观看| 亚洲精品动漫免费二区| 欧洲亚洲国产精华液| 美女又黄又免费的视频|