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

下載本文檔

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

文檔簡介

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

2、作用范圍模塊的控制范圍和判定的作用范圍5.3 5.3 軟件設(shè)計的基礎(chǔ)軟件設(shè)計的基礎(chǔ)模塊化模塊化3結(jié)構(gòu)化設(shè)計結(jié)構(gòu)化設(shè)計(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è)計結(jié)構(gòu)化設(shè)計(SD)需求模型需求模型DFD+DD設(shè)計模型設(shè)計模型SC+FCq 通過通過對模塊的合理劃分對模塊的合理

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

4、設(shè)計降低了復(fù)雜性模塊化設(shè)計降低了復(fù)雜性. .l有利于軟件的可維護(hù)性有利于軟件的可維護(hù)性. .l系統(tǒng)可并發(fā)開發(fā),簡化系統(tǒng)實現(xiàn)。系統(tǒng)可并發(fā)開發(fā),簡化系統(tǒng)實現(xiàn)。 模塊化模塊化設(shè)計的好處設(shè)計的好處: :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將問題分解為各個可獨(dú)立解決的子問題將問題分解為各個可獨(dú)立解決的子問題n目標(biāo)目標(biāo)( Goal ) :使模塊之間的依賴關(guān)系顯式化和使模塊之間的依賴關(guān)系顯式化和 最小

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

6、k a lot!”盡可能小的接口:盡可能小的接口:“不要講太多不要講太多”nExplicit Interfaces: “Talk loud and in public! Dont whisper!”顯式接口:顯式接口:“公開的大聲講話公開的大聲講話不要私下嘀咕不要私下嘀咕”n 容易將模塊組容易將模塊組 合成新的系統(tǒng)合成新的系統(tǒng)83) 3) 模塊的模塊的信息隱藏信息隱藏n將可能發(fā)生將可能發(fā)生變化變化的部分隱藏起來的部分隱藏起來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開始開始結(jié)束結(jié)束P0P=A+BQ0Q=A-B開始開始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開始開始y95) 5) 模塊獨(dú)立性之模塊獨(dú)立性之內(nèi)聚性內(nèi)聚性n模塊獨(dú)立性:用來判斷模塊模塊獨(dú)立性:用來判斷模塊構(gòu)造構(gòu)造是否合理的標(biāo)準(zhǔn)是否合理的標(biāo)準(zhǔn)。n從兩個方面來度量:從兩個方面來度量:q模塊內(nèi)部的聚合度模塊內(nèi)部的聚合度(Cohesion)(Cohesion): 描述描述某某一個功能模

