軟件工程課件:軟件總體設(shè)計_第1頁
軟件工程課件:軟件總體設(shè)計_第2頁
軟件工程課件:軟件總體設(shè)計_第3頁
軟件工程課件:軟件總體設(shè)計_第4頁
軟件工程課件:軟件總體設(shè)計_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

軟件總體設(shè)計3.1總體設(shè)計3.2軟件總體設(shè)計原理3.3描繪軟件結(jié)構(gòu)的圖形工具3.4映射數(shù)據(jù)流到軟件結(jié)構(gòu)3.5數(shù)據(jù)庫結(jié)構(gòu)設(shè)計過程3.6實例分析3.7小結(jié)習(xí)題3

知識點

總體設(shè)計的基本概念、設(shè)計過程、設(shè)計原理、啟發(fā)式規(guī)則,面向數(shù)據(jù)流的設(shè)計方法,描繪軟件結(jié)構(gòu)的圖形工具。

難點

總體設(shè)計過程、設(shè)計原理,面向數(shù)據(jù)流的設(shè)計方法(變換分析與事務(wù)分析)。

基于工作過程的教學(xué)任務(wù)

通過本章的學(xué)習(xí),了解軟件總體設(shè)計的目的、任務(wù);掌握軟件總體設(shè)計的過程、設(shè)計原理和啟發(fā)規(guī)則;理解面向數(shù)據(jù)的設(shè)計方法,能夠?qū)⒕唧w的數(shù)據(jù)流圖轉(zhuǎn)換為軟件的結(jié)構(gòu)圖,即變換分析技術(shù)和事務(wù)分析技術(shù);熟練使用概要設(shè)計階段常用的幾種圖形工具。

在完成對軟件系統(tǒng)的需求分析之后,接下來需要進行的是軟件系統(tǒng)的總體設(shè)計。一般來說,對于較大規(guī)模的軟件項目,軟件設(shè)計往往被分成兩個階段進行。首先是前期總體設(shè)計,用于確定軟件系統(tǒng)的基本框架;然后是在概要設(shè)計基礎(chǔ)上的后期詳細設(shè)計,用于確定軟件系統(tǒng)的內(nèi)部實現(xiàn)細節(jié)。

應(yīng)該說,軟件概要設(shè)計是軟件開發(fā)過程中一個非常重要的階段??梢钥隙ǎ绻浖到y(tǒng)沒有經(jīng)過認真細致的概要設(shè)計,就直接考慮它的算法或直接編寫源程序,這個系統(tǒng)的質(zhì)量就很難保證。許多軟件就是因為結(jié)構(gòu)上的問題,使得它經(jīng)常發(fā)生故障,而且很難維護。

3.1總體設(shè)計

在需求分析階段,已經(jīng)明確了系統(tǒng)必須“做什么”,下一步就是如何實現(xiàn)系統(tǒng)的需求,進入軟件總體設(shè)計階段。即回答“系統(tǒng)應(yīng)該如何實現(xiàn)?”,也即能夠針對軟件需求分析中提出的一系列軟件問題,概要地回答問題如何解決。例如,需回答:軟件系統(tǒng)將采用什么樣的體系構(gòu)架?需要創(chuàng)建哪些功能模塊?模塊之間的關(guān)系如何?數(shù)據(jù)結(jié)構(gòu)如何?軟件系統(tǒng)需要什么樣的網(wǎng)絡(luò)環(huán)境提供支持?需要采用什么類型的后臺數(shù)據(jù)庫?等等。

1.總體設(shè)計的定義

總體設(shè)計又稱為概要設(shè)計或初步設(shè)計??傮w設(shè)計階段要描述軟件的體系結(jié)構(gòu)和子系統(tǒng),確定軟件的模塊結(jié)構(gòu),進行數(shù)據(jù)結(jié)構(gòu)設(shè)計、數(shù)據(jù)庫設(shè)計等??傮w設(shè)計之后再對軟件進行詳細設(shè)計,通過對軟件設(shè)計的不斷細化,形成可實施的設(shè)計方案。

總體設(shè)計是一個將軟件需求變換成軟件表示的過程??傮w設(shè)計的工作是劃分出組成目標(biāo)系統(tǒng)的物理元素——程序、文件、數(shù)據(jù)庫、人工過程和文檔等,但是每個物理元素仍然處于黑盒子級,這些黑盒子里的具體內(nèi)容將在以后仔細設(shè)計。

軟件總體設(shè)計的重要任務(wù)是設(shè)計軟件的結(jié)構(gòu),也就是要確定系統(tǒng)中每個程序是由哪些模塊組成的,以及這些模塊相互間的關(guān)系。

總體設(shè)計的好壞在根本上決定了軟件系統(tǒng)的優(yōu)劣。無論哪個環(huán)節(jié)出了差錯,都會把好事搞砸了。

總之,總體設(shè)計之源是軟件需求??傮w設(shè)計過程通常由以下兩個主要階段組成:

系統(tǒng)設(shè)計階段,確定系統(tǒng)的具體實現(xiàn)方案;

結(jié)構(gòu)設(shè)計階段,確定軟件結(jié)構(gòu)。

比較全面的總體設(shè)計過程包括下述12個步驟。

1)設(shè)想供選擇的方案

在總體設(shè)計階段開始時只有系統(tǒng)的邏輯模型,分析員有充分的自由分析比較不同的物理實現(xiàn)方案,一旦選出了最佳的方案,將能大大提高系統(tǒng)的性能/價格比。另外,需求分析階段得出的數(shù)據(jù)流圖是總體設(shè)計的極好的出發(fā)點。

2)系統(tǒng)構(gòu)架設(shè)計

系統(tǒng)構(gòu)架設(shè)計就是根據(jù)系統(tǒng)的需求框架,確定系統(tǒng)的基本結(jié)構(gòu),以獲得有關(guān)系統(tǒng)創(chuàng)建的總體方案。其主要設(shè)計內(nèi)容包括:

根據(jù)系統(tǒng)業(yè)務(wù)需求,將系統(tǒng)分解成諸多具有獨立任務(wù)的子系統(tǒng);

分析子系統(tǒng)之間的通信,確定子系統(tǒng)的外部接口;

分析系統(tǒng)的應(yīng)用特點、技術(shù)特點以及項目資金情況,確定系統(tǒng)的硬件環(huán)境、軟件環(huán)境、網(wǎng)絡(luò)環(huán)境和數(shù)據(jù)環(huán)境等;

根據(jù)系統(tǒng)整體邏輯構(gòu)造與應(yīng)用需要,對系統(tǒng)進行整體物理部署與優(yōu)化。

很顯然,當(dāng)系統(tǒng)構(gòu)架被設(shè)計完成之后,軟件項目就可以每個具有獨立工作特征的子系統(tǒng)為單位進行任務(wù)分解了,由此可以將一個大的軟件項目分解成許多小的軟件子項目。

3)選取合理的方案

從一系列供選擇的方案中選取若干個合理的方案。至少選取低、中和高成本的三種方案。在判斷哪些方案合理時,應(yīng)該考慮在問題定義和可行性研究階段確定的工程規(guī)模和目標(biāo),有時可能還需要進一步征求用戶的意見。對每個合理的方案,分析員都應(yīng)該準備下列4份資料:

系統(tǒng)流程圖;

組成系統(tǒng)的物理元素清單;

成本/效益分析;

實現(xiàn)這個系統(tǒng)的進度計劃。

4)推薦最佳方案

分析員應(yīng)該綜合分析對比各種合理方案的利弊,推薦一個最佳的方案,并為方案制定詳細的實現(xiàn)計劃和規(guī)范。方案通過審批后才能進入總體設(shè)計過程的下一個重要階段——結(jié)構(gòu)設(shè)計。

5)制定規(guī)范

在進入軟件開發(fā)階段之初,首先應(yīng)為軟件開發(fā)組制定在設(shè)計時應(yīng)該共同遵守的標(biāo)準,以便協(xié)調(diào)組內(nèi)各成員的工作。包括:

閱讀和理解軟件需求說明書,確認用戶要求能否實現(xiàn),明確實現(xiàn)的條件,從而確定設(shè)計的目標(biāo),以及它們的優(yōu)先順序;

根據(jù)目標(biāo)確定最合適的設(shè)計方法;

規(guī)定設(shè)計文檔的編制標(biāo)準;

規(guī)定編碼的信息形式,與硬件、操作系統(tǒng)的接口規(guī)約,命名規(guī)則。

6)功能分解

為了最終實現(xiàn)目標(biāo)系統(tǒng),必須設(shè)計出組成這個系統(tǒng)的所有程序和文件(或數(shù)據(jù)庫)。對程序(特別是復(fù)雜的大型程序)的設(shè)計,通常分為以下兩個階段完成:

結(jié)構(gòu)設(shè)計:確定程序由哪些模塊組成,以及這些模塊之間的關(guān)系;

過程設(shè)計:確定每個模塊的處理過程。

