第5章軟件設(shè)計(jì)(模塊)_第1頁(yè)
第5章軟件設(shè)計(jì)(模塊)_第2頁(yè)
第5章軟件設(shè)計(jì)(模塊)_第3頁(yè)
第5章軟件設(shè)計(jì)(模塊)_第4頁(yè)
第5章軟件設(shè)計(jì)(模塊)_第5頁(yè)
已閱讀5頁(yè),還剩140頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 5.1 5.1 軟件設(shè)計(jì)概述軟件設(shè)計(jì)概述 5.2 5.2 軟件軟件體系結(jié)構(gòu)體系結(jié)構(gòu)介紹介紹 5.3 5.3 結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)模塊化結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)模塊化 5.4 5.4 結(jié)構(gòu)化的設(shè)計(jì)方法結(jié)構(gòu)化的設(shè)計(jì)方法 5.5 5.5 數(shù)據(jù)的設(shè)計(jì)數(shù)據(jù)的設(shè)計(jì) 5.6 5.6 界面界面設(shè)計(jì)設(shè)計(jì) 5.7 5.7 軟件詳細(xì)軟件詳細(xì)( (過(guò)程過(guò)程) )設(shè)計(jì)設(shè)計(jì) 5.8 5.8 設(shè)計(jì)中的幾個(gè)問(wèn)題設(shè)計(jì)中的幾個(gè)問(wèn)題內(nèi)內(nèi) 容容第第5 5章章 軟件設(shè)計(jì)軟件設(shè)計(jì)25.3.1 5.3.1 模塊特性模塊特性5.3.2 5.3.2 模塊的深度、寬度、扇入和扇出模塊的深度、寬度、扇入和扇出5.3.3 5.3.3 模塊的控制范圍和判定的

2、作用范圍模塊的控制范圍和判定的作用范圍5.3 5.3 軟件設(shè)計(jì)的基礎(chǔ)軟件設(shè)計(jì)的基礎(chǔ)模塊化模塊化3結(jié)構(gòu)化設(shè)計(jì)結(jié)構(gòu)化設(shè)計(jì)(Structured Design, SD)(Structured Design, SD) q 70 70年代中期提出;年代中期提出;q 采用結(jié)構(gòu)圖采用結(jié)構(gòu)圖(Structure Chart, SC)(Structure Chart, SC)和程序流和程序流 程圖程圖(Flow Chart, FC)(Flow Chart, FC)作為描述工具。作為描述工具。結(jié)構(gòu)化設(shè)計(jì)結(jié)構(gòu)化設(shè)計(jì)(SD)需求模型需求模型DFD+DD設(shè)計(jì)模型設(shè)計(jì)模型SC+FCq 通過(guò)通過(guò)對(duì)模塊的合理劃分對(duì)模塊的合理

3、劃分,得到軟件的體系,得到軟件的體系 結(jié)構(gòu)圖,進(jìn)而細(xì)化每個(gè)模塊內(nèi)部的流程。結(jié)構(gòu)圖,進(jìn)而細(xì)化每個(gè)模塊內(nèi)部的流程。4模塊模塊: : 軟件被劃分成若干個(gè)獨(dú)立命名軟件被劃分成若干個(gè)獨(dú)立命名, ,可編址的部分??删幹返牟糠?。 模塊化模塊化: : 程序分程序分解解成若干個(gè)模塊,且成若干個(gè)模塊,且: : 5.3 5.3 結(jié)構(gòu)化結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)設(shè)計(jì)的基礎(chǔ)模塊化模塊化n 每一個(gè)模塊完成一個(gè)相對(duì)獨(dú)立的子功能每一個(gè)模塊完成一個(gè)相對(duì)獨(dú)立的子功能 n 每個(gè)模塊定義了輸入和輸出的功能。每個(gè)模塊定義了輸入和輸出的功能。n 若干個(gè)模塊集成,構(gòu)成一個(gè)整體,完成一個(gè)大功能。若干個(gè)模塊集成,構(gòu)成一個(gè)整體,完成一個(gè)大功能。 l模塊化

4、設(shè)計(jì)降低了復(fù)雜性模塊化設(shè)計(jì)降低了復(fù)雜性. .l有利于軟件的可維護(hù)性有利于軟件的可維護(hù)性. .l系統(tǒng)可并發(fā)開(kāi)發(fā),簡(jiǎn)化系統(tǒng)實(shí)現(xiàn)。系統(tǒng)可并發(fā)開(kāi)發(fā),簡(jiǎn)化系統(tǒng)實(shí)現(xiàn)。 模塊化模塊化設(shè)計(jì)的好處設(shè)計(jì)的好處: :5n 模塊的模塊的分解分解n 模塊的模塊的抽象抽象n 模塊的模塊的信息隱蔽信息隱蔽n 結(jié)構(gòu)化的模塊結(jié)構(gòu)化的模塊n 模塊的模塊的獨(dú)立性獨(dú)立性 內(nèi)聚、內(nèi)聚、 耦合。耦合。 5.3.1 5.3.1 模塊特性模塊特性6 1) 1) 模塊的分解模塊的分解n將問(wèn)題分解為各個(gè)可獨(dú)立解決的子問(wèn)題將問(wèn)題分解為各個(gè)可獨(dú)立解決的子問(wèn)題n目標(biāo)目標(biāo)( Goal ) :使模塊之間的依賴關(guān)系顯式化和使模塊之間的依賴關(guān)系顯式化和 最小

5、化最小化軟件總成本軟件總成本軟軟件件開(kāi)開(kāi)發(fā)發(fā)工工作作量量模塊數(shù)量模塊數(shù)量集成集成成本成本成本最小區(qū)域成本最小區(qū)域MC (P1+P2) C (P1) + C (P2)E (P1+P2) E (P1) + E (P2) C C 為問(wèn)題的復(fù)雜度,為問(wèn)題的復(fù)雜度, E E 為解題需要的工作量為解題需要的工作量 成本成本/模塊模塊圖圖 5-21 5-21 模塊的分解成本模塊的分解成本7強(qiáng)調(diào)一下強(qiáng)調(diào)一下: :nFew Interfaces: “Dont talk to many!”盡可能少的接口:盡可能少的接口:“不要對(duì)太多人講話不要對(duì)太多人講話”n Small Interfaces: “Dont tal

6、k a lot!”盡可能小的接口:盡可能小的接口:“不要講太多不要講太多”nExplicit Interfaces: “Talk loud and in public! Dont whisper!”顯式接口:顯式接口:“公開(kāi)的大聲講話公開(kāi)的大聲講話不要私下嘀咕不要私下嘀咕”n 容易將模塊組容易將模塊組 合成新的系統(tǒng)合成新的系統(tǒng)83) 3) 模塊的模塊的信息隱藏信息隱藏n將可能發(fā)生將可能發(fā)生變化變化的部分隱藏起來(lái)的部分隱藏起來(lái)2) 2) 模塊的抽象模塊的抽象4) 4) 結(jié)構(gòu)化的模塊結(jié)構(gòu)化的模塊 圖圖 5-22 非結(jié)構(gòu)化與結(jié)構(gòu)化的模塊非結(jié)構(gòu)化與結(jié)構(gòu)化的模塊 非結(jié)構(gòu)化的模塊非結(jié)構(gòu)化的模塊P0P=A+

7、BQ0Q=A-B ynyn結(jié)束結(jié)束輸入輸入A,B,P,Q開(kāi)始開(kāi)始結(jié)束結(jié)束P0P=A+BQ0Q=A-B開(kāi)始開(kāi)始ynyn結(jié)束結(jié)束輸入輸入A,B,P,Q 非結(jié)構(gòu)化的模塊非結(jié)構(gòu)化的模塊規(guī)格不嚴(yán)格規(guī)格不嚴(yán)格功夫不到家功夫不到家P0P=A+BQ=A-BQ0Q=A-B結(jié)構(gòu)化的模塊結(jié)構(gòu)化的模塊ynn結(jié)束結(jié)束輸入輸入A,B,P,Q開(kāi)始開(kāi)始y95) 5) 模塊獨(dú)立性之模塊獨(dú)立性之內(nèi)聚性內(nèi)聚性n模塊獨(dú)立性:用來(lái)判斷模塊模塊獨(dú)立性:用來(lái)判斷模塊構(gòu)造構(gòu)造是否合理的標(biāo)準(zhǔn)是否合理的標(biāo)準(zhǔn)。n從兩個(gè)方面來(lái)度量:從兩個(gè)方面來(lái)度量:q模塊內(nèi)部的聚合度模塊內(nèi)部的聚合度(Cohesion)(Cohesion): 描述描述某某一個(gè)功能模

