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

下載本文檔

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

文檔簡(jiǎn)介

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

知識(shí)點(diǎn)

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

難點(diǎn)

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

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

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

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

應(yīng)該說,軟件概要設(shè)計(jì)是軟件開發(fā)過程中一個(gè)非常重要的階段。可以肯定,如果軟件系統(tǒng)沒有經(jīng)過認(rèn)真細(xì)致的概要設(shè)計(jì),就直接考慮它的算法或直接編寫源程序,這個(gè)系統(tǒng)的質(zhì)量就很難保證。許多軟件就是因?yàn)榻Y(jié)構(gòu)上的問題,使得它經(jīng)常發(fā)生故障,而且很難維護(hù)。

3.1總體設(shè)計(jì)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3)選取合理的方案

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

系統(tǒng)流程圖;

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

成本/效益分析;

實(shí)現(xiàn)這個(gè)系統(tǒng)的進(jìn)度計(jì)劃。

4)推薦最佳方案

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

5)制定規(guī)范

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

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

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

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

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

6)功能分解

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

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

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

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

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

功能分解導(dǎo)致數(shù)據(jù)流圖的進(jìn)一步細(xì)化,同時(shí)還應(yīng)該用IPO圖或其他適當(dāng)?shù)墓ぞ吆?jiǎn)要描述細(xì)化后每個(gè)處理的算法。

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

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

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

確定每個(gè)模塊的功能;

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

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

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

8)可靠性設(shè)計(jì)

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

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

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

10)制定測(cè)試計(jì)劃

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

11)書寫文檔

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

12)審查和復(fù)審

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.模塊化

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

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

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

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

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

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

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

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

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

3.局部化與信息隱藏

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

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

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

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

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

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

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

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

1)耦合

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2)內(nèi)聚性

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

事情。

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

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

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

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

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

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

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

邏輯內(nèi)聚模塊比偶然內(nèi)聚模塊的內(nèi)聚程度要高,因?yàn)樗砻髁烁鞑糠种g在功能上的相關(guān)關(guān)系。但是它每次執(zhí)行的不是一種功能,而是若干功能中的一種,因此它不易修改。另外,在調(diào)用邏輯內(nèi)聚模塊時(shí),需要進(jìn)行控制參數(shù)的傳遞,由此增加了模塊間的耦合。

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

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

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

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

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

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

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

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

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

5.逐步求精

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

逐步求精之所以如此重要,是因?yàn)槿祟惖恼J(rèn)知過程遵守Miller法則(米勒法則):一個(gè)人在任何時(shí)候都只能把注意力集中在(7?±?2)個(gè)知識(shí)塊上。

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

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

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

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

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

6.重構(gòu)

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

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

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

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

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

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

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

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

過大的模塊往往是由于分解不充分造成的,在進(jìn)一步分解時(shí)必須符合問題結(jié)構(gòu),不應(yīng)該降低模塊獨(dú)立性。過小的模塊開銷大于有效操作,而且模塊數(shù)目過多將使系統(tǒng)接口復(fù)雜。因此過小的模塊有時(shí)不值得單獨(dú)存在,特別是只有一個(gè)模塊調(diào)用它時(shí),通??梢园阉喜⒌缴霞?jí)模塊中去而不必單獨(dú)存在。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上列出的啟發(fā)式規(guī)則多數(shù)是經(jīng)驗(yàn)規(guī)律,對(duì)改進(jìn)設(shè)計(jì)和提高軟件質(zhì)量往往有重要的參考價(jià)值;但是,它們既不是設(shè)計(jì)的目標(biāo),也不是設(shè)計(jì)時(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)容卻完全不同。層次圖中的一個(gè)矩形框代表一個(gè)模塊,方框間的連線表示調(diào)用關(guān)系而不像層次方框圖那樣表示組成關(guān)系。圖3-9是層次圖的一個(gè)例子。層次圖很適于在自頂向下設(shè)計(jì)軟件的過程中使用。圖3-9正文加工系統(tǒng)的層次圖

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

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

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

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

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

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

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

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

圖3-13選擇

圖3-14循環(huán)

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

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

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

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

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

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

3.4.1變換流

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

圖3-15變換流

3.4.2事務(wù)流

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

圖3-16事務(wù)流

3.4.3變換映射(變換分析)

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

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

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

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

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

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

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

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

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

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

(5)完成第一級(jí)分解。

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

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

圖3-17第一級(jí)分解的方法

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

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

(6)完成第二級(jí)分解。

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

圖3-18第二級(jí)分解的方法

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

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

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

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

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

④對(duì)約束和特殊特點(diǎn)的簡(jiǎn)短討論。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用高級(jí)程序設(shè)計(jì)語(yǔ)言編寫程序;

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

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

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

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

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

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

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

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

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

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

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

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

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

3.6實(shí)例分析

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

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

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

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

進(jìn)書登記表={書號(hào)+書名+數(shù)量+登記標(biāo)志+補(bǔ)售標(biāo)志}

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

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

圖3-20修改后

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論