其中,結(jié)構(gòu)設(shè)計是總體設(shè)計階段的任務(wù),過程設(shè)計是詳細設(shè)計階段(通過對結(jié)構(gòu)設(shè)計內(nèi)容進行細化,得到軟件的詳細的數(shù)據(jù)結(jié)構(gòu)和算法)的任務(wù)。

為確定軟件結(jié)構(gòu),首先需要從實現(xiàn)角度把復(fù)雜的功能進一步分解。一般來說,經(jīng)過分解之后應(yīng)該使每個功能對大多數(shù)程序員而言都是明顯易懂的。

功能分解導(dǎo)致數(shù)據(jù)流圖的進一步細化,同時還應(yīng)該用IPO圖或其他適當(dāng)?shù)墓ぞ吆喴枋黾毣竺總€處理的算法。

7)設(shè)計軟件結(jié)構(gòu)

基于功能層次結(jié)構(gòu)建立軟件結(jié)構(gòu)。其步驟主要有:

采用層次圖或結(jié)構(gòu)圖設(shè)計方法,將系統(tǒng)按功能劃分成模塊的層次結(jié)構(gòu);

確定每個模塊的功能;

建立與已確定的軟件需求的對應(yīng)關(guān)系;

確定模塊間的調(diào)用關(guān)系、接口。

如果數(shù)據(jù)流圖已經(jīng)細化到適當(dāng)?shù)膶哟危瑒t可以直接從數(shù)據(jù)流圖映射出軟件結(jié)構(gòu)。

8)可靠性設(shè)計

可靠性設(shè)計也叫做質(zhì)量設(shè)計,用于確保整個系統(tǒng)易于修改和易于維護。

9)設(shè)計數(shù)據(jù)庫

對用到數(shù)據(jù)庫的應(yīng)用軟件系統(tǒng),軟件工程師應(yīng)在需求分析階段所確定的系統(tǒng)數(shù)據(jù)需求的基礎(chǔ)上,進一步設(shè)計數(shù)據(jù)庫(參考數(shù)據(jù)庫課程)。

10)制定測試計劃

在軟件開發(fā)的早期階段考慮測試問題,能促使軟件設(shè)計人員在設(shè)計時注意提高軟件的可測試性。

11)書寫文檔

應(yīng)該用正式的文檔記錄總體設(shè)計的結(jié)果,在這個階段應(yīng)該完成的文檔通常有下述幾種:系統(tǒng)說明書、用戶手冊、測試計劃、詳細的實現(xiàn)計劃、數(shù)據(jù)庫設(shè)計結(jié)果等。

12)審查和復(fù)審

最后應(yīng)該對總體設(shè)計的結(jié)果進行嚴格的技術(shù)審查,在技術(shù)審查通過之后再由使用部門的負責(zé)人從管理角度進行復(fù)審。審查和復(fù)審的內(nèi)容主要包括:

需求確認:確認所設(shè)計的軟件是否已覆蓋了所有已確定的軟件需求;

接口確認:確認該軟件的內(nèi)部接口與外部接口是否已經(jīng)明確定義;

模塊確認:確認所設(shè)計的模塊是否滿足高內(nèi)聚低耦合的要求,模塊的作用范圍是否在其控制范圍之內(nèi);

風(fēng)險性:該設(shè)計在現(xiàn)有技術(shù)條件下和預(yù)算范圍內(nèi)是否能按時實現(xiàn);

實用性:該設(shè)計對于需求的解決是否實用;

可維護性:該設(shè)計是否考慮了今后的維護;

質(zhì)量:該設(shè)計是否表現(xiàn)出了良好的質(zhì)量特征。

2.總體設(shè)計的重要性

總體設(shè)計階段的一項重要任務(wù)是設(shè)計軟件的結(jié)構(gòu),也就是要確定系統(tǒng)中每個程序是由哪些模塊組成的,以及這些模塊相互間的關(guān)系,如圖3-1所示。

圖3-1總體設(shè)計的重要性

軟件設(shè)計是軟件開發(fā)階段的關(guān)鍵步驟,是將需求轉(zhuǎn)化為軟件產(chǎn)品的唯一途徑,由于軟件開發(fā)階段占軟件項目開發(fā)總成本的絕大部分,因此總體設(shè)計所做的決策,將直接影響軟件實現(xiàn)的成敗。軟件設(shè)計是后續(xù)開發(fā)步驟及軟件維護工作的基礎(chǔ)。如果沒有設(shè)計,只能建立一個不穩(wěn)定的軟件體系結(jié)構(gòu),如圖3-2所示。

圖3-2有軟件設(shè)計和無軟件設(shè)計的對比

在總體設(shè)計階段,應(yīng)從系統(tǒng)開發(fā)的角度出發(fā),將系統(tǒng)逐步分割成層次結(jié)構(gòu),系統(tǒng)被表達為一個結(jié)構(gòu)清晰、層次分明的模塊組合,每個模塊完成各自相對簡單的功能,并且它們之間都保持一定的聯(lián)系。圖3-3描述了從需求分析到總體設(shè)計過程中的元素對應(yīng)關(guān)系。

圖3-3分析模型元素和設(shè)計模型內(nèi)容示意

數(shù)據(jù)字典、實體-聯(lián)系圖、數(shù)據(jù)對象描述轉(zhuǎn)變成設(shè)計階段的數(shù)據(jù)結(jié)構(gòu),就是在進行數(shù)據(jù)設(shè)計;從數(shù)據(jù)流圖分析歸納總結(jié)出系統(tǒng)的體系結(jié)構(gòu),體系結(jié)構(gòu)設(shè)計確定了系統(tǒng)模塊之間的關(guān)系和接口,描述了系統(tǒng)內(nèi)部各組成元素之間、軟件與外部系統(tǒng)之間以及軟件與使用者之間的通信方式;數(shù)據(jù)流圖提供了接口設(shè)計所需要的信息;過程設(shè)計是對軟件構(gòu)件的過程性說明,可以從狀態(tài)變遷圖、控制規(guī)格說明、加工規(guī)格說明獲得過程設(shè)計所需要的信息。根據(jù)以上思路,可以把需求階段的數(shù)據(jù)模型、功能模型、行為模型傳遞給系統(tǒng)設(shè)計人員,他們就可以根據(jù)各個模型所表達出來的信息,使用合適的方法,完成數(shù)據(jù)設(shè)計、體系結(jié)構(gòu)設(shè)計、接口設(shè)計、過程設(shè)計。

3.2軟件總體設(shè)計原理

3.2.1設(shè)計原理1.抽象

抽象是人類在認識復(fù)雜現(xiàn)象的過程中使用的最強有力的思維工具。人們在實踐中認識到,在現(xiàn)實世界中一定事物、狀態(tài)或過程之間總存在著某些相似的方面(共性)。把這些相似的方面集中和概括起來,暫時忽略它們之間的差異,這就是抽象?;蛘哒f抽象就是抽出事物的本質(zhì)特性而暫時不考慮它們的細節(jié)。在軟件設(shè)計中,抽象與逐步求精和模塊化是緊密關(guān)聯(lián)的。

用模塊化設(shè)計的思想來解決問題時,可以提出許多抽象的層次。在抽象的最高層次使用問題環(huán)境的語言,以概括的方式敘述問題的解法;在較低抽象層次采用更過程化的方法,把面向問題的術(shù)語和面向?qū)崿F(xiàn)的術(shù)語結(jié)合起來敘述問題的解法;最后在最低的抽象層次用可直接實現(xiàn)的方式敘述問題的解法。

軟件工程過程的每一步都是對軟件解法的抽象層次的一次精化。在可行性研究階段,軟件作為系統(tǒng)的一個完整部件;在需求分析期間,軟件解法是使用在問題環(huán)境內(nèi)熟悉的方式描述的;當(dāng)由總體設(shè)計向詳細設(shè)計過渡時,抽象的程度也就隨之減少了;最后,當(dāng)源程序?qū)懗鰜硪院?,也就達到了抽象的最低層。

2.模塊化

軟件結(jié)構(gòu)是軟件模塊之間關(guān)系的表示,它決定了整個系統(tǒng)的結(jié)構(gòu),也確定了系統(tǒng)的質(zhì)量。模塊是一個明確定義了輸入、輸出和特性的程序?qū)嶓w,通常程序中獨立命名且可通過名稱訪問的過程函數(shù)、子程序和宏調(diào)用都可以看作模塊。面向?qū)ο蠓椒▽W(xué)中的對象是模塊,對象內(nèi)的方法(或稱為服務(wù))也是模塊。模塊是構(gòu)成程序的基本構(gòu)件。模塊又稱為“組件”,一般具有以下三個基本屬性:

功能:描述該模塊實現(xiàn)什么功能,有什么作用;

邏輯:描述模塊內(nèi)部怎么做,即如何實現(xiàn)需求及所需的數(shù)據(jù);

狀態(tài):該模塊使用時的環(huán)境和條件,即模塊間的調(diào)用與被調(diào)用關(guān)系。