8、塊一個(gè)功能模塊內(nèi)部?jī)?nèi)部的組成成分之間的組成成分之間相互相互關(guān)聯(lián)關(guān)聯(lián)的緊密程度。的緊密程度。q模塊之間的耦合度模塊之間的耦合度(Coupling)(Coupling): 多個(gè)多個(gè)模塊之間模塊之間相互關(guān)聯(lián)的緊密程度。相互關(guān)聯(lián)的緊密程度。n模塊化設(shè)計(jì)的目標(biāo):模塊化設(shè)計(jì)的目標(biāo):q高內(nèi)聚、低耦合高內(nèi)聚、低耦合(high cohesion and low (high cohesion and low coupling) coupling) 10內(nèi)聚強(qiáng)度的劃分內(nèi)聚強(qiáng)度的劃分1 偶然性內(nèi)聚偶然性內(nèi)聚Coincidental Cohesion3 時(shí)間性內(nèi)聚時(shí)間性內(nèi)聚Temporal Cohesion4 過(guò)程性內(nèi)

9、聚過(guò)程性內(nèi)聚Procedural Cohesion5 通訊性內(nèi)聚通訊性內(nèi)聚Communicational Cohesion6 順序性內(nèi)聚順序性內(nèi)聚Sequential Cohesion7 功能性內(nèi)聚功能性內(nèi)聚Functional Cohesion弱弱強(qiáng)強(qiáng)低內(nèi)聚低內(nèi)聚中內(nèi)聚中內(nèi)聚高內(nèi)聚高內(nèi)聚2 邏輯性內(nèi)聚邏輯性內(nèi)聚Logical Cohesion 模塊的模塊的內(nèi)聚性內(nèi)聚性11(1) (1) 偶然性內(nèi)聚偶然性內(nèi)聚n偶然性內(nèi)聚偶然性內(nèi)聚( Coincidental) : q構(gòu)成模塊的各組成部分構(gòu)成模塊的各組成部分無(wú)無(wú)任何關(guān)聯(lián)。任何關(guān)聯(lián)。q通常用于庫(kù)函數(shù)管理,將多個(gè)通常用于庫(kù)函數(shù)管理,將多個(gè)相互無(wú)關(guān)相

10、互無(wú)關(guān)但比較但比較 功能類(lèi)似功能類(lèi)似的模塊放置在同一個(gè)模塊內(nèi)。的模塊放置在同一個(gè)模塊內(nèi)。sin()cos()tg()ctg()math()缺點(diǎn):缺點(diǎn):產(chǎn)品的可維護(hù)性退化;模塊不可復(fù)用,增加軟件成本。產(chǎn)品的可維護(hù)性退化;模塊不可復(fù)用,增加軟件成本。解決解決:將模塊分成更小的模塊,每個(gè)小模塊執(zhí)行一個(gè)操作。:將模塊分成更小的模塊,每個(gè)小模塊執(zhí)行一個(gè)操作。12(2) (2) 邏輯性內(nèi)聚邏輯性內(nèi)聚n邏輯性邏輯性(Logical)(Logical)內(nèi)聚:內(nèi)聚:q一個(gè)模塊中同時(shí)含有幾一個(gè)模塊中同時(shí)含有幾 個(gè)操作,這些操作之間個(gè)操作,這些操作之間 既既無(wú)順序關(guān)系無(wú)順序關(guān)系,也無(wú)數(shù)也無(wú)數(shù) 據(jù)共享關(guān)系據(jù)共享關(guān)系。

11、問(wèn)題:?jiǎn)栴}:接口難于理解;完成多個(gè)操作的代碼互相糾纏在接口難于理解;完成多個(gè)操作的代碼互相糾纏在 一起,導(dǎo)致嚴(yán)重的維護(hù)問(wèn)題。一起,導(dǎo)致嚴(yán)重的維護(hù)問(wèn)題。q這些操作僅僅是因?yàn)檫@些操作僅僅是因?yàn)榭刂屏骺刂屏?,或者說(shuō),或者說(shuō)“邏輯邏輯”的的 原因才聯(lián)系到一起。它們都被包括在一個(gè)很大原因才聯(lián)系到一起。它們都被包括在一個(gè)很大 的的ifif或者或者casecase語(yǔ)句中,彼此之間并沒(méi)有任何其語(yǔ)句中,彼此之間并沒(méi)有任何其 它邏輯上的聯(lián)系。它邏輯上的聯(lián)系。q它們的執(zhí)行與否由外面?zhèn)鬟M(jìn)來(lái)的它們的執(zhí)行與否由外面?zhèn)鬟M(jìn)來(lái)的控制標(biāo)志控制標(biāo)志所決定所決定輸入一組數(shù)輸入一組數(shù)求最大求最大/最小值最小值計(jì)算最大值計(jì)算最大值計(jì)算最

12、小值計(jì)算最小值輸出結(jié)果輸出結(jié)果求最大求最大求最值求最值圖圖 5-23 5-23 邏輯性內(nèi)聚模塊邏輯性內(nèi)聚模塊13(3) (3) 時(shí)間性內(nèi)聚時(shí)間性內(nèi)聚(Temporal cohesion)(Temporal cohesion)n時(shí)間性內(nèi)聚:時(shí)間性內(nèi)聚:q模塊的各個(gè)成分必須在模塊的各個(gè)成分必須在同一時(shí)間段同一時(shí)間段執(zhí)行,但各執(zhí)行,但各 個(gè)成分之間個(gè)成分之間無(wú)必然的聯(lián)系無(wú)必然的聯(lián)系。n 問(wèn)題:?jiǎn)栴}:不同的功能混在一個(gè)模塊中,有時(shí)共用不同的功能混在一個(gè)模塊中,有時(shí)共用 部分編碼,使局部功能的修改牽動(dòng)全局。部分編碼,使局部功能的修改牽動(dòng)全局。Startup()讀取讀取配置文件配置文件初始化初始化臨時(shí)文件

13、臨時(shí)文件初始化初始化屏幕顯示屏幕顯示分配分配內(nèi)存空間內(nèi)存空間14(4 4)過(guò)程內(nèi)聚)過(guò)程內(nèi)聚 (Procedure)(Procedure)模塊的各個(gè)成分處理模塊的各個(gè)成分處理動(dòng)作不同動(dòng)作不同,但,但受同一控制受同一控制 流流支配支配(把幾個(gè)依次調(diào)用過(guò)程放在一起把幾個(gè)依次調(diào)用過(guò)程放在一起, 但一個(gè)過(guò)程但一個(gè)過(guò)程 的輸出并不一定是下一個(gè)過(guò)程的輸入的輸出并不一定是下一個(gè)過(guò)程的輸入).讀入讀入成績(jī)單成績(jī)單審查審查成績(jī)單成績(jī)單讀入并審查讀入并審查成績(jī)單成績(jī)單統(tǒng)計(jì)統(tǒng)計(jì) 成績(jī)成績(jī) 打印打印成績(jī)成績(jī)統(tǒng)計(jì)并打印統(tǒng)計(jì)并打印成績(jī)單成績(jī)單圖圖 5- 24 過(guò)程內(nèi)聚模塊過(guò)程內(nèi)聚模塊例:例:15(5) (5) 通訊性內(nèi)聚

14、通訊性內(nèi)聚n通訊性內(nèi)聚通訊性內(nèi)聚 (Communicational)q模塊內(nèi)各部分操作訪問(wèn)模塊內(nèi)各部分操作訪問(wèn)相同的相同的數(shù)據(jù)數(shù)據(jù)q除此之外,再無(wú)任何關(guān)系除此之外,再無(wú)任何關(guān)系q“無(wú)特定的次序,非單一功能無(wú)特定的次序,非單一功能”刪除刪除修改修改新建新建查詢查詢文件文件用戶用戶信息信息優(yōu)點(diǎn):優(yōu)點(diǎn):容易維護(hù)容易維護(hù),易易修改修改缺點(diǎn):缺點(diǎn):難以復(fù)用難以復(fù)用查詢姓名查詢姓名修改電話號(hào)碼修改電話號(hào)碼圖圖 5- 25 通訊通訊內(nèi)聚模塊內(nèi)聚模塊16(6) (6) 順序性內(nèi)聚順序性內(nèi)聚n順序性內(nèi)聚順序性內(nèi)聚(Sequential Cohesion)(Sequential Cohesion) :q模塊完成多

