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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、劃分,得到軟件的體系,得到軟件的體系 結構圖,進而細化每個模塊內部的流程。結構圖,進而細化每個模塊內部的流程。4模塊模塊: : 軟件被劃分成若干個獨立命名軟件被劃分成若干個獨立命名, ,可編址的部分。可編址的部分。 模塊化模塊化: : 程序分程序分解解成若干個模塊,且成若干個模塊,且: : 5.3 5.3 結構化結構化設計的基礎設計的基礎模塊化模塊化n 每一個模塊完成一個相對獨立的子功能每一個模塊完成一個相對獨立的子功能 n 每個模塊定義了輸入和輸出的功能。每個模塊定義了輸入和輸出的功能。n 若干個模塊集成,構成一個整體,完成一個大功能。若干個模塊集成,構成一個整體,完成一個大功能。 l模塊化

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

5、化最小化軟件總成本軟件總成本軟軟件件開開發(fā)發(fā)工工作作量量模塊數量模塊數量集成集成成本成本成本最小區(qū)域成本最小區(qū)域MC (P1+P2) C (P1) + C (P2)E (P1+P2) E (P1) + E (P2) C C 為問題的復雜度,為問題的復雜度, E E 為解題需要的工作量為解題需要的工作量 成本成本/模塊模塊圖圖 5-21 5-21 模塊的分解成本模塊的分解成本7強調一下強調一下: :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) 結構化的模塊結構化的模塊 圖圖 5-22 非結構化與結構化的模塊非結構化與結構化的模塊 非結構化的模塊非結構化的模塊P0P=A+

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

8、塊一個功能模塊內部內部的組成成分之間的組成成分之間相互相互關聯(lián)關聯(lián)的緊密程度。的緊密程度。q模塊之間的耦合度模塊之間的耦合度(Coupling)(Coupling): 多個多個模塊之間模塊之間相互關聯(lián)的緊密程度。相互關聯(lián)的緊密程度。n模塊化設計的目標:模塊化設計的目標:q高內聚、低耦合高內聚、低耦合(high cohesion and low (high cohesion and low coupling) coupling) 10內聚強度的劃分內聚強度的劃分1 偶然性內聚偶然性內聚Coincidental Cohesion3 時間性內聚時間性內聚Temporal Cohesion4 過程性內

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

24、upling7 7 內容耦合內容耦合Content CouplingContent Coupling弱弱強強弱耦合弱耦合中耦合中耦合強耦合強耦合最強耦合最強耦合5 5 外部耦合外部耦合External CouplingExternal Coupling28(1 1)非直接耦合)非直接耦合( (NondirectionalNondirectional) ) 圖圖 5-32 非直接耦合模塊非直接耦合模塊n兩個模塊之間兩個模塊之間沒有直接關系沒有直接關系,它們之間的聯(lián)系,它們之間的聯(lián)系 完全是通過主模塊的控制和調用來實現(xiàn)的。完全是通過主模塊的控制和調用來實現(xiàn)的。計算軟件學院計算軟件學院學生的學習成績

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

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

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

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

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

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

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

33、過參數表傳遞該全局 變量的信息,則稱之為外部耦合。變量的信息,則稱之為外部耦合。ANMLFEDCBOPl對系統(tǒng)外部元素對系統(tǒng)外部元素- -如操作系統(tǒng)、共享庫或硬件的依賴如操作系統(tǒng)、共享庫或硬件的依賴l外部偶合必不可少外部偶合必不可少, ,但這種模塊數目應盡量少。但這種模塊數目應盡量少。 圖圖 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)建一個包含公有方法的模塊, ,通過調用這通過調用這 些方法些方法來獲取與設置數據來獲取與設置數據. .這樣數據

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

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

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

38、合如果發(fā)生下列情形,兩個模塊之間就發(fā)生了內容耦合q一個模塊直接訪問或修改另一個模塊的內部數據一個模塊直接訪問或修改另一個模塊的內部數據; ;ABCDA:goto C1 C:C1: BA 模塊代模塊代碼重疊碼重疊 Entry1 entry2 多入口模塊多入口模塊 A 進入另一進入另一模塊內部模塊內部 Bq一個模塊不通過正常入口轉到另一模塊內部一個模塊不通過正常入口轉到另一模塊內部; ;q一個模塊有多個入口。一個模塊有多個入口。q兩個模塊有一部分程序代碼重迭兩個模塊有一部分程序代碼重迭( (只可能出現(xiàn)在匯只可能出現(xiàn)在匯 編語言中編語言中););圖圖540 內容內容耦合實例耦合實例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方法方法, ,修改修改 操作是暗中進行的。操作是暗中進行的。n原因原因,slant,slant方法沒有方法沒有 訪問訪問LineLine對象對象, ,訪問訪問 關系更遠的對象關系更遠的對象 (Point(Point對象對象) )。43內容耦合內容耦合n內容耦合違反了內容耦合違反了“信息隱藏信息隱藏”的原則的原則。 為

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

56、計 5.8 5.8 設計中的幾個問題設計中的幾個問題內內 容容第第5 5章章 軟件設計軟件設計625.4 5.4 結構化設計方法結構化設計方法 5.4.1 5.4.1 基于基于變換流與事務流變換流與事務流的的方法方法 5.4.2 HIPO 5.4.2 HIPO 圖方法圖方法 5.4.3 5.4.3 由由DFD DFD 頂層、中間層導出結頂層、中間層導出結 構圖構圖(Structure Chart, SC ) 63結構化設計思路結構化設計思路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)結構化語言結構化語言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 結構化設計思路結構化設計思路q按照按照DFDDFD的不同類型,的不同類型, 將它們轉換為相應的軟件將它們轉換為相應的軟件 結構結構641) 1) 結構圖的直觀印象結構圖的直觀印象模塊模塊控制流控制流數據流數據流5.4.1 5.4.1 基于變換流與事務流基于變換流與事務流的設計方法的設計方法圖圖 5-49 結構圖結構圖 652) 2) 結構圖結構圖(SC)(SC)中描述的模塊種類中描述的模塊種類(1)(1) 傳入模塊:傳入模塊:q從下屬模塊取得數據,經過某些從下屬模塊

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

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

溫馨提示

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

評論

0/150

提交評論