在描述一個模塊時,還必須按模塊的外部特性與內(nèi)部特性分別描述。模塊的外部特性,指模塊的模塊名、參數(shù)表、其中的輸入?yún)?shù)和輸出參數(shù)以及給程序至整個系統(tǒng)造成的影響;模塊的內(nèi)部特性,指完成其功能的程序代碼和僅供該模塊內(nèi)部使用的數(shù)據(jù)。

模塊化是解決軟件復(fù)雜問題的一種手段。對于一個復(fù)雜的大型軟件系統(tǒng),應(yīng)該將它適當(dāng)分解,即把復(fù)雜的問題分解成許多容易解決的小問題,原來的問題也就容易解決了。這就是模塊化的根據(jù)。

根據(jù)實際經(jīng)驗:模塊不能無休止地細化,只要細化到能滿足所有需求的業(yè)務(wù)需要時,就停止。根據(jù)圖3-4所示:當(dāng)模塊數(shù)目增加時每個模塊的規(guī)模將減小,開發(fā)單個模塊需要的成本(工作量)確實減少了;但是,隨著模塊數(shù)目增加,設(shè)計模塊間接口所需要的工作量也將增加。根據(jù)這兩個因素,得出了圖中的總成本曲線。每個程序都相應(yīng)地有一個最適當(dāng)?shù)哪K數(shù)目M,使得系統(tǒng)的開發(fā)成本最小。雖然目前還不能精確地決定M的數(shù)值,但是在考慮模塊化的時候總成本曲線確實是有用的指南。

圖3-4模塊化和軟件成本

采用模塊化原理可以使軟件結(jié)構(gòu)清晰,不僅容易設(shè)計也容易閱讀和理解。因為程序錯誤通常局限在有關(guān)的模塊及它們之間的接口中,所以模塊化使軟件容易測試和調(diào)試,因而有助于提高軟件的可靠性。因變動往往只涉及少數(shù)幾個模塊,所以模塊化能夠提高軟件的可修改性。另外,模塊化也有助于軟件開發(fā)的組織管理,一個復(fù)雜的大型程序可以由許多程序員分工編寫不同的模塊,并且可以進一步分配技術(shù)熟練的程序員編寫困難的模塊。

3.局部化與信息隱藏

模塊化概念讓我們面對一個基本問題:“為了得到最好的一組模塊,應(yīng)該怎樣分解軟件呢?”信息隱藏原則建議:在設(shè)計和確定模塊時,應(yīng)使一個模塊內(nèi)包含的信息(過程和數(shù)據(jù))對于不需要這些信息的模塊來說,是不能訪問的。

局部化的概念和信息隱藏概念是密切相關(guān)的。所謂局部化,是指把一些關(guān)系密切的軟件元素物理地放得彼此靠近。在模塊中使用局部數(shù)據(jù)元素是局部化的一個例子。顯然,局部化有助于實現(xiàn)信息隱藏。

“隱藏”意味著可以通過定義一組獨立的模塊來實現(xiàn)有效的模塊化,這些獨立的模塊彼此間僅僅交換那些為了完成系統(tǒng)功能而必須交換的信息。信息隱藏定義并加強了對模塊內(nèi)部細節(jié)的訪問約束和對模塊所使用的任何局部數(shù)據(jù)結(jié)構(gòu)的訪問約束。

如果在測試期間和以后的軟件維護期間需要修改軟件,那么使用信息隱藏原理作為模塊化系統(tǒng)設(shè)計的標(biāo)準就會帶來極大好處。因為絕大多數(shù)數(shù)據(jù)和過程對于軟件的其他部分而言是隱藏的,在修改期間由于疏忽而引入的錯誤就很少可能傳播到軟件的其他部分。

4.模塊獨立性(功能獨立)

模塊獨立性的概念是模塊化、抽象、信息隱藏和局部化概念的直接結(jié)果。模塊獨立性是指軟件系統(tǒng)中每個模塊只涉及軟件要求的具體的子功能,而和軟件系統(tǒng)中其他模塊的接口是簡單的。

為什么模塊的獨立性很重要?主要有兩條理由:第一,有效的模塊化(即具有獨立的模塊)軟件比較容易開發(fā)出來。這是由于能夠分割功能而且接口可以簡化,當(dāng)許多人分工合作開發(fā)同一個軟件時,這個優(yōu)點尤其重要。第二,獨立的模塊比較容易測試和維護。這是因為相對來說,修改設(shè)計和程序需要的工作量比較小,錯誤傳播范圍小,需要擴充功能時能夠“插入”模塊??傊?,模塊獨立性是好設(shè)計的關(guān)鍵,而設(shè)計又是決定軟件質(zhì)量的關(guān)鍵環(huán)節(jié)。

模塊的獨立性一般采用耦合和內(nèi)聚這兩個定性的技術(shù)指標(biāo)進行度量。其中,耦合用來反映模塊之間互相連接的緊密程度,模塊之間的連接越緊密,聯(lián)系越多,耦合性就越高。內(nèi)聚用來反映模塊內(nèi)部各個元素彼此結(jié)合的緊密程度,一個模塊內(nèi)部各個元素之間結(jié)合得越緊密,則它的內(nèi)聚性就越高。顯然,為了使模塊具有較強的獨立性,要求模塊是高內(nèi)聚、低耦合。

1)耦合

耦合又稱塊間聯(lián)系,是對一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量。耦合強弱取決于模塊間接口的復(fù)雜程度,進入或訪問一個模塊的點,以及通過接口的數(shù)據(jù)。

在軟件設(shè)計中應(yīng)該追求盡可能松散耦合的系統(tǒng)。在這樣的系統(tǒng)中可以研究、測試或維護任何一個模塊,而不需要對系統(tǒng)的其他模塊有很多了解。此外,由于模塊間的聯(lián)系簡單,發(fā)生在一處的錯誤傳播到整個系統(tǒng)的可能性就很小。因此,模塊間的耦合程度嚴重影響系統(tǒng)的可理解性、可測試性、可靠性和可維護性。

如果兩個模塊之間聯(lián)系越緊密,那么它們的耦合程度越高。模塊間耦合高低取決于接口的復(fù)雜性、調(diào)用方式及傳遞的信息。模塊的耦合有以下幾種類型,如圖3-5所示。

圖3-5模塊耦合類型比較

①非直接耦合。如果兩個模塊中的每一個都能獨立地工作而不需要另一個模塊的存在,且它們之間不傳遞任何信息,那么它們彼此完全獨立,耦合程度最低,獨立性最強。但是,在一個軟件系統(tǒng)中不可能所有模塊之間都沒有任何連接。

②數(shù)據(jù)耦合。如果兩個模塊彼此間通過參數(shù)交換信息,而且交換的信息僅僅是數(shù)據(jù),那么這種耦合稱為數(shù)據(jù)耦合。數(shù)據(jù)耦合是低耦合。系統(tǒng)中至少必須存在這種耦合,因為只有當(dāng)某些模塊的輸出數(shù)據(jù)作為另一些模塊的輸入數(shù)據(jù)時,系統(tǒng)才能完成有價值的功能。一般來說,一個系統(tǒng)內(nèi)可以只包含數(shù)據(jù)耦合。

③特征耦合。如果被調(diào)用的模塊需要使用作為參數(shù)傳遞進來的數(shù)據(jù)結(jié)構(gòu)中的所有元素,那么,把整個數(shù)據(jù)結(jié)構(gòu)作為參數(shù)傳遞就是完全正確的。但是,當(dāng)把整個數(shù)據(jù)結(jié)構(gòu)作為參數(shù)傳遞而被調(diào)用的模塊只需要使用其中一部分數(shù)據(jù)元素時,就出現(xiàn)了特征耦合。在這種情況下,被調(diào)用的模塊可以使用的數(shù)據(jù)多于它確實需要的數(shù)據(jù),這將導(dǎo)致對數(shù)據(jù)的訪問失去控制,從而給計算機犯罪提供了機會。

④控制耦合。如果傳遞的信息中有控制信息(盡管有時這種控制信息以數(shù)據(jù)的形式出現(xiàn)),則這種耦合稱為控制耦合。控制耦合是中等程度的耦合,它增加了系統(tǒng)的復(fù)雜程度??刂岂詈贤嵌嘤嗟模诎涯K適當(dāng)分解之后通??梢杂脭?shù)據(jù)耦合代替它。

⑤外部耦合。如果一組模塊都訪問同一全局簡單變量而不是同一全局數(shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)表傳遞該全局變量的信息,稱這種耦合方式為外部耦合。

⑥公共環(huán)境耦合。當(dāng)兩個或多個模塊通過一個公共數(shù)據(jù)環(huán)境相互作用時,它們之間的耦合稱為公共環(huán)境耦合。公共環(huán)境可以是全程變量、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)、任何存儲介質(zhì)上的文件、物理設(shè)備等。