15、個(gè)功能,各功能模塊完成多個(gè)功能,各功能 都在都在同一數(shù)據(jù)結(jié)構(gòu)上操作同一數(shù)據(jù)結(jié)構(gòu)上操作。順序順序內(nèi)聚內(nèi)聚順序順序內(nèi)聚內(nèi)聚打開(kāi)文件打開(kāi)文件讀文件讀文件計(jì)算計(jì)算輸出結(jié)果輸出結(jié)果關(guān)閉文件關(guān)閉文件圖圖 5-26 順序內(nèi)聚模塊順序內(nèi)聚模塊q各功能之間各功能之間按順序按順序執(zhí)行,執(zhí)行, 形成操作序列;形成操作序列;q上一個(gè)功能的上一個(gè)功能的輸出是下輸出是下 一個(gè)功能的輸入一個(gè)功能的輸入;17(7) (7) 功能性內(nèi)聚功能性內(nèi)聚(Functional Cohesion )(Functional Cohesion ) n功能性內(nèi)聚:模塊中各個(gè)部分都是為完成一功能性內(nèi)聚:模塊中各個(gè)部分都是為完成一 項(xiàng)項(xiàng)單一的功能

16、單一的功能而協(xié)同工作。而協(xié)同工作。q模塊只執(zhí)行模塊只執(zhí)行單一的單一的計(jì)算并返回結(jié)果計(jì)算并返回結(jié)果, ,易修改、易修改、 易替換、易維護(hù)。易替換、易維護(hù)。q模塊的功能只是模塊的功能只是生成特定生成特定的輸出的輸出,無(wú)副作用無(wú)副作用, , 對(duì)其他模塊無(wú)影響對(duì)其他模塊無(wú)影響, ,模塊的可復(fù)用性高。模塊的可復(fù)用性高。 q這類(lèi)模塊通常粒度最小,且不可分解。這類(lèi)模塊通常粒度最小,且不可分解。18計(jì)算數(shù)學(xué)函數(shù)的模塊如計(jì)算數(shù)學(xué)函數(shù)的模塊如根據(jù)輸入的角度,根據(jù)輸入的角度, 計(jì)算正弦計(jì)算正弦。 n如下是功能內(nèi)聚模塊如下是功能內(nèi)聚模塊: 矩陣矩陣結(jié)果結(jié)果功能內(nèi)聚功能內(nèi)聚順順 序序 內(nèi)內(nèi) 聚聚構(gòu)造構(gòu)造矩陣矩陣輸出輸出

17、求解求解 未知數(shù)未知數(shù)圖圖 5-27 模塊模塊 根據(jù)一系列方程求解未知數(shù)的模塊根據(jù)一系列方程求解未知數(shù)的模塊在一工廠中在一工廠中, ,從不同的監(jiān)控設(shè)備獲取數(shù)據(jù)從不同的監(jiān)控設(shè)備獲取數(shù)據(jù), ,并計(jì)算并計(jì)算 某一過(guò)程的產(chǎn)量某一過(guò)程的產(chǎn)量( (占理論最大值的百分比占理論最大值的百分比) )的模塊的模塊。19n更新數(shù)據(jù)庫(kù)更新數(shù)據(jù)庫(kù)n創(chuàng)建新文件的模塊創(chuàng)建新文件的模塊. .不是功能內(nèi)聚模塊不是功能內(nèi)聚模塊: :n和用戶交互的模塊和用戶交互的模塊. . 因?yàn)閷?duì)數(shù)據(jù)庫(kù)或文件系統(tǒng)有副作用因?yàn)閷?duì)數(shù)據(jù)庫(kù)或文件系統(tǒng)有副作用. . 向用戶顯示提示信息是一種輸出向用戶顯示提示信息是一種輸出, ,但違但違 反了功能內(nèi)聚模塊的

18、惟一輸出是執(zhí)行反了功能內(nèi)聚模塊的惟一輸出是執(zhí)行結(jié)束時(shí)結(jié)束時(shí) 的返回結(jié)果的返回結(jié)果這一原則這一原則. . 20算多個(gè)地點(diǎn)的算多個(gè)地點(diǎn)的每日平均溫度每日平均溫度初始化求和初始化求和并打開(kāi)文件并打開(kāi)文件創(chuàng)建新的創(chuàng)建新的溫度記錄溫度記錄存儲(chǔ)溫存儲(chǔ)溫度記錄度記錄關(guān)閉文件并關(guān)閉文件并打印平均溫度打印平均溫度功能性內(nèi)聚功能性內(nèi)聚偶然內(nèi)聚偶然內(nèi)聚偶然內(nèi)聚偶然內(nèi)聚功能性內(nèi)聚功能性內(nèi)聚讀取地點(diǎn)、讀取地點(diǎn)、時(shí)間和溫度時(shí)間和溫度存儲(chǔ)特定存儲(chǔ)特定地點(diǎn)溫度地點(diǎn)溫度編輯地點(diǎn)、時(shí)間編輯地點(diǎn)、時(shí)間或溫度字段或溫度字段功能性內(nèi)聚功能性內(nèi)聚功能性內(nèi)聚功能性內(nèi)聚功能性內(nèi)聚功能性內(nèi)聚邏輯內(nèi)聚邏輯內(nèi)聚圖圖 5-28 例例21內(nèi)聚強(qiáng)度的劃

19、分內(nèi)聚強(qiáng)度的劃分該模塊是否該模塊是否只完只完成單一成單一的功能?的功能?7 功能性內(nèi)聚功能性內(nèi)聚6 順序性內(nèi)聚順序性內(nèi)聚5 通信性內(nèi)聚通信性內(nèi)聚4過(guò)程性內(nèi)聚過(guò)程性內(nèi)聚3時(shí)間性內(nèi)聚時(shí)間性內(nèi)聚2邏輯性內(nèi)聚邏輯性內(nèi)聚1偶然性內(nèi)聚偶然性內(nèi)聚模塊內(nèi)的模塊內(nèi)的活動(dòng)依據(jù)活動(dòng)依據(jù)什么發(fā)生什么發(fā)生聯(lián)系?聯(lián)系?次序是否次序是否重要?重要?次序次序是否是否 重要?重要?所有的活所有的活動(dòng)是動(dòng)是同一類(lèi)的嗎?同一類(lèi)的嗎?NONOYESNO數(shù)數(shù)據(jù)據(jù)YESNO控控制制流流都不是都不是YESYES圖圖 5-29 內(nèi)聚強(qiáng)度的劃分內(nèi)聚強(qiáng)度的劃分22小結(jié)小結(jié)內(nèi)聚類(lèi)型內(nèi)聚類(lèi)型說(shuō)說(shuō) 明明偶然性內(nèi)聚偶然性內(nèi)聚各組成部分在功能上各組成部分

20、在功能上互不相關(guān)互不相關(guān)邏輯性內(nèi)聚邏輯性內(nèi)聚各組成部分各組成部分邏輯功能相似邏輯功能相似時(shí)間性內(nèi)聚時(shí)間性內(nèi)聚各組成部分需要在各組成部分需要在同一時(shí)間內(nèi)同一時(shí)間內(nèi)執(zhí)行執(zhí)行過(guò)程性內(nèi)聚過(guò)程性內(nèi)聚各組成部分必須按照某一特定的各組成部分必須按照某一特定的控制次序執(zhí)行控制次序執(zhí)行,前一個(gè)的輸出數(shù)據(jù)前一個(gè)的輸出數(shù)據(jù)不一定不一定為后一個(gè)的輸入數(shù)據(jù)為后一個(gè)的輸入數(shù)據(jù)通信性內(nèi)聚通信性內(nèi)聚各組成部分處理各組成部分處理公共的數(shù)據(jù)公共的數(shù)據(jù)順序性內(nèi)聚順序性內(nèi)聚各組成部分各組成部分順序執(zhí)行順序執(zhí)行,前一個(gè)的輸出數(shù)據(jù)為后一,前一個(gè)的輸出數(shù)據(jù)為后一個(gè)的輸入數(shù)據(jù)個(gè)的輸入數(shù)據(jù)功能性內(nèi)聚功能性內(nèi)聚內(nèi)部所有活動(dòng)均完成內(nèi)部所有活動(dòng)均完