8、塊一個功能模塊內(nèi)部內(nèi)部的組成成分之間的組成成分之間相互相互關(guān)聯(lián)關(guān)聯(lián)的緊密程度。的緊密程度。q模塊之間的耦合度模塊之間的耦合度(Coupling)(Coupling): 多個多個模塊之間模塊之間相互關(guān)聯(lián)的緊密程度。相互關(guān)聯(lián)的緊密程度。n模塊化設(shè)計的目標(biāo):模塊化設(shè)計的目標(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 時間性內(nèi)聚時間性內(nèi)聚Temporal Cohesion4 過程性內(nèi)

9、聚過程性內(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)成模塊的各組成部分無無任何關(guān)聯(lián)。任何關(guān)聯(lián)。q通常用于庫函數(shù)管理,將多個通常用于庫函數(shù)管理,將多個相互無關(guān)相

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

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

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

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

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

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

16、單一的功能而協(xié)同工作。而協(xié)同工作。q模塊只執(zhí)行模塊只執(zhí)行單一的單一的計算并返回結(jié)果計算并返回結(jié)果, ,易修改、易修改、 易替換、易維護(hù)。易替換、易維護(hù)。q模塊的功能只是模塊的功能只是生成特定生成特定的輸出的輸出,無副作用無副作用, , 對其他模塊無影響對其他模塊無影響, ,模塊的可復(fù)用性高。模塊的可復(fù)用性高。 q這類模塊通常粒度最小,且不可分解。這類模塊通常粒度最小,且不可分解。18計算數(shù)學(xué)函數(shù)的模塊如計算數(shù)學(xué)函數(shù)的模塊如根據(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ù), ,并計算并計算 某一過程的產(chǎn)量某一過程的產(chǎn)量( (占理論最大值的百分比占理論最大值的百分比) )的模塊的模塊。19n更新數(shù)據(jù)庫更新數(shù)據(jù)庫n創(chuàng)建新文件的模塊創(chuàng)建新文件的模塊. .不是功能內(nèi)聚模塊不是功能內(nèi)聚模塊: :n和用戶交互的模塊和用戶交互的模塊. . 因為對數(shù)據(jù)庫或文件系統(tǒng)有副作用因為對數(shù)據(jù)庫或文件系統(tǒng)有副作用. . 向用戶顯示提示信息是一種輸出向用戶顯示提示信息是一種輸出, ,但違但違 反了功能內(nèi)聚模塊的

18、惟一輸出是執(zhí)行反了功能內(nèi)聚模塊的惟一輸出是執(zhí)行結(jié)束時結(jié)束時 的返回結(jié)果的返回結(jié)果這一原則這一原則. . 20算多個地點的算多個地點的每日平均溫度每日平均溫度初始化求和初始化求和并打開文件并打開文件創(chuàng)建新的創(chuàng)建新的溫度記錄溫度記錄存儲溫存儲溫度記錄度記錄關(guān)閉文件并關(guān)閉文件并打印平均溫度打印平均溫度功能性內(nèi)聚功能性內(nèi)聚偶然內(nèi)聚偶然內(nèi)聚偶然內(nèi)聚偶然內(nèi)聚功能性內(nèi)聚功能性內(nèi)聚讀取地點、讀取地點、時間和溫度時間和溫度存儲特定存儲特定地點溫度地點溫度編輯地點、時間編輯地點、時間或溫度字段或溫度字段功能性內(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過程性內(nèi)聚過程性內(nèi)聚3時間性內(nèi)聚時間性內(nèi)聚2邏輯性內(nèi)聚邏輯性內(nèi)聚1偶然性內(nèi)聚偶然性內(nèi)聚模塊內(nèi)的模塊內(nèi)的活動依據(jù)活動依據(jù)什么發(fā)生什么發(fā)生聯(lián)系?聯(lián)系?次序是否次序是否重要?重要?次序次序是否是否 重要?重要?所有的活所有的活動是動是同一類的嗎?同一類的嗎?NONOYESNO數(shù)數(shù)據(jù)據(jù)YESNO控控制制流流都不是都不是YESYES圖圖 5-29 內(nèi)聚強(qiáng)度的劃分內(nèi)聚強(qiáng)度的劃分22小結(jié)小結(jié)內(nèi)聚類型內(nèi)聚類型說說 明明偶然性內(nèi)聚偶然性內(nèi)聚各組成部分在功能上各組成部分

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

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

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

23、耦合松散耦合松散耦合無耦合無耦合 l 耦合是模塊耦合是模塊間間相對獨(dú)立性的度量。相對獨(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兩個模塊之間兩個模塊之間沒有直接關(guān)系沒有直接關(guān)系,它們之間的聯(lián)系,它們之間的聯(lián)系 完全是通過主模塊的控制和調(diào)用來實現(xiàn)的。完全是通過主模塊的控制和調(diào)用來實現(xiàn)的。計算軟件學(xué)院計算軟件學(xué)院學(xué)生的學(xué)習(xí)成績

25、學(xué)生的學(xué)習(xí)成績計算計算機(jī)學(xué)院計算計算機(jī)學(xué)院學(xué)生的學(xué)習(xí)成績學(xué)生的學(xué)習(xí)成績 29(2) (2) 數(shù)據(jù)耦合數(shù)據(jù)耦合(Data)(Data)q一個模塊訪問另一個模塊時,彼此之間是通過一個模塊訪問另一個模塊時,彼此之間是通過簡單簡單數(shù)據(jù)參數(shù)數(shù)據(jù)參數(shù) ( (不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量量) ) 來交換輸入、輸出信息的。來交換輸入、輸出信息的。 借款數(shù)借款數(shù) 利率利率 時間時間借款金額借款金額已還款金額已還款金額計算客戶信用卡帳單計算客戶信用卡帳單 計算借計算借/貸金額貸金額 圖圖 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 特征耦合模塊特征耦合模塊計算客戶電話費(fèi)計算客戶電話費(fèi)如如,C/C+,C/C+中有語句中有語句: : check altitude (pointer check altitude (pointerto position record )to position record )這是不是特征耦合這是不是特征耦合? ? 位置記錄的指針指向位置位置記錄的指針指向位置記錄中的所有字段記錄中的所有字段. .所以所以把指針作為參數(shù)傳遞把指針作為參數(shù)傳遞, ,

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

28、全部的訪問權(quán)限出授予全部的訪問權(quán)限出 現(xiàn)了標(biāo)記耦合?,F(xiàn)了標(biāo)記耦合。 維護(hù)人員修改維護(hù)人員修改Employee類時類時,必須檢查必須檢查sedEmail方方 法法,確定該方法是否需要修改。確定該方法是否需要修改。Employee類也不能重用類也不能重用 。 例例, , Emailer類發(fā)送電子信函類發(fā)送電子信函(sedEmail )方法方法32n 降低標(biāo)記耦合降低標(biāo)記耦合方法方法1,使用接口作為參數(shù)類型使用接口作為參數(shù)類型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方法只允許訪問它實際的方法只允許訪問它實際的name和和email數(shù)據(jù)數(shù)據(jù),降低了標(biāo)記耦合。降低了標(biāo)記耦合。33n如果不需要創(chuàng)建如果不需要創(chuàng)建新的新的Addressee接口接口,也可使用也可使用Employee 的超類的超類(如如Person)作為作為sendEmail方法的參數(shù)類型方法的參數(shù)類型,可可 降低標(biāo)記耦合。

30、但使用接口更靈活。降低標(biāo)記耦合。但使用接口更靈活。n方法方法2,傳遞簡單變量傳遞簡單變量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平均平均/最高最高(控制信號)(控制信號) 成成績績 圖圖 5-35 模塊模塊 使用多態(tài)使用多態(tài) 降低這種降低這種耦合耦合n如果一個模塊通過傳送開關(guān)、標(biāo)志、如果一個模塊通過傳送開關(guān)、標(biāo)志、命令命令等等控制信控制信 息息,以控

31、制選擇另一模塊的功能,就是控制耦合。,以控制選擇另一模塊的功能,就是控制耦合。B計算平均計算平均或最高分?jǐn)?shù)或最高分?jǐn)?shù)Byn讀入分?jǐn)?shù)讀入分?jǐn)?shù)平均平均/最高最高?計算計算平均分?jǐn)?shù)平均分?jǐn)?shù)計算計算 最高分?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)操作,有兩個獨(dú)立的類有兩個獨(dú)立的類Circle和和 Rectangle, routineX可由系統(tǒng)決定調(diào)用可由系統(tǒng)決定調(diào)用 哪個類哪個類draw方法方法.有時控制耦合是沒法或不應(yīng)該完全避免的。有時控制耦合是沒法或不應(yīng)該完全避免的。36(5) (5) 外部耦合外部耦合(External)(External)n一組模塊訪問同一一組模塊訪問同一全局簡單變量全局簡單變量而不是同一全而不是同一全 局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)表傳遞該全局局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通