需要注意的是,模塊之間公共環(huán)境耦合的復(fù)雜程度,將會隨著耦合模塊個數(shù)的增加而顯著增加。為了降低公共環(huán)境耦合帶來的復(fù)雜性和提高模塊的獨立性,實際應(yīng)用中還會針對公共環(huán)境耦合專門設(shè)置一些限制,例如不使用公共環(huán)境耦合數(shù)據(jù)傳遞控制信息。

如果只有兩個模塊有公共環(huán)境,那么這種耦合有下面兩種可能:

一個模塊往公共環(huán)境送數(shù)據(jù),另一個模塊從公共環(huán)境取數(shù)據(jù)。這是數(shù)據(jù)耦合的一種形式,是比較松散的耦合;

兩個模塊都既往公共環(huán)境送數(shù)據(jù)又從里面取數(shù)據(jù),這種耦合比較緊密,介于數(shù)據(jù)耦合和控制耦合之間。

如果兩個模塊共享的數(shù)據(jù)很多,都通過參數(shù)傳遞可能很不方便,這時可以利用公共環(huán)境耦合。

⑦內(nèi)容耦合。最高程度的耦合是內(nèi)容耦合。如果出現(xiàn)下列情況之一,兩個模塊間就發(fā)生了內(nèi)容耦合。

一個模塊訪問另一個模塊的內(nèi)部數(shù)據(jù);

一個模塊不通過正常入口而轉(zhuǎn)到另一個模塊的內(nèi)部;

兩個模塊有一部分程序代碼重疊(只可能出現(xiàn)在匯編程序中);

一個模塊有多個入口(這意味著一個模塊有幾種功能)。

內(nèi)容耦合是一種非常強的耦合形式,嚴重影響了模塊獨立性。當(dāng)模塊之間存在內(nèi)容耦合時,模塊的任何改動都將變得非常困難,一旦程序有錯則很難修正。因此,設(shè)計軟件結(jié)構(gòu)時,也就要求絕對不要出現(xiàn)內(nèi)容耦合。所幸的是,大多數(shù)高級程序設(shè)計語言已經(jīng)設(shè)計成不允許出現(xiàn)內(nèi)容耦合,它一般只會出現(xiàn)在匯編語言程序中。

耦合是影響軟件復(fù)雜程度的一個重要因素。在設(shè)計軟件時應(yīng)該采取下述設(shè)計原則:盡量使用數(shù)據(jù)耦合,少用控制耦合和特征耦合,限制公共環(huán)境耦合的范圍,堅決避免使用內(nèi)容耦合。在耦合方式上降低模塊之間接口的復(fù)雜性。

2)內(nèi)聚性

內(nèi)聚又稱塊內(nèi)聯(lián)系,是對模塊功能強度的度量,即一個模塊內(nèi)各個元素彼此結(jié)合的緊密程度,它是信息隱藏和局部化概念的自然擴展。簡單地說,理想內(nèi)聚的模塊只做一件

事情。

設(shè)計時應(yīng)該力求做到高內(nèi)聚,通常中等程度的內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差不多,避免使用低內(nèi)聚。

內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往往意味著模塊間的松耦合。內(nèi)聚和耦合都是進行模塊化設(shè)計的有力工具,但是實踐表明內(nèi)聚更重要,應(yīng)該把更多注意力集中到提高模塊的內(nèi)聚程度上。

模塊內(nèi)聚的主要類型有:功能內(nèi)聚、順序內(nèi)聚、通信內(nèi)聚、過程內(nèi)聚、時間內(nèi)聚、邏輯內(nèi)聚和偶然內(nèi)聚,如圖3-6所示。其中,功能內(nèi)聚和順序內(nèi)聚屬于高內(nèi)聚,通信內(nèi)聚和過程內(nèi)聚屬于中等程度的內(nèi)聚,時間內(nèi)聚、邏輯內(nèi)聚和偶然內(nèi)聚則屬于低內(nèi)聚;而且,模塊內(nèi)聚程度越高,其功能越集中、獨立性越強。

圖3-6模塊內(nèi)聚類型比較

①偶然內(nèi)聚。當(dāng)模塊內(nèi)各部分之間沒有聯(lián)系,或即使有聯(lián)系,這種聯(lián)系也很松散時,將會出現(xiàn)偶然內(nèi)聚。偶然內(nèi)聚往往產(chǎn)生于對程序的錯誤認識或沒有進行軟件結(jié)構(gòu)設(shè)計就直接編程。例如,一些編程人員可能會將一些沒有實質(zhì)聯(lián)系,但在程序中重復(fù)多次出現(xiàn)的語句抽出來,組成一個新的模塊,這樣的模塊就是偶然內(nèi)聚模塊。

偶然內(nèi)聚模塊由于是隨意拼湊而成的,模塊內(nèi)聚程度最低,功能模糊,很難進行維護。

②邏輯內(nèi)聚。邏輯內(nèi)聚是把幾種相關(guān)的功能組合在一起形成為一個模塊。在調(diào)用邏輯內(nèi)聚模塊時,可以由傳送給模塊的判定參數(shù)來確定該模塊應(yīng)執(zhí)行哪一種功能。

邏輯內(nèi)聚模塊比偶然內(nèi)聚模塊的內(nèi)聚程度要高,因為它表明了各部分之間在功能上的相關(guān)關(guān)系。但是它每次執(zhí)行的不是一種功能,而是若干功能中的一種,因此它不易修改。另外,在調(diào)用邏輯內(nèi)聚模塊時,需要進行控制參數(shù)的傳遞,由此增加了模塊間的耦合。

③時間內(nèi)聚。如果一個模塊包含的任務(wù)必須在同一段時間內(nèi)執(zhí)行,就叫時間內(nèi)聚。時間內(nèi)聚模塊一般是多功能模塊,其特點是模塊中的各項功能的執(zhí)行與時間有關(guān),通常要求所有功能必須在同一時間段內(nèi)執(zhí)行。例如初始化模塊,其功能可能包括給變量賦初值、連接數(shù)據(jù)源、打開數(shù)據(jù)表、打開文件等,這些操作要求在程序開始執(zhí)行的最初一段時間內(nèi)全部完成。

時間內(nèi)聚模塊比邏輯內(nèi)聚模塊的內(nèi)聚程度又稍高一些,其內(nèi)部邏輯比較簡單,一般不需要進行判定轉(zhuǎn)移。

④過程內(nèi)聚。如果一個模塊內(nèi)的處理是相關(guān)的,而且必須以特定次序執(zhí)行,則稱之為過程內(nèi)聚模塊。在使用流程圖設(shè)計程序的時候,常常通過流程圖來確定模塊劃分,由此得到的就往往是過程內(nèi)聚模塊。例如,可以根據(jù)流程圖中的循環(huán)部分、判定部分和計算部分將程序分成三個模塊,這三個模塊就是過程內(nèi)聚模塊。

過程內(nèi)聚模塊的內(nèi)聚程度比時間內(nèi)聚模塊的內(nèi)聚程度更強一些,但過程內(nèi)聚模塊僅包括完整功能的一部分,因此模塊之間的耦合程度比較高。

⑤通信內(nèi)聚。如果模塊中所有元素都使用同一個輸入數(shù)據(jù)和(或)產(chǎn)生同一個輸出數(shù)據(jù),則稱為通信內(nèi)聚。

⑥順序內(nèi)聚。如果一個模塊內(nèi)的處理元素和同一個功能密切相關(guān),而且這些處理必須順序執(zhí)行(通常一個處理元素的輸出數(shù)據(jù)作為下一個處理元素的輸入數(shù)據(jù)),則稱為順序內(nèi)聚。根據(jù)數(shù)據(jù)流圖劃分模塊時,通常得到順序內(nèi)聚的模塊,這種模塊彼此間的連接往往比較簡單。

⑦功能內(nèi)聚。如果模塊內(nèi)所有處理元素屬于一個整體,完成一個單一的功能,則稱為功能內(nèi)聚。功能內(nèi)聚是最高程度的內(nèi)聚。

功能內(nèi)聚模塊的特征是功能單一、接口簡單,因此其容易實現(xiàn)、便于維護。與其他內(nèi)聚類型相比,功能內(nèi)聚具有最高的內(nèi)聚程度,軟件結(jié)構(gòu)設(shè)計時應(yīng)以其作為追求目標(biāo)。

總之,耦合和內(nèi)聚是密切相關(guān)的,同其他模塊強耦合的模塊意味者弱內(nèi)聚,強內(nèi)聚模塊意味著與其他模塊間松散耦合。模塊獨立性設(shè)計目標(biāo)是:設(shè)計時力爭做到高內(nèi)聚,并且能夠辨認出低內(nèi)聚的模塊,有能力通過修改設(shè)計提高模塊的內(nèi)聚程度,降低模塊間的耦合程度,從而獲得較高的模塊獨立性。

5.逐步求精

逐步求精是人類解決復(fù)雜問題時采用的基本方法,也是許多軟件工程技術(shù)(例如規(guī)格說明技術(shù)、設(shè)計和實現(xiàn)技術(shù))的基礎(chǔ)??梢园阎鸩角缶x為:為了能集中精力解決主要問題而盡量推遲對問題細節(jié)的考慮。