21、成單一功能單一功能23(8) (8) 層內(nèi)聚層內(nèi)聚 (layer cohesion)(layer cohesion)把向用戶或高層提供相關(guān)服務(wù)的功能放在一起把向用戶或高層提供相關(guān)服務(wù)的功能放在一起用戶界面用戶界面應(yīng)用邏輯應(yīng)用邏輯訪問(wèn)操訪問(wèn)操作系統(tǒng)作系統(tǒng)訪問(wèn)訪問(wèn)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)網(wǎng)絡(luò)通信網(wǎng)絡(luò)通信圖圖 5-30 層次內(nèi)聚例層次內(nèi)聚例應(yīng)用程序的典型層次應(yīng)用程序的典型層次處理應(yīng)用協(xié)議處理應(yīng)用協(xié)議處理連接處理連接處理包處理包傳輸和接收傳輸和接收通信系統(tǒng)的簡(jiǎn)化層次通信系統(tǒng)的簡(jiǎn)化層次24以下相關(guān)的服務(wù)是否可以放在同一層次中以下相關(guān)的服務(wù)是否可以放在同一層次中?計(jì)算服務(wù)計(jì)算服務(wù)n 消息或數(shù)據(jù)傳輸服務(wù)消息或數(shù)據(jù)傳輸服

22、務(wù)n 數(shù)據(jù)存儲(chǔ)服務(wù)數(shù)據(jù)存儲(chǔ)服務(wù)n 管理安全服務(wù)管理安全服務(wù)n 用戶交互服務(wù)用戶交互服務(wù)n 訪問(wèn)操作系統(tǒng)服務(wù)訪問(wèn)操作系統(tǒng)服務(wù)n 硬件交互服務(wù)硬件交互服務(wù)25層內(nèi)聚優(yōu)點(diǎn)層內(nèi)聚優(yōu)點(diǎn)替換高層模塊對(duì)底層模塊無(wú)影響替換高層模塊對(duì)底層模塊無(wú)影響n 低層服務(wù)不訪問(wèn)高層服務(wù)低層服務(wù)不訪問(wèn)高層服務(wù),這樣可以用等這樣可以用等 價(jià)的層替換低層價(jià)的層替換低層.但必須復(fù)制該層所有的但必須復(fù)制該層所有的 API (Application Programming Interface) 使高層不受影響使高層不受影響.26 6) 6) 模塊獨(dú)立性之模塊獨(dú)立性之耦合度耦合度(Coupling)相互依賴相互依賴獨(dú)立獨(dú)立 高度耦合高度

23、耦合松散耦合松散耦合無(wú)耦合無(wú)耦合 l 耦合是模塊耦合是模塊間間相對(duì)獨(dú)立性的度量。相對(duì)獨(dú)立性的度量。圖圖 5-31 5-31 模塊耦合度模塊耦合度27耦合強(qiáng)度的劃分耦合強(qiáng)度的劃分1 1 非直接耦合非直接耦合No Direct CouplingNo Direct Coupling2 2 數(shù)據(jù)耦合數(shù)據(jù)耦合Data Coupling Data Coupling 3 3 特征耦合特征耦合Stamp CouplingStamp Coupling 4 4 控制耦合控制耦合Control CouplingControl Coupling 6 6 公共耦合公共耦合Common CouplingCommon Co

24、upling7 7 內(nèi)容耦合內(nèi)容耦合Content CouplingContent Coupling弱弱強(qiáng)強(qiáng)弱耦合弱耦合中耦合中耦合強(qiáng)耦合強(qiáng)耦合最強(qiáng)耦合最強(qiáng)耦合5 5 外部耦合外部耦合External CouplingExternal Coupling28(1 1)非直接耦合)非直接耦合( (NondirectionalNondirectional) ) 圖圖 5-32 非直接耦合模塊非直接耦合模塊n兩個(gè)模塊之間兩個(gè)模塊之間沒(méi)有直接關(guān)系沒(méi)有直接關(guān)系,它們之間的聯(lián)系,它們之間的聯(lián)系 完全是通過(guò)主模塊的控制和調(diào)用來(lái)實(shí)現(xiàn)的。完全是通過(guò)主模塊的控制和調(diào)用來(lái)實(shí)現(xiàn)的。計(jì)算軟件學(xué)院計(jì)算軟件學(xué)院學(xué)生的學(xué)習(xí)成績(jī)

25、學(xué)生的學(xué)習(xí)成績(jī)計(jì)算計(jì)算機(jī)學(xué)院計(jì)算計(jì)算機(jī)學(xué)院學(xué)生的學(xué)習(xí)成績(jī)學(xué)生的學(xué)習(xí)成績(jī) 29(2) (2) 數(shù)據(jù)耦合數(shù)據(jù)耦合(Data)(Data)q一個(gè)模塊訪問(wèn)另一個(gè)模塊時(shí),彼此之間是通過(guò)一個(gè)模塊訪問(wèn)另一個(gè)模塊時(shí),彼此之間是通過(guò)簡(jiǎn)單簡(jiǎn)單數(shù)據(jù)參數(shù)數(shù)據(jù)參數(shù) ( (不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量量) ) 來(lái)交換輸入、輸出信息的。來(lái)交換輸入、輸出信息的。 借款數(shù)借款數(shù) 利率利率 時(shí)間時(shí)間借款金額借款金額已還款金額已還款金額計(jì)算客戶信用卡帳單計(jì)算客戶信用卡帳單 計(jì)算借計(jì)算借/貸金額貸金額 圖圖 5-33 數(shù)據(jù)耦合模塊數(shù)據(jù)耦合模塊盡可能盡可能減少方減少方法中參法中參數(shù)數(shù)目數(shù)數(shù)目易

26、維護(hù)易維護(hù)30(3) (3) 特征耦合特征耦合 (Stamp) (Stamp) (標(biāo)記耦合標(biāo)記耦合) )通話通話記錄記錄記錄記錄 結(jié)果結(jié)果圖圖 5-34 特征耦合模塊特征耦合模塊計(jì)算客戶電話費(fèi)計(jì)算客戶電話費(fèi)如如,C/C+,C/C+中有語(yǔ)句中有語(yǔ)句: : check altitude (pointer check altitude (pointerto position record )to position record )這是不是特征耦合這是不是特征耦合? ? 位置記錄的指針指向位置位置記錄的指針指向位置記錄中的所有字段記錄中的所有字段. .所以所以把指針作為參數(shù)傳遞把指針作為參數(shù)傳遞, ,

27、可可能會(huì)出現(xiàn)這種耦合能會(huì)出現(xiàn)這種耦合. .n 模塊之間通過(guò)模塊之間通過(guò)參數(shù)表參數(shù)表傳遞記錄信息。傳遞記錄信息。n 這個(gè)記錄是這個(gè)記錄是復(fù)雜的數(shù)據(jù)結(jié)構(gòu)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)( (structstruct、classclass等等) ), 而不是簡(jiǎn)單類(lèi)型的變量。而不是簡(jiǎn)單類(lèi)型的變量。計(jì)算計(jì)算基礎(chǔ)基礎(chǔ)費(fèi)費(fèi)計(jì)算計(jì)算實(shí)際實(shí)際費(fèi)費(fèi)31public class Emailer public void sendEmail(Employee e, String text) sedEmail方法方法并不需要訪問(wèn)整個(gè)并不需要訪問(wèn)整個(gè)Employee對(duì)象對(duì)象,它它 實(shí)際上只需要訪問(wèn)實(shí)際上只需要訪問(wèn)email和和name.授予

28、全部的訪問(wèn)權(quán)限出授予全部的訪問(wèn)權(quán)限出 現(xiàn)了標(biāo)記耦合?,F(xiàn)了標(biāo)記耦合。 維護(hù)人員修改維護(hù)人員修改Employee類(lèi)時(shí)類(lèi)時(shí),必須檢查必須檢查sedEmail方方 法法,確定該方法是否需要修改。確定該方法是否需要修改。Employee類(lèi)也不能重用類(lèi)也不能重用 。 例例, , Emailer類(lèi)發(fā)送電子信函類(lèi)發(fā)送電子信函(sedEmail )方法方法32n 降低標(biāo)記耦合降低標(biāo)記耦合方法方法1,使用接口作為參數(shù)類(lèi)型使用接口作為參數(shù)類(lèi)型public interface Addressee /定義收件人接口定義收件人接口 public abstract String getName(); public abst

29、ract String getEmail();public class Employee implements Addressepublic class Emailer public void sendEmail(Addresse e,String text) sendEmail方法只允許訪問(wèn)它實(shí)際的方法只允許訪問(wèn)它實(shí)際的name和和email數(shù)據(jù)數(shù)據(jù),降低了標(biāo)記耦合。降低了標(biāo)記耦合。33n如果不需要?jiǎng)?chuàng)建如果不需要?jiǎng)?chuàng)建新的新的Addressee接口接口,也可使用也可使用Employee 的超類(lèi)的超類(lèi)(如如Person)作為作為sendEmail方法的參數(shù)類(lèi)型方法的參數(shù)類(lèi)型,可可 降低標(biāo)記耦合。