33、過參數(shù)表傳遞該全局 變量的信息,則稱之為外部耦合。變量的信息,則稱之為外部耦合。ANMLFEDCBOPl對系統(tǒng)外部元素對系統(tǒng)外部元素- -如操作系統(tǒng)、共享庫或硬件的依賴如操作系統(tǒng)、共享庫或硬件的依賴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 外部耦合實例外部耦合實例模塊模塊A,BA,B可存取和修改全局變量模塊的值可存取和修改全局變量模塊的值使用全局變量的模塊相互耦合使用全局變量的模塊相互耦合.C+.C+中的中的constconst 或或JavaJava中的中的公有靜態(tài)變量公有靜態(tài)變量public static finalpublic static final是全局變量是全局變量. . 為全局變量創(chuàng)建一個包含公有方法的模塊為全局變量創(chuàng)建一個包含公有方法的模塊, ,通過調(diào)用這通過調(diào)用這 些方法些方法來獲取與設(shè)置數(shù)據(jù)來獲取與設(shè)置數(shù)據(jù). .這樣數(shù)據(jù)

35、的內(nèi)部表示就易于修改這樣數(shù)據(jù)的內(nèi)部表示就易于修改 了了, ,且可訪止惡意的破壞且可訪止惡意的破壞.set.set方法可以檢查修改的合法性方法可以檢查修改的合法性. . 38(6)(6)公共耦合公共耦合(Common)(Common)一組模塊訪問一組模塊訪問 同一個數(shù)據(jù)區(qū)同一個數(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ù)庫等公共的數(shù)據(jù)庫等AB 圖圖 5-39 5-39 緊密的公共耦合緊密的公共耦合問題問題: :n可讀性、可修改性、可讀性、可修改性、可維護(hù)、可復(fù)用性差可維護(hù)、可復(fù)用性差n數(shù)據(jù)暴露的多數(shù)據(jù)暴露的多,

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

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