逐步求精之所以如此重要,是因為人類的認知過程遵守Miller法則(米勒法則):一個人在任何時候都只能把注意力集中在(7?±?2)個知識塊上。

但是,在開發(fā)軟件的過程中,軟件工程師在一段時間內(nèi)需要考慮的知識塊數(shù)遠遠多于7。例如,一個程序通常不止使用7個數(shù)據(jù),一個用戶也往往有不止7個方面的需求。逐步求精方法的強大作用就在于,它能幫助軟件工程師把精力集中在與當(dāng)前開發(fā)階段最相關(guān)的那些方面上,而忽略那些對整體解決方案來說雖然是必要的,然而目前還不需要考慮的細節(jié),這些細節(jié)將留到以后再考慮。Miller法則是人類智力的基本局限,我們不可能戰(zhàn)勝自己的自然本性,只能接受這個事實,承認自身的局限性,并在這個前提下盡我們的最大努力工作。

事實上,可以把逐步求精看作是一項把一個時期內(nèi)必須解決的種種問題按優(yōu)先級排序的技術(shù)。逐步求精方法確保每個問題都將被解決,而且每個問題都將在適當(dāng)?shù)臅r候被解決,但是,在任何時候一個人都不需要同時處理7個以上知識塊。

抽象與逐步求精是一對互補的概念。抽象能夠明確說明內(nèi)部過程和數(shù)據(jù),但對“外部使用者”隱藏了低層細節(jié)。事實上,可以把抽象看作是一種通過忽略多余的細節(jié)同時強調(diào)有關(guān)的細節(jié),而實現(xiàn)逐步求精的方法。逐步求精則幫助設(shè)計者在設(shè)計過程中逐步揭示低層細節(jié)。這兩個概念都有助于設(shè)計者在設(shè)計演化過程中創(chuàng)造出完整的設(shè)計模型。

例如要開發(fā)一個CAD軟件。下面在不同的抽象層次上,應(yīng)用不同的描述方法對該問題進行抽象和細化。

在這一抽象層次上,給出了初步過程表示,所有的術(shù)語都是面向軟件的,并且模塊結(jié)構(gòu)也開始明朗。細化過程可進行下去,直到獲得源代碼。

6.重構(gòu)

重構(gòu)是一種重新組織的技術(shù),可以簡化構(gòu)件的設(shè)計(或代碼)而無需改變其功能或行為。Fowler這樣定義重構(gòu):“重構(gòu)是使用這樣一種方式改變軟件系統(tǒng)的過程:不改變代碼(設(shè)計)的外部行為而是改進其內(nèi)部結(jié)構(gòu)。”

當(dāng)重構(gòu)軟件時,檢查現(xiàn)有設(shè)計的冗余性、沒有使用的設(shè)計元素、低效的或不必要的算法、拙劣的或不恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)以及其他設(shè)計不足,修改這些不足以獲得更好的設(shè)計。例如,第一次設(shè)計迭代可能得到一個構(gòu)件,表現(xiàn)出很低的內(nèi)聚性(即執(zhí)行三個功能但是相互之間僅有有限的聯(lián)系)。設(shè)計人員可以決定將構(gòu)件重構(gòu)為三個獨立的構(gòu)件,每個都表現(xiàn)出較高的內(nèi)聚性。這樣的處理結(jié)果將實現(xiàn)一個易集成、易測試和易維護的軟件。

3.2.2啟發(fā)式規(guī)則

軟件設(shè)計人員應(yīng)注意積累、吸取教訓(xùn)、總結(jié)經(jīng)驗技巧,為下一個項目的實施做好開端。這些經(jīng)驗?zāi)芙o軟件工程師以有益的啟示,往往能幫助他們找到改進軟件設(shè)計、提高軟件質(zhì)量的途徑。下面介紹幾條啟發(fā)式規(guī)則。

1.改進軟件結(jié)構(gòu),提高模塊獨立性

設(shè)計出軟件的初步結(jié)構(gòu)以后,應(yīng)該審查分析這個結(jié)構(gòu),通過模塊分解或合并,力求降低耦合提高內(nèi)聚。例如,多個模塊共有的某個子功能可以獨立成一個模塊,由這些模塊調(diào)用;有時可以通過分解或合并模塊以減少控制信息的傳遞及對全程數(shù)據(jù)的引用,并且降低接口的復(fù)雜程度。

2.模塊規(guī)模應(yīng)該適中

模塊的大小,可以用模塊中所包含語句的數(shù)量多少來衡量。經(jīng)驗表明,一個模塊的規(guī)模不應(yīng)過大,最好能寫在一頁紙內(nèi)(通常不超過60行語句)。有人從心理學(xué)角度研究得知,當(dāng)一個模塊包含的語句數(shù)超過30行以后,模塊的可理解程度迅速下降。

過大的模塊往往是由于分解不充分造成的,在進一步分解時必須符合問題結(jié)構(gòu),不應(yīng)該降低模塊獨立性。過小的模塊開銷大于有效操作,而且模塊數(shù)目過多將使系統(tǒng)接口復(fù)雜。因此過小的模塊有時不值得單獨存在,特別是只有一個模塊調(diào)用它時,通常可以把它合并到上級模塊中去而不必單獨存在。

需要注意的是,初學(xué)編程時不能夠為了實現(xiàn)功能而盲目編程,要注意程序語句的優(yōu)化。

3.深度、寬度、扇出和扇入都應(yīng)適當(dāng)

深度表示軟件結(jié)構(gòu)中從頂層模塊到最低層模塊的層數(shù),它往往能粗略地標(biāo)志一個系統(tǒng)的大小和復(fù)雜程度。深度和程序長度之間應(yīng)該有粗略的對應(yīng)關(guān)系,當(dāng)然這個對應(yīng)關(guān)系是在一定范圍內(nèi)變化的。如果層數(shù)過多則應(yīng)該考慮是否有許多管理模塊過分簡單了,能否適當(dāng)合并。

寬度是軟件結(jié)構(gòu)內(nèi)同一個層次上的模塊總數(shù)的最大值。一般來說,寬度越大系統(tǒng)越復(fù)雜。對寬度影響最大的因素是模塊的扇出。

扇出是一個模塊直接控制(調(diào)用)下屬的模塊數(shù)目,扇出過大意味著模塊過分復(fù)雜,需要控制和協(xié)調(diào)過多的下級模塊;扇出過小(例如總是1)也不好。經(jīng)驗表明,一個設(shè)計得好的典型系統(tǒng)的平均扇出通常是3或4(扇出的上限通常是5~9)。

扇出太大一般是因為缺乏中間層次,應(yīng)該適當(dāng)增加中間層次的控制模塊。扇出太小時可以把下級模塊進一步分解成若干個子功能模塊,或者合并到它的上級模塊中去。當(dāng)然分解模塊或合并模塊必須符合問題結(jié)構(gòu),不能違背模塊獨立性原理。

扇入指一個模塊的直接上屬模塊個數(shù)。一個模塊的扇入表明有多少個上級模塊直接調(diào)用它,扇入越大則共享該模塊的上級模塊數(shù)目越多,這是有好處的,但是不能違背模塊獨立原理單純追求高扇入。

圖3-7展示了一個軟件結(jié)構(gòu)的深度、寬度、扇入、扇出情況。觀察大量軟件系統(tǒng)后發(fā)現(xiàn),設(shè)計得很好的軟件結(jié)構(gòu)通常頂層扇出比較高,中層扇出較少,底層扇入到公共的實用模塊中去(底層模塊有高扇入)。

圖3-7軟件結(jié)構(gòu)示意圖

4.模塊的作用域應(yīng)該在控制域之內(nèi)

模塊的作用域定義為受該模塊內(nèi)一個判定影響的所有模塊的集合。模塊的控制域是這個模塊本身以及所有直接或間接從屬于它的模塊的集合。例如,在圖3-8中模塊A的控制域是A、B、C、D、E、F等模塊的集合。

在一個設(shè)計得很好的系統(tǒng)中,所有受判定影響的模塊應(yīng)該都從屬于做出判定的那個模塊,最好局限于做出判定的那個模塊本身及它的直屬下級模塊。

圖3-8模塊的作用域和控制域

5.力爭降低模塊接口的復(fù)雜程度

模塊接口的設(shè)計非常重要,往往影響模塊的可讀性。模塊接口復(fù)雜是軟件發(fā)生錯誤的一個主要原因。應(yīng)該仔細設(shè)計模塊接口,使得信息傳遞簡單并且和模塊的功能一致。接口復(fù)雜或不一致(即看起來傳遞的數(shù)據(jù)之間沒有聯(lián)系),是緊耦合或低內(nèi)聚的征兆,應(yīng)該重新分析這個模塊的獨立性。

6.設(shè)計單入口、單出口的模塊

單入口、單出口模塊不會使模塊間出現(xiàn)內(nèi)容耦合。當(dāng)從頂部進入模塊并且從底部退出時,軟件是比較容易理解的,因此也是比較容易維護的。