30、但使用接口更靈活。降低標(biāo)記耦合。但使用接口更靈活。n方法方法2,傳遞簡(jiǎn)單變量傳遞簡(jiǎn)單變量public class Emailer public void sendEmail(String name, String email, String text) 用數(shù)據(jù)耦合代替了標(biāo)記耦合用數(shù)據(jù)耦合代替了標(biāo)記耦合.34(4 4)控制耦合)控制耦合 (Control)(Control)A平均平均/最高最高(控制信號(hào))(控制信號(hào)) 成成績(jī)績(jī) 圖圖 5-35 模塊模塊 使用多態(tài)使用多態(tài) 降低這種降低這種耦合耦合n如果一個(gè)模塊通過(guò)傳送開(kāi)關(guān)、標(biāo)志、如果一個(gè)模塊通過(guò)傳送開(kāi)關(guān)、標(biāo)志、命令命令等等控制信控制信 息息,以控

31、制選擇另一模塊的功能,就是控制耦合。,以控制選擇另一模塊的功能,就是控制耦合。B計(jì)算平均計(jì)算平均或最高分?jǐn)?shù)或最高分?jǐn)?shù)Byn讀入分?jǐn)?shù)讀入分?jǐn)?shù)平均平均/最高最高?計(jì)算計(jì)算平均分?jǐn)?shù)平均分?jǐn)?shù)計(jì)算計(jì)算 最高分?jǐn)?shù)最高分?jǐn)?shù)輸出結(jié)果輸出結(jié)果邏輯性邏輯性內(nèi)聚內(nèi)聚35public routineX(String command) if (command.equals(“drawCircle”) drawCircle(); else drawRectangle(); 只要方法只要方法routineX的任何調(diào)用的任何調(diào)用者增加、刪除等新的命令者增加、刪除等新的命令,就必就必須修改該方法須修改該方法.n如果讓如果讓ro

32、utineX的調(diào)用者直的調(diào)用者直 接調(diào)用接調(diào)用drawCircle或或drawRectangle方法可降低耦合方法可降低耦合.n使用多態(tài)操作使用多態(tài)操作,有兩個(gè)獨(dú)立的類(lèi)有兩個(gè)獨(dú)立的類(lèi)Circle和和 Rectangle, routineX可由系統(tǒng)決定調(diào)用可由系統(tǒng)決定調(diào)用 哪個(gè)類(lèi)哪個(gè)類(lèi)draw方法方法.有時(shí)控制耦合是沒(méi)法或不應(yīng)該完全避免的。有時(shí)控制耦合是沒(méi)法或不應(yīng)該完全避免的。36(5) (5) 外部耦合外部耦合(External)(External)n一組模塊訪問(wèn)同一一組模塊訪問(wèn)同一全局簡(jiǎn)單變量全局簡(jiǎn)單變量而不是同一全而不是同一全 局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過(guò)參數(shù)表傳遞該全局局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通

33、過(guò)參數(shù)表傳遞該全局 變量的信息,則稱之為外部耦合。變量的信息,則稱之為外部耦合。ANMLFEDCBOPl對(duì)系統(tǒng)外部元素對(duì)系統(tǒng)外部元素- -如操作系統(tǒng)、共享庫(kù)或硬件的依賴如操作系統(tǒng)、共享庫(kù)或硬件的依賴l外部偶合必不可少外部偶合必不可少, ,但這種模塊數(shù)目應(yīng)盡量少。但這種模塊數(shù)目應(yīng)盡量少。 圖圖 5-36 外外部部37外部外部耦合耦合while ( global variable = 0)while ( global variable = 0) if (argument XYZ 25) if (argument XYZ 25) moduleAmoduleA();(); else else modu

34、leBmoduleB();(); ABglobal variable 圖圖5 537 37 外部耦合實(shí)例外部耦合實(shí)例模塊模塊A,BA,B可存取和修改全局變量模塊的值可存取和修改全局變量模塊的值使用全局變量的模塊相互耦合使用全局變量的模塊相互耦合.C+.C+中的中的constconst 或或JavaJava中的中的公有靜態(tài)變量公有靜態(tài)變量public static finalpublic static final是全局變量是全局變量. . 為全局變量創(chuàng)建一個(gè)包含公有方法的模塊為全局變量創(chuàng)建一個(gè)包含公有方法的模塊, ,通過(guò)調(diào)用這通過(guò)調(diào)用這 些方法些方法來(lái)獲取與設(shè)置數(shù)據(jù)來(lái)獲取與設(shè)置數(shù)據(jù). .這樣數(shù)據(jù)

35、的內(nèi)部表示就易于修改這樣數(shù)據(jù)的內(nèi)部表示就易于修改 了了, ,且可訪止惡意的破壞且可訪止惡意的破壞.set.set方法可以檢查修改的合法性方法可以檢查修改的合法性. . 38(6)(6)公共耦合公共耦合(Common)(Common)一組模塊訪問(wèn)一組模塊訪問(wèn) 同一個(gè)數(shù)據(jù)區(qū)同一個(gè)數(shù)據(jù)區(qū)。 公共數(shù)據(jù)區(qū)指:公共數(shù)據(jù)區(qū)指:n全局?jǐn)?shù)據(jù)結(jié)構(gòu)全局?jǐn)?shù)據(jù)結(jié)構(gòu)n共享通訊區(qū)共享通訊區(qū)n內(nèi)存公共覆蓋區(qū)內(nèi)存公共覆蓋區(qū)n公共的數(shù)據(jù)庫(kù)等公共的數(shù)據(jù)庫(kù)等AB 圖圖 5-39 5-39 緊密的公共耦合緊密的公共耦合問(wèn)題問(wèn)題: :n可讀性、可修改性、可讀性、可修改性、可維護(hù)、可復(fù)用性差可維護(hù)、可復(fù)用性差n數(shù)據(jù)暴露的多數(shù)據(jù)暴露的多,

36、,不安全不安全. .AB圖圖 5-38 5-38 松散的公共耦合松散的公共耦合公共數(shù)據(jù)區(qū)公共數(shù)據(jù)區(qū)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)39n作為公共耦合作為公共耦合, ,模塊會(huì)暴露比需要更多的數(shù)據(jù)模塊會(huì)暴露比需要更多的數(shù)據(jù), , 不安全不安全. .如每個(gè)模塊都可在更新?tīng)顟B(tài)下訪問(wèn)數(shù)如每個(gè)模塊都可在更新?tīng)顟B(tài)下訪問(wèn)數(shù) 據(jù)庫(kù)據(jù)庫(kù)( (工資報(bào)表數(shù)據(jù)庫(kù)工資報(bào)表數(shù)據(jù)庫(kù)),),沒(méi)受權(quán)沒(méi)受權(quán), ,就修改數(shù)據(jù)庫(kù)就修改數(shù)據(jù)庫(kù)說(shuō)明說(shuō)明:n解決方案解決方案 把所有描述信息放入數(shù)據(jù)庫(kù)中把所有描述信息放入數(shù)據(jù)庫(kù)中, ,一個(gè)模塊一個(gè)模塊初始化所有描述信息的值初始化所有描述信息的值, ,而其他模塊嚴(yán)格地而其他模塊嚴(yán)格地在只讀狀態(tài)下訪問(wèn)該數(shù)據(jù)庫(kù)在只讀狀

37、態(tài)下訪問(wèn)該數(shù)據(jù)庫(kù). . n問(wèn)題問(wèn)題: : 若特定語(yǔ)言不能與數(shù)據(jù)庫(kù)接口若特定語(yǔ)言不能與數(shù)據(jù)庫(kù)接口, ,怎么辦怎么辦? ? 40 說(shuō)明說(shuō)明: n解決方案解決方案1:1:使用公共耦合使用公共耦合, ,一個(gè)模塊初始化所有一個(gè)模塊初始化所有 描述信息的值描述信息的值, ,而其他模塊不能修改而其他模塊不能修改 描述信息的值描述信息的值. .人工進(jìn)行嚴(yán)格管理人工進(jìn)行嚴(yán)格管理n解決方案解決方案2:2:使用使用“信息隱藏信息隱藏”避免公共耦避免公共耦合合. .41(7) (7) 內(nèi)容耦合內(nèi)容耦合(Content Coupling)(Content Coupling)n如果發(fā)生下列情形,兩個(gè)模塊之間就發(fā)生了內(nèi)容耦