38、合如果發(fā)生下列情形,兩個模塊之間就發(fā)生了內(nèi)容耦合q一個模塊直接訪問或修改另一個模塊的內(nèi)部數(shù)據(jù)一個模塊直接訪問或修改另一個模塊的內(nèi)部數(shù)據(jù); ;ABCDA:goto C1 C:C1: BA 模塊代模塊代碼重疊碼重疊 Entry1 entry2 多入口模塊多入口模塊 A 進(jìn)入另一進(jìn)入另一模塊內(nèi)部模塊內(nèi)部 Bq一個模塊不通過正常入口轉(zhuǎn)到另一模塊內(nèi)部一個模塊不通過正常入口轉(zhuǎn)到另一模塊內(nèi)部; ;q一個模塊有多個入口。一個模塊有多個入口。q兩個模塊有一部分程序代碼重迭兩個模塊有一部分程序代碼重迭( (只可能出現(xiàn)在匯只可能出現(xiàn)在匯 編語言中編語言中););圖圖540 內(nèi)容內(nèi)容耦合實例耦合實例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 的實例變量的實例變量 baseline是不可修改的是不可修改的 void slant (int newY) Point theEnd = baseline.getEnd(); theEnd.setLocation( theEnd.getX(), newY); nArchArch

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

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

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

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

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

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

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

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

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

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

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

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

52、Effect),是受,是受 這個模塊中的判定這個模塊中的判定(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è)計理想的設(shè)計 M AG EB CD F 圖圖 5-4759作用域作用域/ /控制域規(guī)則控制域規(guī)則n如果在設(shè)計過程中,發(fā)現(xiàn)作用范圍不在控制范圍如果在設(shè)計過程中,發(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)聚、低耦會低耦會; ;高扇入、高扇入、 低扇出低扇出; ;模塊的深度模塊的深度, ,寬度要適當(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è)計概述軟件設(shè)計概述 5.2 5.2 軟件軟件體系結(jié)構(gòu)體系結(jié)構(gòu)介紹介紹 5.3 5.3 結(jié)構(gòu)化設(shè)計的基礎(chǔ)模塊化結(jié)構(gòu)化設(shè)計的基礎(chǔ)模塊化 5.4 5.4 結(jié)構(gòu)化的設(shè)計方法結(jié)構(gòu)化的設(shè)計方法 5.5 5.5 數(shù)據(jù)的設(shè)計數(shù)據(jù)的設(shè)計 5.6 5.6 界面界面設(shè)計設(shè)計 5.7 5.7 軟件詳細(xì)軟件詳細(xì)( (過程過程) )設(shè)計設(shè)

56、計 5.8 5.8 設(shè)計中的幾個問題設(shè)計中的幾個問題內(nèi)內(nèi) 容容第第5 5章章 軟件設(shè)計軟件設(shè)計625.4 5.4 結(jié)構(gòu)化設(shè)計方法結(jié)構(gòu)化設(shè)計方法 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è)計思路結(jié)構(gòu)化設(shè)計思路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)化語言結(jié)構(gòu)化語言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è)計思路結(jié)構(gòu)化設(shè)計思路q按照按照DFDDFD的不同類型,的不同類型, 將它們轉(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è)計方法的設(shè)計方法圖圖 5-49 結(jié)構(gòu)圖結(jié)構(gòu)圖 652) 2) 結(jié)構(gòu)圖結(jié)構(gòu)圖(SC)(SC)中描述的模塊種類中描述的模塊種類(1)(1) 傳入模塊:傳入模塊:q從下屬模塊取得數(shù)據(jù),經(jīng)過某些從下屬模塊

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論