7.模塊功能應(yīng)該可以預(yù)測

模塊的功能應(yīng)該能夠預(yù)測,但也要防止模塊功能過分局限。如果一個模塊可以當(dāng)作一個黑盒子,也就是說,只要輸入的數(shù)據(jù)相同就產(chǎn)生同樣的輸出,這個模塊的功能就是可以預(yù)測的。

如果一個模塊只完成一個單獨的子功能,則呈現(xiàn)高內(nèi)聚;但是,如果一個模塊任意限制局部數(shù)據(jù)結(jié)構(gòu)的大小,過分限制在控制流中可以做出的選擇或者外部接口的模式,那么這種模塊的功能就過分局限,使用范圍也就過分狹窄了。

8.軟件包應(yīng)滿足設(shè)計約束和可移植性

為了使得軟件包可以在某些特定的環(huán)境下能夠安裝和運行,對軟件包提出了一些設(shè)計約束和可移植的要求。

以上列出的啟發(fā)式規(guī)則多數(shù)是經(jīng)驗規(guī)律,對改進設(shè)計和提高軟件質(zhì)量往往有重要的參考價值;但是,它們既不是設(shè)計的目標(biāo),也不是設(shè)計時應(yīng)該普遍遵循的原理。

3.3描繪軟件結(jié)構(gòu)的圖形工具

3.3.1層次圖和HIPO圖

層次圖用來描繪軟件的層次結(jié)構(gòu)。雖然層次圖的形式和2.9節(jié)中介紹的描繪數(shù)據(jù)結(jié)構(gòu)的層次方框圖相同,但是表現(xiàn)的內(nèi)容卻完全不同。層次圖中的一個矩形框代表一個模塊,方框間的連線表示調(diào)用關(guān)系而不像層次方框圖那樣表示組成關(guān)系。圖3-9是層次圖的一個例子。層次圖很適于在自頂向下設(shè)計軟件的過程中使用。圖3-9正文加工系統(tǒng)的層次圖

HIPO圖是美國IBM公司發(fā)明的“層次圖加輸入/處理/輸出圖”的英語縮寫。為了能使HIPO圖具有可追蹤性,在H圖(層次圖)里除了最頂層的方框之外,每個方框都加了編號。編號規(guī)則和2.7節(jié)中介紹的數(shù)據(jù)流圖的編號規(guī)則相同,例如圖3-9加了編號后得到圖3-10。

圖3-10帶編號的層次圖(H圖)

與H圖中每個方框相對應(yīng),應(yīng)該有一張IPO圖描繪這個方框代表的模塊的處理過程。HIPO圖中的每張IPO圖內(nèi)都應(yīng)該明顯地標(biāo)出它所描繪的模塊在H圖中的編號,以便追蹤了解這個模塊在軟件結(jié)構(gòu)中的位置。

3.3.2軟件結(jié)構(gòu)圖

軟件結(jié)構(gòu)圖是進行軟件結(jié)構(gòu)設(shè)計的另一個有力工具。結(jié)構(gòu)圖和層次圖類似,也是描繪軟件結(jié)構(gòu)的圖形工具。圖中一個方框代表一個模塊,框內(nèi)注明模塊的名字或主要功能;方框之間的箭頭(或直線)表示模塊的調(diào)用關(guān)系。如圖3-11所示為結(jié)構(gòu)圖的基本符號。圖3-12是結(jié)構(gòu)圖的一個例子——“自動閱卷系統(tǒng)”的軟件結(jié)構(gòu)圖。

圖3-11結(jié)構(gòu)圖的基本符號圖3-12結(jié)構(gòu)圖的例子—“自動閱卷系統(tǒng)”的軟件結(jié)構(gòu)圖

如果希望進一步標(biāo)明傳遞的信息是數(shù)據(jù)還是控制信息,則可以利用注釋箭頭尾部的形狀來區(qū)分:尾部是空心圓表示傳遞的是數(shù)據(jù),實心圓表示傳遞的是控制信息(見圖3-11)。

以上介紹的是結(jié)構(gòu)圖的基本符號。此外還有一些附加的符號,可以表示模塊的選擇調(diào)用或循環(huán)調(diào)用。圖3-13表示模塊M有條件地調(diào)用另一個模塊A(或者模塊B、C)時,在模塊M的箭頭尾部標(biāo)以一個菱形符號,表示條件選擇。圖3-14表示模塊M反復(fù)地調(diào)用模塊A、B和C時,在模塊M的箭頭尾部則標(biāo)以一個弧形符號表示循環(huán)。

圖3-13選擇

圖3-14循環(huán)

注意,層次圖和結(jié)構(gòu)圖并不嚴格表示模塊的調(diào)用次序。雖然多數(shù)人習(xí)慣于按調(diào)用次序從左到右畫模塊,但并沒有這種規(guī)定,出于其他方面的考慮(例如為了減少交叉線),也完全可以不按這種次序畫。此外,層次圖和結(jié)構(gòu)圖并不指明什么時候調(diào)用下層模塊。通常上層模塊中除了調(diào)用下層模塊的語句之外還有其他語句,究竟是先執(zhí)行調(diào)用下層模塊的語句還是先執(zhí)行其他語句,在圖中絲毫沒有指明。事實上,層次圖和結(jié)構(gòu)圖只表明一個模塊調(diào)用哪些模塊,至于模塊內(nèi)還有沒有其他成分則完全沒有表示。

通常用層次圖作為描繪軟件結(jié)構(gòu)的文檔。結(jié)構(gòu)圖作為文檔并不很合適,因為圖上包含的信息太多,有時反而降低了清晰程度。但是,利用IPO圖或數(shù)據(jù)字典中的信息得到模塊調(diào)用時傳遞的信息,并由層次圖導(dǎo)出結(jié)構(gòu)圖的過程,卻可以作為檢查設(shè)計正確性和評價模塊獨立性的好方法。比如,可以提出這樣的問題:傳送的每個數(shù)據(jù)元素都是完成模塊功能所必需的嗎?反之,完成模塊功能必需的每個數(shù)據(jù)元素都傳送來了嗎?所有數(shù)據(jù)元素都只和單一的功能有關(guān)嗎?如果發(fā)現(xiàn)軟件結(jié)構(gòu)圖上模塊間的聯(lián)系不容易解釋,則應(yīng)該考慮是否設(shè)計上存在問題。

3.4映射數(shù)據(jù)流到軟件結(jié)構(gòu)

面向數(shù)據(jù)流的設(shè)計方法,是基于描繪信息流動和處理的數(shù)據(jù)流圖(DFD),從數(shù)據(jù)流圖出發(fā),根據(jù)數(shù)據(jù)流特性,劃分軟件模塊,建立軟件結(jié)構(gòu)的。

在軟件工程的需求分析階段,信息流是一個關(guān)鍵考慮,通常用數(shù)據(jù)流圖描繪信息在系統(tǒng)中加工和流動的情況。面向數(shù)據(jù)流的設(shè)計方法定義了一些不同的“映射”,利用這些映射可以把數(shù)據(jù)流圖變換成軟件結(jié)構(gòu)。因為任何軟件系統(tǒng)都可以用數(shù)據(jù)流圖表示,所以面向數(shù)據(jù)流的設(shè)計方法理論上可以設(shè)計任何軟件的結(jié)構(gòu)。

面向數(shù)據(jù)流的設(shè)計方法把信息流映射成軟件結(jié)構(gòu),信息流的類型決定了映射的方法。信息流主要有變換流和事務(wù)流兩種類型。

3.4.1變換流

信息沿輸入通路進入系統(tǒng),同時由外部形式變換成內(nèi)部形式,進入系統(tǒng)的信息通過變換中心,經(jīng)加工處理以后再沿輸出通路變換成外部形式離開軟件系統(tǒng)。當(dāng)數(shù)據(jù)流圖具有這些特征時,這種信息流就叫做變換流。變換流是一個線性結(jié)構(gòu),由輸入、變換、輸出三部分組成,如圖3-15所示。變換流是數(shù)據(jù)處理過程的核心工作,而輸入流只是為它做準備,輸出流是對變換后的數(shù)據(jù)進行后處理工作。

圖3-15變換流

3.4.2事務(wù)流

基本系統(tǒng)模型意味著變換流,原則上所有信息流都可以歸結(jié)為這一類。但是,還有一類數(shù)據(jù)流是“以事務(wù)為中心的”,也就是說,數(shù)據(jù)沿輸入通路到達一個處理T,這個處理根據(jù)輸入數(shù)據(jù)的類型在若干個動作序列中選出一個來執(zhí)行。這類數(shù)據(jù)流應(yīng)該劃為一類特殊的數(shù)據(jù)流,稱為事務(wù)流。圖3-16中的處理T稱為事務(wù)中心,它主要完成三個任務(wù):①接收輸入數(shù)據(jù)(輸入數(shù)據(jù)又稱為事務(wù)),②分析每個事務(wù)以確定它的類型,③根據(jù)事務(wù)類型選取一條活動通路。