38、合如果發(fā)生下列情形,兩個(gè)模塊之間就發(fā)生了內(nèi)容耦合q一個(gè)模塊直接訪問(wèn)或修改另一個(gè)模塊的內(nèi)部數(shù)據(jù)一個(gè)模塊直接訪問(wèn)或修改另一個(gè)模塊的內(nèi)部數(shù)據(jù); ;ABCDA:goto C1 C:C1: BA 模塊代模塊代碼重疊碼重疊 Entry1 entry2 多入口模塊多入口模塊 A 進(jìn)入另一進(jìn)入另一模塊內(nèi)部模塊內(nèi)部 Bq一個(gè)模塊不通過(guò)正常入口轉(zhuǎn)到另一模塊內(nèi)部一個(gè)模塊不通過(guò)正常入口轉(zhuǎn)到另一模塊內(nèi)部; ;q一個(gè)模塊有多個(gè)入口。一個(gè)模塊有多個(gè)入口。q兩個(gè)模塊有一部分程序代碼重迭兩個(gè)模塊有一部分程序代碼重迭( (只可能出現(xiàn)在匯只可能出現(xiàn)在匯 編語(yǔ)言中編語(yǔ)言中););圖圖540 內(nèi)容內(nèi)容耦合實(shí)例耦合實(shí)例42public

39、class Line private Point start, end; public Point getStart() return start; public Point getEnd() return end; public class Arch private Line baseline; /假定假定 Line 的實(shí)例變量的實(shí)例變量 baseline是不可修改的是不可修改的 void slant (int newY) Point theEnd = baseline.getEnd(); theEnd.setLocation( theEnd.getX(), newY); nArchArch

40、類(lèi)中的方法類(lèi)中的方法slantslant 暗中修改了實(shí)例變量暗中修改了實(shí)例變量 baselinebaseline端點(diǎn)上的端點(diǎn)上的 PointPoint類(lèi)型變量的類(lèi)型變量的y y值。值。 (Line (Line類(lèi)沒(méi)有類(lèi)沒(méi)有setStartsetStart 和和setEndsetEnd方法方法, ,修改修改 操作是暗中進(jìn)行的。操作是暗中進(jìn)行的。n原因原因,slant,slant方法沒(méi)有方法沒(méi)有 訪問(wèn)訪問(wèn)LineLine對(duì)象對(duì)象, ,訪問(wèn)訪問(wèn) 關(guān)系更遠(yuǎn)的對(duì)象關(guān)系更遠(yuǎn)的對(duì)象 (Point(Point對(duì)象對(duì)象) )。43內(nèi)容耦合內(nèi)容耦合n內(nèi)容耦合違反了內(nèi)容耦合違反了“信息隱藏信息隱藏”的原則的原則。 為

41、了減少內(nèi)耦容合為了減少內(nèi)耦容合, ,應(yīng)當(dāng)封裝所有的實(shí)例變量應(yīng)當(dāng)封裝所有的實(shí)例變量, ,把它們聲明為把它們聲明為PrivatePrivate 型型, ,并為每個(gè)變量提供并為每個(gè)變量提供Get,Get,setset方法。方法。n在上例中在上例中, ,增加增加moveEndmoveEnd方法顯示地移動(dòng)方法顯示地移動(dòng)LineLine對(duì)象的對(duì)象的 端點(diǎn)。端點(diǎn)。slantslant方法應(yīng)調(diào)用方法應(yīng)調(diào)用moveEndmoveEnd方法。方法。 但程序員可繞過(guò)該方法但程序員可繞過(guò)該方法, ,修改修改LineLine對(duì)象。對(duì)象。n使使LineLine類(lèi)是不可改變的類(lèi)是不可改變的, ,對(duì)實(shí)例變量使用不可改變對(duì)實(shí)例

42、變量使用不可改變 的類(lèi)。的類(lèi)。44n通過(guò)模塊分解或合并,力求降低耦合提高內(nèi)聚。通過(guò)模塊分解或合并,力求降低耦合提高內(nèi)聚。如如C1 C1 ,C2C2有類(lèi)似功能,也有不同功有類(lèi)似功能,也有不同功能。可把功能類(lèi)似的部分分離出來(lái),能。可把功能類(lèi)似的部分分離出來(lái),增加一個(gè)公共下屬模塊增加一個(gè)公共下屬模塊 A C1 A C2 C C A B A C1A C2 如果余下的如果余下的C1 C1 ,C2C2比較簡(jiǎn)單,可分比較簡(jiǎn)單,可分別與其上級(jí)模塊合并,以減少控制別與其上級(jí)模塊合并,以減少控制的傳遞、全局?jǐn)?shù)據(jù)的引用和接口的的傳遞、全局?jǐn)?shù)據(jù)的引用和接口的復(fù)雜性。復(fù)雜性。圖圖541 降低耦合降低耦合實(shí)例實(shí)例45模塊

43、規(guī)模要適中模塊規(guī)模要適中n模塊過(guò)大模塊過(guò)大: :分解不充分,不易理解分解不充分,不易理解可以對(duì)功能進(jìn)一可以對(duì)功能進(jìn)一 步分解,生成一些下級(jí)模塊或同層模塊步分解,生成一些下級(jí)模塊或同層模塊。n模塊太小模塊太小: :開(kāi)銷(xiāo)過(guò)大、接口復(fù)雜開(kāi)銷(xiāo)過(guò)大、接口復(fù)雜把它合并到上把它合并到上 級(jí)模塊中去而不必單獨(dú)存在級(jí)模塊中去而不必單獨(dú)存在。n一個(gè)模塊的規(guī)模最好能寫(xiě)在一頁(yè)紙內(nèi),通常一個(gè)模塊的規(guī)模最好能寫(xiě)在一頁(yè)紙內(nèi),通常 不超過(guò)不超過(guò)6060行語(yǔ)句。行語(yǔ)句。l但是如果體積小的模塊是功能內(nèi)聚性模塊,或但是如果體積小的模塊是功能內(nèi)聚性模塊,或 者它為多個(gè)模塊所共享,或者調(diào)用它的上級(jí)模者它為多個(gè)模塊所共享,或者調(diào)用它的上

44、級(jí)模 塊很復(fù)雜,則不要把它合并到其它模塊中去。塊很復(fù)雜,則不要把它合并到其它模塊中去。 46耦合強(qiáng)度的劃分耦合強(qiáng)度的劃分內(nèi)聚類(lèi)型內(nèi)聚類(lèi)型說(shuō)明說(shuō)明非直接耦合非直接耦合兩個(gè)模塊之間兩個(gè)模塊之間沒(méi)有沒(méi)有直接關(guān)系直接關(guān)系數(shù)據(jù)耦合數(shù)據(jù)耦合通過(guò)通過(guò)簡(jiǎn)單數(shù)據(jù)參數(shù)簡(jiǎn)單數(shù)據(jù)參數(shù)交換信息交換信息特征耦合特征耦合通過(guò)通過(guò)復(fù)雜數(shù)據(jù)參數(shù)復(fù)雜數(shù)據(jù)參數(shù)交換信息交換信息控制耦合控制耦合傳送開(kāi)關(guān)、標(biāo)志、名字等傳送開(kāi)關(guān)、標(biāo)志、名字等控制信息控制信息外部耦合外部耦合訪問(wèn)訪問(wèn)同一全局簡(jiǎn)單變量同一全局簡(jiǎn)單變量公共耦合公共耦合訪問(wèn)訪問(wèn)同一個(gè)公共數(shù)據(jù)區(qū)同一個(gè)公共數(shù)據(jù)區(qū)內(nèi)容耦合內(nèi)容耦合一個(gè)模塊可一個(gè)模塊可直接訪問(wèn)直接訪問(wèn)另一模塊另一模塊耦合

45、度小結(jié)耦合度小結(jié)47耦合強(qiáng)度的等級(jí)耦合強(qiáng)度的等級(jí)兩模塊之間兩模塊之間是否是否沒(méi)有任沒(méi)有任 何信息傳遞?何信息傳遞?11 1 非直接耦合非直接耦合22 2 數(shù)據(jù)耦合數(shù)據(jù)耦合33 3 特征耦合特征耦合44 4 控制耦合控制耦合55 5 外部耦合外部耦合66 6 公共耦合公共耦合77 7 內(nèi)容耦合內(nèi)容耦合以何種方式以何種方式 傳遞信息?傳遞信息?傳遞的信傳遞的信息類(lèi)型?息類(lèi)型?共享共享數(shù)據(jù)數(shù)據(jù)YESNO簡(jiǎn)單簡(jiǎn)單類(lèi)型類(lèi)型參數(shù)參數(shù)表表傳遞的信傳遞的信息類(lèi)型?息類(lèi)型?直接直接讀取讀取數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)標(biāo)志標(biāo)志量量簡(jiǎn)單簡(jiǎn)單類(lèi)型類(lèi)型數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)圖圖542 耦合耦合強(qiáng)度等級(jí)強(qiáng)度等級(jí)48n耦合是影響軟件復(fù)雜程度