圖3-16事務(wù)流

3.4.3變換映射(變換分析)

變換映射方法是一系列設(shè)計步驟的總稱,經(jīng)過這些步驟把具有變換流特點的數(shù)據(jù)流圖按預(yù)先確定的模式映射成軟件結(jié)構(gòu)。一般情況下,先運用變換映射方法建立初始的變換型系統(tǒng)結(jié)構(gòu)圖,然后對它做進一步的改進,最后得到系統(tǒng)的最終結(jié)構(gòu)圖。

變換映射方法主要由以下七個步驟組成:

(1)復(fù)查基本系統(tǒng)模型。

復(fù)查的目的是確保系統(tǒng)的輸入數(shù)據(jù)和輸出數(shù)據(jù)符合實際。

(2)復(fù)查并精化數(shù)據(jù)流圖。

應(yīng)該對需求分析階段得出的數(shù)據(jù)流圖認真復(fù)查,并且在必要時進行精化。不僅要確保數(shù)據(jù)流圖給出了目標(biāo)系統(tǒng)的正確的邏輯模型,而且應(yīng)該使數(shù)據(jù)流圖中每個處理都代表一個規(guī)模適中、相對獨立的子功能。需求分析階段得出的數(shù)據(jù)流圖經(jīng)過精化后,對于軟件結(jié)構(gòu)設(shè)計的“第一次分割”已足夠詳細,可以進行下一步設(shè)計步驟。

(3)確定數(shù)據(jù)流圖具有變換特性還是事務(wù)特性。

通常,一個系統(tǒng)中的所有信息流都可以認為是變換流,但是,當(dāng)遇到有明顯事務(wù)特性的信息流時,建議采用事務(wù)分析方法進行設(shè)計。在這一步,設(shè)計人員應(yīng)該根據(jù)數(shù)據(jù)流圖中占優(yōu)勢的屬性,確定數(shù)據(jù)流的全局特性。此外還應(yīng)該把具有和全局特性不同特點的局部區(qū)域孤立出來,以后可以按照這些子數(shù)據(jù)流的特點精化根據(jù)全局特性得出的軟件結(jié)構(gòu)。

(4)確定輸入流和輸出流的邊界,從而孤立出變換中心。

所謂輸入/輸出數(shù)據(jù)流,是指輸入、輸出主加工的數(shù)據(jù)流。通常把物理輸入轉(zhuǎn)換為邏輯輸入的數(shù)據(jù)流稱為輸入流,將邏輯輸出轉(zhuǎn)換為物理輸出的數(shù)據(jù)流稱為輸出流。例如,為了確定系統(tǒng)的邏輯輸入和邏輯輸出,可以從數(shù)據(jù)流圖的物理輸入端開始,一步一步向系統(tǒng)中間移動,一直到某個數(shù)據(jù)流不再被看作是系統(tǒng)的輸入為止,這個數(shù)據(jù)流的前一個數(shù)據(jù)流就是系統(tǒng)的邏輯輸入,從物理輸入端到邏輯輸入,構(gòu)成系統(tǒng)的輸入部分。確定系統(tǒng)的邏輯輸出也是類似的步驟。在輸入部分和輸出部分之間的就是變換中心部分。

(5)完成第一級分解。

軟件結(jié)構(gòu)代表對控制的自頂向下的分配。所謂分解,就是分配控制的過程。

對于變換流的情況,數(shù)據(jù)流圖被映射成一個特殊的軟件結(jié)構(gòu),這個結(jié)構(gòu)控制輸入、變換和輸出等信息處理過程。圖3-17說明了第一級分解的方法。

圖3-17第一級分解的方法

位于軟件結(jié)構(gòu)最頂層的控制模塊M協(xié)調(diào)下述從屬的控制功能:輸入信息處理控制模塊CI,協(xié)調(diào)對所有輸入數(shù)據(jù)的接收;變換中心控制模塊CT,管理對內(nèi)部形式的數(shù)據(jù)的所有操作;輸出信息處理控制模塊CO,協(xié)調(diào)輸出信息的產(chǎn)生過程。

雖然圖3-17意味著一個三叉的控制結(jié)構(gòu),但是,對一個大型系統(tǒng)中的復(fù)雜數(shù)據(jù)流可以用兩個或多個模塊完成上述一個模塊的控制功能。應(yīng)該在能夠完成控制功能并且保持好的耦合和內(nèi)聚特性的前提下,盡量使第一級控制中的模塊數(shù)目取最小值。

(6)完成第二級分解。

第二級分解的工作是自頂向下,逐步細化,為第一層的每一個輸入模塊、輸出模塊和處理模塊設(shè)計它們的從屬模塊。圖3-18表示進行第二級分解的普遍途徑。

圖3-18第二級分解的方法

完成第二級分解的方法是:從變換中心的邊界開始沿著輸入通路向外移動,把輸入通路中每個處理映射成軟件結(jié)構(gòu)中CI控制下的一個低層模塊;然后沿輸出通路向外移動,把輸出通路中每個處理映射成直接或間接受模塊CO控制的一個低層模塊;最后把變換中心內(nèi)的每個處理映射成受CT控制的一個模塊。為輸入模塊CI設(shè)計下層模塊“取B”和“轉(zhuǎn)換B”,為輸出模塊CO設(shè)計下層模塊“送E”。

雖然圖3-18描述了在數(shù)據(jù)流圖中的處理和軟件結(jié)構(gòu)中的模塊之間的一對一映射關(guān)系,但是,不同的映射經(jīng)常出現(xiàn)。應(yīng)該根據(jù)實際情況以及好設(shè)計的標(biāo)準,進行實際的第二級分解。在第二級分解中,雖然每個模塊的名字表明了它的基本功能,但是仍然應(yīng)該為每個模塊寫一個簡要說明和描述:

①進出該模塊的信息(接口描述);

②模塊內(nèi)部的信息;

③過程陳述,包括主要判定點及任務(wù)等;

④對約束和特殊特點的簡短討論。

這些描述是第一代的設(shè)計規(guī)格說明,此設(shè)計時期進一步的精化和補充是經(jīng)常發(fā)生的。

(7)使用設(shè)計度量和啟發(fā)式規(guī)則對第一次分解得到的軟件結(jié)構(gòu)進一步精化。

第一次分解得到的軟件結(jié)構(gòu),總可以根據(jù)模塊獨立原理進行精化。為了產(chǎn)生合理的分解,得到盡可能高的內(nèi)聚、盡可能松散的耦合,最重要的是,為了得到一個易于實現(xiàn)、易于測試和易于維護的軟件結(jié)構(gòu),應(yīng)該對初步分解得到的模塊進行再分解或合并。對中下層的模塊繼續(xù)細化,一直分解到物理的輸入和輸出為止。如圖3-18中為“取B”模塊設(shè)計下層模塊“取A”和“轉(zhuǎn)換A”,“送E”模塊設(shè)計下層模塊“送F”和“轉(zhuǎn)換E”。

需要注意的是,結(jié)構(gòu)圖中的模塊并非是由數(shù)據(jù)流圖中的加工直接對應(yīng)轉(zhuǎn)換而來的,加工和模塊之間不存在一一對應(yīng)的關(guān)系,而結(jié)構(gòu)圖與數(shù)據(jù)流圖之間的數(shù)據(jù)流存在對應(yīng)關(guān)系。

遵循上述7個設(shè)計步驟的目的是開發(fā)出軟件的整體表示。也就是說,一旦確定了軟件結(jié)構(gòu)就可以把它作為一個整體來復(fù)查,從而能夠評價和精化軟件結(jié)構(gòu)。此時期進行修改只需要很少的附加工作,但是卻能夠?qū)浖馁|(zhì)量,特別是軟件的可維護性產(chǎn)生深遠的影響。

3.4.4事務(wù)映射(事務(wù)分析)

雖然在任何情況下都可以使用變換分析方法設(shè)計軟件結(jié)構(gòu),但是在數(shù)據(jù)流具有明顯的事務(wù)特點時,也就是有一個明顯的事務(wù)中心時,還是以采用事務(wù)分析方法為宜。

事務(wù)分析的設(shè)計步驟和變換分析的設(shè)計步驟大部分相同或類似,主要差別僅在于由數(shù)據(jù)流圖到軟件結(jié)構(gòu)的映射方法不同。

由事務(wù)流映射成的軟件結(jié)構(gòu)包括一個接收分支和一個發(fā)送分支。映射出接收分支結(jié)構(gòu)的方法和變換分析映射出輸入結(jié)構(gòu)的方法很相像,即從事務(wù)中心的邊界開始,把沿著接收流通路的處理映射成模塊。發(fā)送分支的結(jié)構(gòu)包含一個發(fā)送事務(wù)模塊,它控制下層的所有活動模塊;然后把數(shù)據(jù)流圖中的每個活動流通路映射成與它的流特征相對應(yīng)的結(jié)構(gòu)。圖3-19說明了上述映射過程。

對于一個大系統(tǒng),常常把變換分析和事務(wù)分析應(yīng)用到同一個數(shù)據(jù)流圖的不同部分,由此得到的子結(jié)構(gòu)形成“構(gòu)件”,可以利用它們構(gòu)造完整的軟件結(jié)構(gòu)。

如果數(shù)據(jù)流不具有顯著的事務(wù)特點,最好使用變換分析;反之,如果具有明顯的事務(wù)中心,則應(yīng)該采用事務(wù)分析技術(shù)。但是,機械地遵循變換分析或事務(wù)分析的映射規(guī)則,很可能會得到一些不必要的控制模塊,如果它們確實用處不大,那么可以而且應(yīng)該把它們合并。反之,如果一個控制模塊功能過分復(fù)雜,則應(yīng)該將其分解為兩個或多個控制模塊,或者增加中間層次的控制模塊。

圖3-19事務(wù)分析的映射方法

一般來說,對于高層模塊采用以事務(wù)為中心的設(shè)計策略,對于低層模塊采用以變換為中心的設(shè)計策略。

3.4.5設(shè)計優(yōu)化—精化軟件結(jié)構(gòu)

軟件設(shè)計人員對于獲得的初始軟件結(jié)構(gòu)圖進行優(yōu)化,使其結(jié)構(gòu)更加合理。優(yōu)化原則是結(jié)構(gòu)穩(wěn)定、易于實現(xiàn)、易于理解、易于測試和維護。

應(yīng)該在設(shè)計的早期階段盡量對軟件結(jié)構(gòu)進行精化??梢詫?dǎo)出不同的軟件結(jié)構(gòu),然后對它們進行評價和比較,力求得到“最好”的結(jié)果。這種優(yōu)化的可能,是把軟件結(jié)構(gòu)設(shè)計和過程設(shè)計分開的真正優(yōu)點之一。

注意,結(jié)構(gòu)簡單通常既表示設(shè)計風(fēng)格優(yōu)雅,又表明效率高。設(shè)計優(yōu)化應(yīng)該力求做到在有效的模塊化的前提下使用最少量的模塊,以及在能夠滿足信息要求的前提下使用最簡單的數(shù)據(jù)結(jié)構(gòu)。

對于時間是決定性因素的應(yīng)用場合,可能有必要在詳細設(shè)計階段,也可能在編寫程序的過程中進行優(yōu)化。軟件開發(fā)人員應(yīng)該認識到,程序中相對比較小的部分(典型地,10%~20%),通常占用全部處理時間的大部分(50%~80%)。用下述方法對時間起決定性作用的軟件進行優(yōu)化是合理的:

在不考慮時間因素的前提下開發(fā)并精化軟件結(jié)構(gòu);

在詳細設(shè)計階段選出最耗費時間的那些模塊,仔細地設(shè)計它們的處理過程(算法),以求提高效率;

使用高級程序設(shè)計語言編寫程序;

在軟件中孤立出那些大量占用處理機資源的模塊;

必要時重新設(shè)計或用依賴于機器的語言重寫上述大量占用資源的模塊的代碼,以求提高效率。

上述優(yōu)化方法遵守了一句格言:“先使它能工作(功能),然后再使它快起來(性能)?!?/p>

3.5數(shù)據(jù)庫結(jié)構(gòu)設(shè)計過程

數(shù)據(jù)庫管理系統(tǒng)(DatabaseManagementSystem,DBMS)自從20世紀60年代出現(xiàn)后,經(jīng)歷了一系列的發(fā)展階段,目前主要有層次型、網(wǎng)狀型、關(guān)系型和面向?qū)ο髷?shù)據(jù)庫四種類型。其中關(guān)系型數(shù)據(jù)庫設(shè)計主要分以下六個階段:需求分析、概念設(shè)計、邏輯設(shè)計、物理設(shè)計、數(shù)據(jù)庫實施、數(shù)據(jù)庫運行和維護。

數(shù)據(jù)庫設(shè)計中需求分析階段綜合各個用戶的應(yīng)用需求(現(xiàn)實世界的需求),在概念設(shè)計階段形成獨立于機器特點、獨立于各個DBMS產(chǎn)品的概念模式(信息世界模型),用E-R圖來描述。在邏輯設(shè)計階段將E-R圖轉(zhuǎn)換成具體的數(shù)據(jù)庫產(chǎn)品支持的數(shù)據(jù)模型,如關(guān)系模型,形成數(shù)據(jù)庫邏輯模式。然后根據(jù)用戶處理的要求和安全性的考慮,在基本表的基礎(chǔ)上再建立必要的視圖(View),形成數(shù)據(jù)的外模式。在物理設(shè)計階段根據(jù)DBMS特點和處理的需要,進行物理存儲安排,設(shè)計索引,形成數(shù)據(jù)庫內(nèi)模式。

數(shù)據(jù)庫設(shè)計開始之前,首先必須選定參加設(shè)計的人員,包括系統(tǒng)分析人員、數(shù)據(jù)庫設(shè)計人員和程序員、用戶和數(shù)據(jù)庫管理員。系統(tǒng)分析和數(shù)據(jù)庫設(shè)計人員是數(shù)據(jù)庫設(shè)計的核心人員,他們將自始至終參與數(shù)據(jù)庫設(shè)計,他們的水平?jīng)Q定了數(shù)據(jù)庫系統(tǒng)的質(zhì)量。用戶和數(shù)據(jù)庫管理員在數(shù)據(jù)庫設(shè)計中也是舉足輕重的,他們主要參加需求分析和數(shù)據(jù)庫的運行維護,他們的積極參與不但能加速數(shù)據(jù)庫設(shè)計,而且也是決定數(shù)據(jù)庫設(shè)計質(zhì)量的重要因素。程序員則在系統(tǒng)實施階段參與進來,分別負責(zé)編制程序和準備軟硬件環(huán)境。

數(shù)據(jù)庫設(shè)計步驟主要為:

需求分析:將業(yè)務(wù)管理單、證、表流化為數(shù)據(jù)流,劃分主題之間的邊界,繪制出DFD圖,并完成相應(yīng)的數(shù)據(jù)字典;

概念設(shè)計:從DFD出發(fā),繪制出本主題的E-R圖,即實體-聯(lián)系圖,并列出各個實體與聯(lián)系的綱要表;

邏輯設(shè)計:從E-R圖與對應(yīng)的綱要表出發(fā),確定各個實體及聯(lián)系的表名屬性;

物理設(shè)計:確定所有屬性的類型、寬度與取值范圍、設(shè)計出基本表的主關(guān)鍵字(簡稱主鍵,其作用是表示數(shù)據(jù)結(jié)構(gòu)中唯一的一條信息或記錄,例如企業(yè)人事檔案數(shù)據(jù)中不能存在兩個完全相同的職工檔案,要么用職工編號區(qū)分,要么用多個條件區(qū)分(復(fù)合主鍵)),將所有的表名與字段名英文化,實現(xiàn)物理建庫、完成數(shù)據(jù)庫物理設(shè)計字典文件(統(tǒng)稱為*.SQL腳本文件);

加載測試:貫穿于程序測試工作的全過程,整個錄入、修改、查詢、數(shù)據(jù)處理工作均可視為對數(shù)據(jù)庫的加載測試。

3.6實例分析

通過第2章的需求分析,已獲得教材購銷系統(tǒng)第1層的銷售子系統(tǒng)和采購子系統(tǒng)兩張數(shù)據(jù)流圖。試用結(jié)構(gòu)化方法將上述這兩張數(shù)據(jù)流圖轉(zhuǎn)換成軟件的總體結(jié)構(gòu)圖。

(1)細化并修改數(shù)據(jù)流圖。

首先看銷售子系統(tǒng),共有6個加工,其中加工1.4包含登記售書和打印領(lǐng)書單兩項功能。為了提高模塊獨立性,可將它分解為兩個加工,讓原來的加工1.4只登記售書,另外添加一個加工1.7“打印領(lǐng)書單”。

再考察采購子系統(tǒng),來自書庫保管員的“進書通知”,不僅本系統(tǒng)要用它來修改教材存量表F1和待購教材表F5,還要傳遞給銷售子系統(tǒng),以便及時通知學(xué)生補售。“登記進書”和“補售教材”分屬于兩個子系統(tǒng),且補售只能在登記之后進行,為避免補售時在鍵盤上重復(fù)輸入“進書通知”的內(nèi)容,可以在系統(tǒng)中增加一個“進書登記表”文件F7,供兩個子系統(tǒng)共享,該文件組成是:

進書登記表={書號+書名+數(shù)量+登記標(biāo)志+補售標(biāo)志}

其中兩個標(biāo)志的初值均為“假”,分別在執(zhí)行登記和補售功能后改為“真”。

經(jīng)過上述的細化和修改,可獲得兩張新的數(shù)據(jù)流圖,即圖3-20的修改后的銷售子系統(tǒng)和圖3-21的修改后的采購子系統(tǒng)。同時,對它們的父圖也要作相應(yīng)的修改,才能保持一致。

圖3-20修改后

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論