46、和設(shè)計(jì)質(zhì)量的重要耦合是影響軟件復(fù)雜程度和設(shè)計(jì)質(zhì)量的重要 因素因素,建立模塊間耦合度盡可能建立模塊間耦合度盡可能松散松散。耦合對(duì)模塊化設(shè)計(jì)的影響耦合對(duì)模塊化設(shè)計(jì)的影響q盡量使用盡量使用數(shù)據(jù)耦合數(shù)據(jù)耦合q少用控制耦合少用控制耦合q限制公共耦合的范圍限制公共耦合的范圍q堅(jiān)決避免使用內(nèi)容耦合堅(jiān)決避免使用內(nèi)容耦合(盡量盡量少少的交換數(shù)據(jù)的交換數(shù)據(jù) 盡量盡量簡(jiǎn)單簡(jiǎn)單的數(shù)據(jù)交換的數(shù)據(jù)交換)模塊間的接口要簡(jiǎn)單模塊間的接口要簡(jiǎn)單n 降低模塊間耦合度。降低模塊間耦合度。 49MDBCAEKLNGFHPRSJTIQ扇出扇出扇入扇入寬度寬度深深度度圖圖 5-43 模塊的扇入扇出模塊的扇入扇出15.3.2 5.3.2

47、模塊的深度、寬度、扇入和扇出模塊的深度、寬度、扇入和扇出5.3 結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)模塊化模塊化5.3.1 模塊特性模塊特性50(1) 模塊的扇入模塊的扇入(fan-in)和扇出和扇出(fan-out)n扇入高扇入高表示上級(jí)模塊多,表示上級(jí)模塊多, 可增加模塊的利用率??稍黾幽K的利用率。MM的扇入的扇入M M的扇出的扇出圖圖 5-43 模塊的扇入扇出模塊的扇入扇出2n扇出低扇出低表示下級(jí)模塊少,表示下級(jí)模塊少, 可以減少模塊調(diào)用和控可以減少模塊調(diào)用和控 制的復(fù)雜度。制的復(fù)雜度。51模塊的扇入和扇出模塊的扇入和扇出圖圖 5-43 模塊的扇入扇出模塊的扇入扇出3n原則:原則:q盡可能

48、盡可能減少高扇出減少高扇出結(jié)構(gòu),隨著深度結(jié)構(gòu),隨著深度增大扇入增大扇入;q模塊的扇出數(shù)以模塊的扇出數(shù)以3-43-4為好,最多不超過(guò)為好,最多不超過(guò)5-7;5-7;q適當(dāng)增加中間層次適當(dāng)增加中間層次的辦法使扇出減少。的辦法使扇出減少。52n設(shè)計(jì)良好的軟件通常設(shè)計(jì)良好的軟件通常 具有具有甕型結(jié)構(gòu),兩頭甕型結(jié)構(gòu),兩頭 小,中間大;小,中間大;n該類(lèi)系統(tǒng)的結(jié)構(gòu)在下該類(lèi)系統(tǒng)的結(jié)構(gòu)在下 部收攏,表明它部收攏,表明它在底在底 層模塊中使用了較多層模塊中使用了較多 高扇入的共享模塊。高扇入的共享模塊。n在不破壞獨(dú)立性的前在不破壞獨(dú)立性的前 提下,提下,扇入大的比較扇入大的比較 好。好。模塊的扇入和扇出模塊的扇

49、入和扇出圖圖 5-43 模塊的扇入扇出模塊的扇入扇出453 例:高扇出例:高扇出編編外外人人員員工工資資取取得得工工資資數(shù)數(shù)據(jù)據(jù) 計(jì)計(jì)時(shí)時(shí)制制工工資資額額薪薪金金制制工工資資額額編編外外人人員員稅稅款款編編外外人人員員扣扣款款常常規(guī)規(guī)扣扣款款稅稅收收扣扣款款計(jì)算實(shí)發(fā)工資計(jì)算實(shí)發(fā)工資圖圖 5-44 模塊的模塊的高高扇出扇出54 修改后修改后計(jì)算實(shí)發(fā)工資計(jì)算實(shí)發(fā)工資取得工取得工資數(shù)據(jù)資數(shù)據(jù) 計(jì)時(shí)工人實(shí)計(jì)時(shí)工人實(shí)發(fā)工資發(fā)工資計(jì)薪工人實(shí)計(jì)薪工人實(shí)發(fā)工資發(fā)工資編外人員實(shí)編外人員實(shí)發(fā)工資發(fā)工資編外編外人員人員工資工資計(jì)時(shí)計(jì)時(shí)制工制工資額資額薪金薪金制工制工資額資額編外編外人員人員稅款稅款編外編外人員人員扣

50、款扣款常規(guī)常規(guī)扣款扣款稅收稅收扣款扣款圖圖 5-45 合理的模塊扇出合理的模塊扇出55 (2) (2) 模塊深度和寬度模塊深度和寬度n適當(dāng)控制適當(dāng)控制 q深度深度 = = 分層的層數(shù)。分層的層數(shù)。深度過(guò)大表示分工過(guò)細(xì)深度過(guò)大表示分工過(guò)細(xì)。q寬度寬度 = = 同一層上模塊數(shù)同一層上模塊數(shù) 的最大值。的最大值。寬度過(guò)大表示系統(tǒng)寬度過(guò)大表示系統(tǒng) 復(fù)雜度大。復(fù)雜度大。圖圖 5-46 模塊的模塊的深度和寬度深度和寬度56深度深度: 程序結(jié)構(gòu)的程序結(jié)構(gòu)的 層次數(shù)。層次數(shù)。 適當(dāng)適當(dāng)扇出扇出:表示一個(gè)模塊直表示一個(gè)模塊直 接調(diào)用(或控制)的接調(diào)用(或控制)的下屬模塊的個(gè)數(shù)。下屬模塊的個(gè)數(shù)。 低扇出低扇出寬度

51、:寬度: 層次結(jié)構(gòu)中同一層次結(jié)構(gòu)中同一層模塊的最大模塊個(gè)層模塊的最大模塊個(gè) 數(shù)。數(shù)。 適當(dāng)適當(dāng)小結(jié)小結(jié)扇入:扇入:一個(gè)模塊的直接一個(gè)模塊的直接 上級(jí)模塊的模塊。上級(jí)模塊的模塊。 高扇入高扇入575.3.3 5.3.3 作用域作用域/ /控制域規(guī)則控制域規(guī)則n一個(gè)模塊的一個(gè)模塊的控制域控制域(Scope of Control)(Scope of Control), 等于模塊本身加上其下級(jí)模塊等于模塊本身加上其下級(jí)模塊, ,即可供它即可供它 調(diào)用的模塊。調(diào)用的模塊。MACBM的控制域?yàn)榈目刂朴驗(yàn)?M,A,B,Cn一個(gè)模塊的一個(gè)模塊的作用域作用域(Scope of Effect)(Scope of

52、Effect),是受,是受 這個(gè)模塊中的判定這個(gè)模塊中的判定(Decision)(Decision)所影響的模塊。所影響的模塊。n規(guī)則:規(guī)則:q模塊的作用范圍保持在該模塊的控制范圍內(nèi);模塊的作用范圍保持在該模塊的控制范圍內(nèi);q判定的位置離受它控制的模塊越近越好。判定的位置離受它控制的模塊越近越好。58控制域控制域/ /作用域規(guī)則作用域規(guī)則n若若F中有判定,影響到中有判定,影響到Bn若若M中有判定,影響到中有判定,影響到B和和Fn若若A中有判定,影響到中有判定,影響到B和和Fn若若C中有判定,影響到中有判定,影響到D和和F不好,使模塊出現(xiàn)控制耦合不好,使模塊出現(xiàn)控制耦合 可用。但不好,判定在模塊

53、層次中的位置太高可用。但不好,判定在模塊層次中的位置太高較好:控制范圍包含了作用范圍,距離也尚可較好:控制范圍包含了作用范圍,距離也尚可 理想的設(shè)計(jì)理想的設(shè)計(jì) M AG EB CD F 圖圖 5-4759作用域作用域/ /控制域規(guī)則控制域規(guī)則n如果在設(shè)計(jì)過(guò)程中,發(fā)現(xiàn)作用范圍不在控制范圍如果在設(shè)計(jì)過(guò)程中,發(fā)現(xiàn)作用范圍不在控制范圍 內(nèi),可采用如下辦法把作用范圍轉(zhuǎn)移到控制范圍內(nèi),可采用如下辦法把作用范圍轉(zhuǎn)移到控制范圍 之內(nèi):之內(nèi): q將受判定影響的模塊下移到控制范圍內(nèi)。將受判定影響的模塊下移到控制范圍內(nèi)。q將判定上移或?qū)⑴卸ㄋ谀K合并到父模塊將判定上移或?qū)⑴卸ㄋ谀K合并到父模塊 中,使判定處于較

54、高層次。中,使判定處于較高層次。q盡可能減少高扇出結(jié)構(gòu),隨著深度增大扇入盡可能減少高扇出結(jié)構(gòu),隨著深度增大扇入60小結(jié)小結(jié)(1) (1) 遵照遵照模塊的特性模塊的特性: :分解、抽象、信息隱蔽、分解、抽象、信息隱蔽、 模塊的模塊的獨(dú)立獨(dú)立, ,結(jié)構(gòu)化結(jié)構(gòu)化. .(2) (2) 模塊的功能是完備的模塊的功能是完備的, ,但要消除冗余但要消除冗余. .(4) (4) 模塊應(yīng)具有模塊應(yīng)具有高內(nèi)聚、高內(nèi)聚、低耦會(huì)低耦會(huì); ;高扇入、高扇入、 低扇出低扇出; ;模塊的深度模塊的深度, ,寬度要適當(dāng)寬度要適當(dāng). .(3) (3) 大小適中大小適中, ,降低模塊接口的復(fù)雜性降低模塊接口的復(fù)雜性. .(5)

55、(5) 模塊的模塊的判定判定的的作用范圍作用范圍應(yīng)限制在模塊的應(yīng)限制在模塊的 控制范圍之內(nèi)控制范圍之內(nèi). .(6) (6) 避免模塊的病態(tài)連接避免模塊的病態(tài)連接( (內(nèi)容耦合、公共內(nèi)容耦合、公共 耦合、通信耦合耦合、通信耦合) )模塊化的規(guī)則模塊化的規(guī)則: :61 5.1 5.1 軟件設(shè)計(jì)概述軟件設(shè)計(jì)概述 5.2 5.2 軟件軟件體系結(jié)構(gòu)體系結(jié)構(gòu)介紹介紹 5.3 5.3 結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)模塊化結(jié)構(gòu)化設(shè)計(jì)的基礎(chǔ)模塊化 5.4 5.4 結(jié)構(gòu)化的設(shè)計(jì)方法結(jié)構(gòu)化的設(shè)計(jì)方法 5.5 5.5 數(shù)據(jù)的設(shè)計(jì)數(shù)據(jù)的設(shè)計(jì) 5.6 5.6 界面界面設(shè)計(jì)設(shè)計(jì) 5.7 5.7 軟件詳細(xì)軟件詳細(xì)( (過(guò)程過(guò)程) )設(shè)計(jì)設(shè)

56、計(jì) 5.8 5.8 設(shè)計(jì)中的幾個(gè)問(wèn)題設(shè)計(jì)中的幾個(gè)問(wèn)題內(nèi)內(nèi) 容容第第5 5章章 軟件設(shè)計(jì)軟件設(shè)計(jì)625.4 5.4 結(jié)構(gòu)化設(shè)計(jì)方法結(jié)構(gòu)化設(shè)計(jì)方法 5.4.1 5.4.1 基于基于變換流與事務(wù)流變換流與事務(wù)流的的方法方法 5.4.2 HIPO 5.4.2 HIPO 圖方法圖方法 5.4.3 5.4.3 由由DFD DFD 頂層、中間層導(dǎo)出結(jié)頂層、中間層導(dǎo)出結(jié) 構(gòu)圖構(gòu)圖(Structure Chart, SC ) 63結(jié)構(gòu)化設(shè)計(jì)思路結(jié)構(gòu)化設(shè)計(jì)思路DFDSC begin a b X1 X2 case X3 F =1 c T =2 d =3 e f X4 g h i X5 X6 F F F F T T

57、T j T end 程序流程圖程序流程圖(FC)結(jié)構(gòu)化語(yǔ)言結(jié)構(gòu)化語(yǔ)言IF customer does more than $50,000 business THEN IF the customer wasnt in debt to us the last 3 months THEN discount = 15% ELSE (he was in debt to us) IF customer has been with us for more than 20 years THEN discount =10% ELSE (20 year or less) THEN discount = 5% EL

58、SE (customer does $50.000 OR Less) THEN discount = 0圖圖 5-48 5-48 結(jié)構(gòu)化設(shè)計(jì)思路結(jié)構(gòu)化設(shè)計(jì)思路q按照按照DFDDFD的不同類(lèi)型,的不同類(lèi)型, 將它們轉(zhuǎn)換為相應(yīng)的軟件將它們轉(zhuǎn)換為相應(yīng)的軟件 結(jié)構(gòu)結(jié)構(gòu)641) 1) 結(jié)構(gòu)圖的直觀印象結(jié)構(gòu)圖的直觀印象模塊模塊控制流控制流數(shù)據(jù)流數(shù)據(jù)流5.4.1 5.4.1 基于變換流與事務(wù)流基于變換流與事務(wù)流的設(shè)計(jì)方法的設(shè)計(jì)方法圖圖 5-49 結(jié)構(gòu)圖結(jié)構(gòu)圖 652) 2) 結(jié)構(gòu)圖結(jié)構(gòu)圖(SC)(SC)中描述的模塊種類(lèi)中描述的模塊種類(lèi)(1)(1) 傳入模塊:傳入模塊:q從下屬模塊取得數(shù)據(jù),經(jīng)過(guò)某些從下屬模塊

59、取得數(shù)據(jù),經(jīng)過(guò)某些 處理,再將其傳送給上級(jí)模塊。處理,再將其傳送給上級(jí)模塊。q它傳送的數(shù)據(jù)流叫做它傳送的數(shù)據(jù)流叫做邏輯輸入數(shù)邏輯輸入數(shù) 據(jù)流。據(jù)流。傳入模塊傳入模塊 傳出模塊傳出模塊 (2)(2) 傳出模塊:傳出模塊:q從上級(jí)模塊獲得數(shù)據(jù),進(jìn)行某些從上級(jí)模塊獲得數(shù)據(jù),進(jìn)行某些 處理,再將其傳送給下屬模塊。處理,再將其傳送給下屬模塊。q它傳送的數(shù)據(jù)流叫做它傳送的數(shù)據(jù)流叫做邏輯輸出數(shù)邏輯輸出數(shù) 據(jù)流。據(jù)流。66結(jié)構(gòu)圖結(jié)構(gòu)圖(SC)(SC)中的模塊中的模塊種種類(lèi)類(lèi)(3)(3) 變換模塊:變換模塊:q從上級(jí)模塊取得數(shù)據(jù),進(jìn)行特定的處從上級(jí)模塊取得數(shù)據(jù),進(jìn)行特定的處理,轉(zhuǎn)換成其它形式,再傳送回上級(jí)理,轉(zhuǎn)

60、換成其它形式,再傳送回上級(jí)模塊。模塊。q它加工的數(shù)據(jù)流叫做它加工的數(shù)據(jù)流叫做變換數(shù)據(jù)流變換數(shù)據(jù)流。變換變換 協(xié)調(diào)協(xié)調(diào)/控制控制 (4)(4) 協(xié)調(diào)協(xié)調(diào)(控制控制)模塊:模塊:q對(duì)所有下屬模塊進(jìn)行協(xié)調(diào)和管理。對(duì)所有下屬模塊進(jìn)行協(xié)調(diào)和管理。67 (5)(5) 源模塊:源模塊:q不調(diào)用其他模塊的傳入模塊,不調(diào)用其他模塊的傳入模塊, 只適用于傳入部分的只適用于傳入部分的開(kāi)始端開(kāi)始端。源源漏漏結(jié)構(gòu)圖結(jié)構(gòu)圖(SC)(SC)中的模塊中的模塊種種類(lèi)類(lèi)(6)(6) 漏模塊:漏模塊:q不調(diào)用其它模塊的傳出模塊,不調(diào)用其它模塊的傳出模塊, 只適用于傳出部分的只適用于傳出部分的末端末端。683) SC3) SC圖中的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論