第5章軟件設(shè)計-課件(PPT 128頁)_第1頁
第5章軟件設(shè)計-課件(PPT 128頁)_第2頁
第5章軟件設(shè)計-課件(PPT 128頁)_第3頁
第5章軟件設(shè)計-課件(PPT 128頁)_第4頁
第5章軟件設(shè)計-課件(PPT 128頁)_第5頁
已閱讀5頁,還剩123頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 軟件設(shè)計 5.1 軟件設(shè)計中的基本概念和原理 5.2 體系結(jié)構(gòu)設(shè)計概述 5.3 面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計方法 5.4 詳細(xì)設(shè)計概述 5.5 面向數(shù)據(jù)流的詳細(xì)設(shè)計方法5.6 面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法5.7 小結(jié) 第1頁,共128頁。5.1 軟件設(shè)計中的基本概念和原理 1. 模塊化 所謂模塊,是指具有相對獨立性的,由數(shù)據(jù)說明、執(zhí)行語句等程序?qū)ο髽?gòu)成的集合。程序中的每個模塊都需要單獨命名,通過名字可實現(xiàn)對指定模塊的訪問。在高級語言中,模塊具體表現(xiàn)為函數(shù)、子程序、過程等。一個模塊具有輸入/輸出(接口)、功能、內(nèi)部數(shù)據(jù)和程序代碼四個特征。輸入/輸出用于實現(xiàn)模塊與其他模塊間的數(shù)據(jù)傳送,即向模塊傳入所

2、需的原始數(shù)據(jù)及從模塊傳出得到的結(jié)果數(shù)據(jù)。功能指模塊所完成的工作。模塊的輸入/輸出和功能構(gòu)成了模塊的外部特征。內(nèi)部數(shù)據(jù)是指僅能在模塊內(nèi)部使用的局部量。程序代碼用于描述實現(xiàn)模塊功能的具體方法和步驟。模塊的內(nèi)部數(shù)據(jù)和程序代碼反映的是模塊的內(nèi)部特征。第2頁,共128頁。 模塊化是指將整個程序劃分為若干個模塊,每個模塊用于實現(xiàn)一個特定的功能。劃分模塊對于解決大型復(fù)雜的問題是非常必要的,可以大大降低解決問題的難度。為了說明這一點,我們可對問題復(fù)雜性、開發(fā)工作量和模塊數(shù)之間的關(guān)系進(jìn)行以下推理。 首先,我們設(shè)C(x)為問題x所對應(yīng)的復(fù)雜度函數(shù),E(x)為解決問題x所需要的工作量函數(shù)。對于兩個問題P1和P2,如

3、果: C(P1) C(P2) 即問題P1的復(fù)雜度比P2高,則顯然有: E(P1) E(P2) 即解決問題P1比P2所需的工作量大。第3頁,共128頁。 在人們解決問題的過程中,發(fā)現(xiàn)存在有另一個有趣的規(guī)律:C(P1+P2) C(P1)+C(P2)即解決由多個問題復(fù)合而成的大問題的復(fù)雜度大于單獨解決各個問題的復(fù)雜度之和。也就是說,對于一個復(fù)雜問題,將其分解成多個小問題分別解決比較容易。由此我們可以推出:E(P1+P2) E(P1)+E(P2)即將復(fù)雜問題分解成若干個小問題,各個擊破,所需要的工作量小于直接解決復(fù)雜問題所需的工作量。第4頁,共128頁。 根據(jù)上面的推理,我們可以得到這樣一個結(jié)論,模塊

4、化可以降低解決問題的復(fù)雜度,從而降低軟件開發(fā)的工作量。但是不是模塊劃分得越多越好呢?雖然增加程序中的模塊數(shù)可以降低開發(fā)每個模塊的工作量,但同時卻增加了設(shè)計模塊接口的工作量。通過圖5.1所示的模塊數(shù)與軟件開發(fā)成本的關(guān)系圖中可以看出,當(dāng)劃分的模塊數(shù)處于最小成本區(qū)時,開發(fā)軟件的總成本最低。雖然目前還不能得到模塊數(shù)M的精確取值,但總成本曲線對我們進(jìn)行模塊劃分具有重要的指導(dǎo)意義。 模塊化不但可以降低軟件開發(fā)的難度,而且可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性。此外,模塊化還有利于提高代碼的可重用性及團(tuán)隊合作開發(fā)大型軟件的可行性。第5頁,共128頁。圖5.1 模塊數(shù)與軟件開發(fā)成本第6頁,共128頁。 2.

5、 模塊獨立性 1) 耦合性 耦合性是對一個軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系緊密程度的度量指標(biāo)。模塊間的聯(lián)系越緊密,耦合性就越高,模塊的獨立性也就越低。由于模塊間的聯(lián)系是通過模塊接口實現(xiàn)的,因此,模塊耦合性的高低主要取決于模塊接口的復(fù)雜程度、調(diào)用模塊的方式以及通過模塊接口的數(shù)據(jù)。模塊間的耦合性主要可劃分為如下幾種類型。第7頁,共128頁。 (1) 數(shù)據(jù)耦合。若兩個模塊之間僅通過模塊參數(shù)交換信息,且交換的信息全部為簡單數(shù)據(jù),則稱這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)據(jù)耦合。數(shù)據(jù)耦合的例子如下所示:第8頁,共128頁。sum(int a,int b)int c; c=a+b; re

6、turn(c); main()int x,y; printf(x+y= %d,sum(x,y);/*主函數(shù)與sum函數(shù)之間即為數(shù)據(jù)耦合關(guān)系*/第9頁,共128頁。 (2) 公共耦合。若兩個或多個模塊通過引用公共數(shù)據(jù)相互聯(lián)系,則稱這種耦合為公共耦合。例如,在程序中定義了全局變量,并在多個模塊中對全局變量進(jìn)行了引用,則引用全局變量的多個模塊間就具有了公共耦合關(guān)系。 FORTRAN語言中使用的common語句也會在多個模塊間建立公共耦合關(guān)系。公共耦合的復(fù)雜度隨著耦合的模塊個數(shù)的增加而顯著增加。在程序設(shè)計中,若兩個模塊間需要交換的數(shù)據(jù)較多,僅通過參數(shù)傳遞難以實現(xiàn)時,可以考慮采用公共耦合完成,但一定注意

7、盡量降低公共耦合的程度。第10頁,共128頁。 (3) 控制耦合。若模塊之間交換的信息中包含有控制信息(盡管有時控制信息是以數(shù)據(jù)的形式出現(xiàn)的),則稱這種耦合為控制耦合。控制耦合是中等程度的耦合,它會增加程序的復(fù)雜性??刂岂詈系睦尤缦滤荆簐oid output(flag)if (flag) printf(OK! ); else printf(NO! );main() int flag;output(flag); /*主函數(shù)與output函數(shù)之間即為控制耦合關(guān)系*/第11頁,共128頁。 (4) 內(nèi)容耦合。若一個模塊對另一模塊中的內(nèi)容(包括數(shù)據(jù)和程序段)進(jìn)行了直接的引用甚至修改,或通過非正常入

8、口進(jìn)入到另一模塊內(nèi)部,或一個模塊具有多個入口,或兩個模塊共享一部分代碼,則稱模塊間的這種耦合為內(nèi)容耦合。內(nèi)容耦合是所有耦合關(guān)系中程度最高的,會使因模塊間的聯(lián)系過于緊密而對后期的開發(fā)和維護(hù)工作帶來很大的麻煩,因此,應(yīng)堅決避免任何形式的內(nèi)容耦合。實際上,許多高級程序設(shè)計語言在設(shè)計時就充分考慮到了內(nèi)容耦合的危害,因而在規(guī)定語法時就已經(jīng)杜絕了任何形式的內(nèi)容耦合。 耦合是影響軟件復(fù)雜度的一個重要因素,設(shè)計過程中應(yīng)力求降低程序的耦合性。在以上所介紹的耦合中,數(shù)據(jù)耦合的程度最低,其次是公共耦合,再其次是控制耦合,程度最高的是內(nèi)容耦合。第12頁,共128頁。 2) 內(nèi)聚性 內(nèi)聚性是對一個模塊內(nèi)部各個組成元素之

9、間相互結(jié)合的緊密程度的度量指標(biāo)。模塊中組成元素結(jié)合的越緊密,模塊的內(nèi)聚性就越高,模塊的獨立性也就越高。理想的內(nèi)聚性要求模塊的功能應(yīng)明確、單一,即一個模塊只做一件事情。模塊的內(nèi)聚性和耦合性是兩個相互對立且又密切相關(guān)的概念。事實上,它們是同一事物的兩個方面,模塊的高內(nèi)聚性往往就意味著模塊間的低耦合性。因為程序中的各個部分必定是有聯(lián)系的,若將其中密切相關(guān)的部分放在同一個模塊中,模塊間的聯(lián)系就會降低;反之,若將密切相關(guān)的部分分散放在不同的模塊之中,模塊間的聯(lián)系必然會加強(qiáng)。在進(jìn)行模塊化設(shè)計時,耦合性和內(nèi)聚性都是必須考慮的重要指標(biāo)。但經(jīng)實踐證明,保證模塊的高內(nèi)聚性比低耦合性更為重要,在軟件設(shè)計時應(yīng)將更多的

10、注意力集中在提高模塊的內(nèi)聚性上。模塊的內(nèi)聚性主要可劃分為如下幾種不同的類型。第13頁,共128頁。 (1) 偶然內(nèi)聚。若一個模塊由多個完成不同任務(wù)的語句段組成,各語句段之間的聯(lián)系十分松散或根本沒有任何聯(lián)系,則稱此模塊的內(nèi)聚為偶然內(nèi)聚。例如,程序中多處出現(xiàn)一些無聯(lián)系的語句段序列,為了節(jié)省內(nèi)存空間將其組合成為一個模塊,這個模塊就屬于偶然內(nèi)聚。偶然內(nèi)聚的模塊由于組成部分之間沒有實質(zhì)的聯(lián)系,因此難于理解和修改,會給軟件開發(fā)帶來很大的困擾。事實上,偶然內(nèi)聚的模塊出錯的機(jī)率要比其他類型的模塊大得多。偶然內(nèi)聚是內(nèi)聚程度最低的一種,在軟件設(shè)計時應(yīng)盡量避免。第14頁,共128頁。 (2) 邏輯內(nèi)聚。若一個模塊可

11、實現(xiàn)多個邏輯上相同或相似的一類功能,則稱該模塊的內(nèi)聚為邏輯內(nèi)聚。例如,將程序中多種不同類型數(shù)據(jù)的輸出放在同一個模塊中實現(xiàn),這個模塊就屬于邏輯聚合。邏輯內(nèi)聚比偶然內(nèi)聚的內(nèi)聚程度高一些。雖然邏輯聚合模塊的組成部分之間有一定的關(guān)系,但不同功能混在一起并公用模塊中的部分代碼,給修改帶來了一定的麻煩。另外,為了在調(diào)用模塊時能選擇執(zhí)行其中的某個功能,需要傳遞相應(yīng)的控制參數(shù),因而會造成模塊間的控制耦合,降低模塊的獨立性。第15頁,共128頁。 (3) 時間內(nèi)聚。若一個模塊包含了需要在同一時間段中執(zhí)行的多個任務(wù),則稱該模塊的內(nèi)聚為時間內(nèi)聚。例如,將多個變量的初始化放在同一個模塊中實現(xiàn),或?qū)⑿枰瑫r使用的多個庫

12、文件的打開操作放在同一個模塊中,都會產(chǎn)生時間內(nèi)聚的模塊。由于時間內(nèi)聚模塊中的各個部分在時間上的聯(lián)系,其內(nèi)聚程度比邏輯內(nèi)聚高一些。但這樣的模塊往往會和其他相關(guān)模塊有著緊密的聯(lián)系,因而會造成耦合性的增加。第16頁,共128頁。 (4) 過程內(nèi)聚。若一個模塊中的各個部分相關(guān),并且必須按特定的次序執(zhí)行,則稱該模塊的內(nèi)聚為過程內(nèi)聚。在結(jié)構(gòu)化程序中,通常采用程序流程圖作為設(shè)計軟件和確定模塊劃分的工具,因此,這樣得到的模塊往往具有過程內(nèi)聚的特性。 (5) 通信內(nèi)聚。若一個模塊中的各個部分使用同一個輸入數(shù)據(jù)或產(chǎn)生同一個輸出數(shù)據(jù),則稱該模塊的內(nèi)聚為通信內(nèi)聚。由于通信內(nèi)聚模塊中的各個部分都與某個共同的數(shù)據(jù)密切相關(guān)

13、,因此內(nèi)聚性高于前幾種內(nèi)聚。第17頁,共128頁。 (6) 順序內(nèi)聚。若一個模塊中的各個部分都與同一個功能密切相關(guān),并且必須按照先后順序執(zhí)行(通常前一個部分的輸出數(shù)據(jù)就是后一個部分的輸入數(shù)據(jù)),則稱該模塊的內(nèi)聚為順序內(nèi)聚。例如,在一個處理學(xué)生成績的模塊中,前一個部分根據(jù)成績統(tǒng)計出及格的學(xué)生人數(shù),后一個部分根據(jù)及格人數(shù)計算出學(xué)生的及格率。根據(jù)數(shù)據(jù)流圖劃分出的模塊通常都是順序內(nèi)聚的模塊。由于順序內(nèi)聚模塊中的各個部分在功能和執(zhí)行順序上都密切相關(guān),因此內(nèi)聚程度很高且易于理解。第18頁,共128頁。 (7) 功能內(nèi)聚。若一個模塊中各個組成部分構(gòu)成一個整體并共同完成一個單一的功能,則稱該模塊的內(nèi)聚為功能內(nèi)

14、聚。由于功能內(nèi)聚模塊中的各個部分關(guān)系非常密切,構(gòu)成一個不可分割的整體,因此功能內(nèi)聚是所有內(nèi)聚中內(nèi)聚程度最高的一種。 在以上所介紹的七種內(nèi)聚中,按照內(nèi)聚性從低到高進(jìn)行排列的結(jié)果如圖5.2所示。 第19頁,共128頁。圖5.2 內(nèi)聚性的排列 第20頁,共128頁。 3. 抽象 抽象是人類在解決復(fù)雜問題時經(jīng)常采用的一種思維方式,它是指將現(xiàn)實世界中具有共性的一類事物的相似的、本質(zhì)的方面集中概括起來,而暫時忽略它們之間的細(xì)節(jié)差異。在軟件開發(fā)中運用抽象的概念,可以將復(fù)雜問題的求解過程分層,在不同的抽象層上實現(xiàn)難度的分解。在抽象級別較高的層次上,可以將瑣碎的細(xì)節(jié)的信息暫時隱藏起來,以利于解決系統(tǒng)中的全局性的

15、問題。軟件開發(fā)過程中從問題定義到最終的軟件生成,每一階段都是在前一階段基礎(chǔ)上對軟件解法的抽象層上的一次求精和細(xì)化。第21頁,共128頁。 結(jié)構(gòu)化程序中自頂向下、逐步求精的模塊劃分思想正是人類思維中運用抽象方法解決復(fù)雜問題的體現(xiàn)。軟件結(jié)構(gòu)中頂層的模塊抽象級別最高,控制并協(xié)調(diào)軟件的主要功能且影響全局;軟件結(jié)構(gòu)中位于底層的模塊抽象級別最低,具體實現(xiàn)數(shù)據(jù)的處理過程。采用自頂向下、由抽象到具體的思維方式,不但降低了軟件開發(fā)中每個階段的工作難度,簡化了軟件的設(shè)計和實現(xiàn)過程,還有助于提高軟件的可讀性、可測試性和可維護(hù)性。此外,在程序設(shè)計中運用抽象的方法還能夠提高代碼的可重用性。第22頁,共128頁。 4.

16、信息隱蔽 信息隱蔽是指一個模塊將自身的內(nèi)部信息向其他模塊隱藏起來,以避免其他模塊不恰當(dāng)?shù)脑L問和修改,只有對那些為了完成系統(tǒng)功能所必須的數(shù)據(jù)交換才被允許在模塊間進(jìn)行。信息隱蔽的目的主要是為了提高模塊的獨立性,減少將一個模塊中的錯誤擴(kuò)散到其他模塊的機(jī)會。但是需要強(qiáng)調(diào)一點,信息隱蔽并不意味著某個模塊中的內(nèi)部信息對其他模塊來說是完全不可見或不能使用的,而是說模塊之間的信息傳遞只能通過合法的調(diào)用接口來實現(xiàn)。顯然,信息隱蔽對提高軟件的可讀性和可維護(hù)性都是非常重要的。第23頁,共128頁。5.2 體系結(jié)構(gòu)設(shè)計概述5.2.1 體系結(jié)構(gòu)設(shè)計的任務(wù) 在體系結(jié)構(gòu)設(shè)計過程中,首先要根據(jù)需求分析階段產(chǎn)生的成果尋求實現(xiàn)目

17、標(biāo)系統(tǒng)的各種可能的方案,然后由系統(tǒng)分析員對所有可能的方案進(jìn)行綜合分析比較,從中選擇出一個最佳方案向用戶推薦。在與用戶達(dá)成共識之后,系統(tǒng)分析員就可以著手對選擇出的最佳方案進(jìn)行體系結(jié)構(gòu)的設(shè)計,并為軟件確定數(shù)據(jù)結(jié)構(gòu)及設(shè)計數(shù)據(jù)庫。體系結(jié)構(gòu)設(shè)計階段結(jié)束時,系統(tǒng)分析員需要提交軟件的體系結(jié)構(gòu)說明書并參加該階段的評審。體系結(jié)構(gòu)設(shè)計的主要任務(wù)有如下四點。第24頁,共128頁。 1. 軟件體系結(jié)構(gòu)設(shè)計 設(shè)計軟件的體系結(jié)構(gòu)需要在對需求分析階段生成的數(shù)據(jù)流圖進(jìn)一步分析和精化的基礎(chǔ)上,首先將系統(tǒng)按照功能劃分為模塊,接著需要確定模塊之間的調(diào)用關(guān)系及其接口,最后還應(yīng)該對劃分的結(jié)果進(jìn)行優(yōu)化和調(diào)整。良好的軟件結(jié)構(gòu)設(shè)計對詳細(xì)設(shè)計

18、及編碼階段的工作都是至關(guān)重要的。第25頁,共128頁。 2. 數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫設(shè)計 體系結(jié)構(gòu)設(shè)計中應(yīng)對需求分析階段所生成的數(shù)據(jù)字典加以細(xì)化,從計算機(jī)技術(shù)實現(xiàn)的角度出發(fā),確定軟件涉及的文件系統(tǒng)及各種數(shù)據(jù)的結(jié)構(gòu)。主要包括確定輸入、輸出文件的數(shù)據(jù)結(jié)構(gòu)及確定算法所需的邏輯數(shù)據(jù)結(jié)構(gòu)等。在需求分析階段僅為系統(tǒng)所需的數(shù)據(jù)庫建立了概念數(shù)據(jù)模型(最常采用的是E-R模型)。體系結(jié)構(gòu)設(shè)計階段需要將原本獨立于數(shù)據(jù)庫實現(xiàn)的概念模型與具體的數(shù)據(jù)庫管理系統(tǒng)的特征結(jié)合起來,建立數(shù)據(jù)庫的邏輯結(jié)構(gòu),主要包括確定數(shù)據(jù)庫的模式、子模式及對數(shù)據(jù)庫進(jìn)行規(guī)范和優(yōu)化等。第26頁,共128頁。 3. 系統(tǒng)可靠性、安全性設(shè)計 可靠性設(shè)計也稱為質(zhì)

19、量設(shè)計,目的是為了保證程序及其文檔具有較高的正確性和容錯性,并對可能出現(xiàn)的錯誤易于修改和維護(hù)。安全性設(shè)計的主要目的是為了增強(qiáng)系統(tǒng)的自我防護(hù)能力和運行的穩(wěn)定性,防止系統(tǒng)遭受到有意或無意地入侵和破壞,保證系統(tǒng)在安全的環(huán)境下正常地工作。第27頁,共128頁。 4. 編寫文檔,參加復(fù)審 體系結(jié)構(gòu)設(shè)計階段應(yīng)交付的文檔通常包括:體系結(jié)構(gòu)設(shè)計說明書、用戶手冊、數(shù)據(jù)庫設(shè)計說明書及系統(tǒng)初步測試計劃。 (1) 體系結(jié)構(gòu)設(shè)計說明書: 給出系統(tǒng)總體結(jié)構(gòu)設(shè)計的結(jié)果,為系統(tǒng)的詳細(xì)設(shè)計提供基礎(chǔ)。 (2) 用戶手冊:根據(jù)體系結(jié)構(gòu)設(shè)計成果,對需求分析階段編寫的用戶手冊進(jìn)行補(bǔ)充和修改。 (3) 測試計劃:明確測試中應(yīng)采用的策略、

20、方案、預(yù)期的測試結(jié)果及測試的進(jìn)度安排。第28頁,共128頁。 (4) 數(shù)據(jù)庫設(shè)計說明書:主要用于給出目標(biāo)系統(tǒng)中數(shù)據(jù)庫管理系統(tǒng)的選擇及邏輯結(jié)構(gòu)等的設(shè)計結(jié)果。 體系結(jié)構(gòu)設(shè)計階段復(fù)審的重點主要是系統(tǒng)的總體結(jié)構(gòu)、模塊劃分和內(nèi)/外接口等方面,復(fù)審的對象就是該階段的設(shè)計文檔。由于體系結(jié)構(gòu)設(shè)計中的微小失誤可能會導(dǎo)致軟件開發(fā)中的重大問題,因此復(fù)審一定要按嚴(yán)格的步驟,通過正式會議的方式進(jìn)行,爭取盡可能地及早發(fā)現(xiàn)設(shè)計中的缺陷和錯誤。除軟件開發(fā)人員以外,體系結(jié)構(gòu)設(shè)計復(fù)審必須有用戶參加,必要時還可以邀請相關(guān)領(lǐng)域的專家參加會議。第29頁,共128頁。5.2.2 體系結(jié)構(gòu)設(shè)計中可采用的工具 1. HIPO圖 HIPO(H

21、ierarchy Plus Input/Processing/Output)圖是IBM公司在20世紀(jì)70年代發(fā)展起來的用于描述軟件結(jié)構(gòu)的圖形工具。它實質(zhì)上是在描述軟件總體模塊結(jié)構(gòu)的層次圖(H圖)的基礎(chǔ)上,加入了用于描述每個模塊輸入/輸出數(shù)據(jù)和處理功能的IPO圖,因此它的中文全名為層次圖加輸入/處理/輸出圖。第30頁,共128頁。 1) HIPO圖中的H圖 H圖用于在體系結(jié)構(gòu)設(shè)計過程中描繪軟件的層次結(jié)構(gòu)。在H圖中,每一個矩形框代表一個模塊,圖中最頂層的矩形框表示系統(tǒng)中的主控模塊,矩形框之間的連線用于表示模塊之間的調(diào)用關(guān)系。為了使H圖更具有可追蹤性,可以為除頂層矩形框以外的其他矩形框加上能反映層次

22、關(guān)系的編號。H圖比較適用于自頂向下進(jìn)行分解的軟件結(jié)構(gòu)設(shè)計方法。工資計算系統(tǒng)的H圖如圖5.3所示。第31頁,共128頁。圖5.3 工資計算系統(tǒng)的H圖第32頁,共128頁。 2) IPO圖 IPO圖能夠方便、清晰地描繪出模塊的輸入數(shù)據(jù)、加工和輸出數(shù)據(jù)之間的關(guān)系。與層次圖中每個矩形框相對應(yīng),應(yīng)該有一張IPO圖描述該矩形框所代表的模塊的具體處理過程,作為對層次圖中內(nèi)容的補(bǔ)充說明。IPO圖的基本形式為:在圖中左邊的框中列出模塊涉及的所有輸入數(shù)據(jù),在中間的框中列出主要的加工,在右邊的框中列出處理后產(chǎn)生的輸出數(shù)據(jù);圖中的箭頭用于指明輸入數(shù)據(jù)、加工和輸出結(jié)果之間的關(guān)系。工資計算系統(tǒng)中的計算工資模塊的IPO圖如

23、圖5.4所示。第33頁,共128頁。圖5.4 計算工資模塊的IPO圖第34頁,共128頁。 2. 結(jié)構(gòu)圖 在軟件工程中,軟件結(jié)構(gòu)經(jīng)常采用20世紀(jì)70年代中期由Yourdon等人提出的結(jié)構(gòu)圖(SC,Structure Chart)這種圖形工具來表示。結(jié)構(gòu)圖能夠描述出軟件系統(tǒng)的模塊層次結(jié)構(gòu),清楚地反映出程序中各模塊之間的調(diào)用關(guān)系和聯(lián)系。結(jié)構(gòu)圖中的基本符號及其含義見表5.1。第35頁,共128頁。表5.1 結(jié)構(gòu)圖中的基本符號ABCABC符 號含 義用于表示模塊,方框中標(biāo)明模塊的名稱用于描述模塊之間的調(diào)用關(guān)系用于表示模塊調(diào)用過程中傳遞的信息,箭頭上標(biāo)明信息的名稱;箭頭尾部為空心圓表示傳遞的信息是數(shù)據(jù),

24、若為實心圓則表示傳遞的是控制信息表示模塊A選擇調(diào)用模塊B或模塊C表示模塊A循環(huán)調(diào)用模塊B和模塊C第36頁,共128頁。5.2.3 體系結(jié)構(gòu)設(shè)計的原則 體系結(jié)構(gòu)設(shè)計的原則有如下6點。 (1) 降低模塊的耦合性,提高模塊的內(nèi)聚性。 為了提高軟件中各個模塊的獨立性,提高程序的可讀性、可測試性和可維護(hù)性,在軟件體系結(jié)構(gòu)設(shè)計時應(yīng)盡可能采用內(nèi)聚性高的模塊,如最好實現(xiàn)功能內(nèi)聚;盡量只使用數(shù)據(jù)耦合,限制公共耦合的使用,避免控制耦合的使用,杜絕內(nèi)容耦合的出現(xiàn)。第37頁,共128頁。 (2) 保持適中的模塊規(guī)模。 程序中模塊的規(guī)模過大,會降低程序的可讀性;而模塊規(guī)模過小,勢必會導(dǎo)致程序中的模塊數(shù)目過多,增加接口的

25、復(fù)雜性。對于模塊的適當(dāng)規(guī)模并沒有嚴(yán)格的規(guī)定,但普遍的觀點是模塊中的語句數(shù)最好保持在10100之間。為了使模塊的規(guī)模適中,在保證模塊獨立性的前提下,可對程序中規(guī)模過小的模塊進(jìn)行合并或?qū)σ?guī)模過大的模塊進(jìn)行分解。第38頁,共128頁。 (3) 模塊應(yīng)具有高扇入和適當(dāng)?shù)纳瘸觥?在模塊調(diào)用中,某個模塊的上級模塊數(shù)被稱為該模塊的扇入(如圖5.5(a)所示,模塊M的扇入數(shù)為n);而某個模塊可以調(diào)用的下級模塊數(shù)被稱為該模塊的扇出(如圖5.5(b)所示,模塊M的扇出數(shù)為k)。顯然,一個模塊的扇入表明了共有多少個模塊需要調(diào)用該模塊,而其扇出表明了該模塊可以控制的下級模塊的數(shù)目。第39頁,共128頁。圖5.5 模塊

26、的扇入和扇出(a) 扇入;(b) 扇出第40頁,共128頁。 模塊的扇入越大,則說明共享該模塊的上級模塊數(shù)越多,或者說該模塊在程序中的重用性越高,這正是程序設(shè)計所追求的目標(biāo)之一。當(dāng)多個模塊具有一部分相同功能時,應(yīng)將這部分相同的功能分離出來,編寫成獨立的模塊供需要的模塊調(diào)用。通過消除不同模塊中的重復(fù)內(nèi)容,提高代碼的可重用性,可以減少程序的總代碼量,便于程序的測試和維護(hù)。第41頁,共128頁。 模塊的扇出若過大,如在一個模塊中要調(diào)用八個下級模塊,則會使該模塊的調(diào)用控制過于復(fù)雜。這種現(xiàn)象發(fā)生的原因通常都是由于設(shè)計階段,模塊細(xì)化的過程中,分解速度過快造成的。最常見的解決辦法是通過在此模塊和下級模塊間增

27、加一個中間層來控制模塊分解的速度。模塊的扇出過小,如扇出為1(下級模塊層中只有一個模塊),在系統(tǒng)設(shè)計中通常是不可取的。常見的解決方法是考慮將其合并到上級模塊中。但若合并會影響模塊的獨立性,則將其保留下來也未嘗不可。根據(jù)實踐經(jīng)驗,設(shè)計良好的典型系統(tǒng)中,模塊的平均扇出通常為3或4。第42頁,共128頁。 可以看出:在一個好的軟件結(jié)構(gòu)中,模塊應(yīng)具有較高的扇入和適當(dāng)?shù)纳瘸?。但絕不能為了單純追求高扇入或合適的扇出而破壞了模塊的獨立性。此外,經(jīng)過對大量軟件系統(tǒng)的研究后發(fā)現(xiàn),在設(shè)計良好的軟件結(jié)構(gòu)中,通常頂層的扇出數(shù)較大,中間層的扇出數(shù)較小,底層的扇入數(shù)較大,如圖5.6所示。第43頁,共128頁。圖5.6 軟

28、件結(jié)構(gòu)圖示例 第44頁,共128頁。 (4) 軟件結(jié)構(gòu)中的深度和寬度不宜過大。 所謂深度,是指軟件體系結(jié)構(gòu)中控制的層數(shù),它能夠粗略地反映出軟件系統(tǒng)的規(guī)模和復(fù)雜程度;所謂寬度,是指軟件體系結(jié)構(gòu)內(nèi)同一層次上模塊個數(shù)的最大值,通常寬度越大的系統(tǒng)越復(fù)雜。如圖5.6所示的軟件結(jié)構(gòu)圖中,深度為5,寬度為8。深度在程序中表現(xiàn)為模塊的嵌套調(diào)用,嵌套的層數(shù)越多,程序就越復(fù)雜,程序的可理解性也就隨之下降。對寬度影響最大的因素是模塊的扇出,即模塊可以調(diào)用的下級模塊數(shù)越多,軟件結(jié)構(gòu)的寬度就越大。深度過大可通過將結(jié)構(gòu)中過于簡單的模塊分層與上一級模塊合并來解決;而寬度過大則可通過增加中間層來解決。顯然,軟件結(jié)構(gòu)中的深度和

29、寬度是相互對立的兩個方面,降低深度會引起寬度的增加,而降低寬度又會帶來深度的增加。第45頁,共128頁。 (5) 模塊的作用域應(yīng)處于其控制域范圍之內(nèi)。 模塊的作用域是指受該模塊內(nèi)一個判定條件影響的所有模塊范圍。模塊的控制域是指該模塊本身以及所有該模塊的下屬模塊(包括該模塊可以直接調(diào)用的下級模塊和可以間接調(diào)用的更下層的模塊)。例如,在圖5.7中,模塊C的控制域為模塊C、E和F;若在模塊C中存在一個對模塊D、E和F均有影響的判定條件,即模塊C的作用域為模塊C、D、E和F(圖中帶陰影的模塊),則顯然模塊C的作用域超出了其作用域。由于模塊D在模塊C的作用域中,因此模塊C對模塊D的控制信息必然要通過上級

30、模塊B進(jìn)行傳遞,這樣不但會增加模塊間的耦合性,而且會給模塊的維護(hù)和修改帶來麻煩(若要修改模塊C,可能會對不在它控制域中的模塊D造成影響)。因此,軟件設(shè)計時應(yīng)使各個模塊的作用域處于其控制域范圍之內(nèi)。若發(fā)現(xiàn)不符合此設(shè)計原則的模塊,可通過下面的方法進(jìn)行改進(jìn):第46頁,共128頁。 將判定位置上移。如將圖5.7中的模塊C中的判定條件上移到上級模塊B中或?qū)⒛KC整個合并到模塊B中。 將超出作用域的模塊下移。如將圖5.7中的模塊D移至模塊C的下一層上,使模塊D處于模塊C的控制域中。第47頁,共128頁。圖5.7 模塊的作用域和控制域 第48頁,共128頁。 (6) 盡量降低模塊的接口復(fù)雜度。 由于復(fù)雜的模

31、塊接口是導(dǎo)致軟件出現(xiàn)錯誤的主要原因之一,因此在軟件設(shè)計中應(yīng)盡量使模塊接口簡單清晰,如減少接口傳送的信息個數(shù)以及確保實參和形參的一致性和對應(yīng)性等。降低模塊的接口復(fù)雜度,可以提高軟件的可讀性,減少出現(xiàn)錯誤的可能性,并有利于軟件的測試和維護(hù)。第49頁,共128頁。5.2.4 體系結(jié)構(gòu)設(shè)計說明書 體系結(jié)構(gòu)設(shè)計說明書是體系結(jié)構(gòu)設(shè)計階段中最重要的技術(shù)文檔,其主要內(nèi)容應(yīng)包括: (1) 引言:用于說明編寫本說明書的目的、背景,定義所用到的術(shù)語和縮略語,以及列出文檔中所引用的參考資料等。 (2) 總體設(shè)計:用于說明軟件的需求規(guī)定、運行環(huán)境要求、處理流程及軟件體系結(jié)構(gòu)等。 (3) 運行設(shè)計:用于說明軟件的運行模塊

32、組合、運行控制方式及運行時間等。第50頁,共128頁。 (4) 模塊設(shè)計:用于說明軟件中各模塊的功能、性能及接口等。 (5) 數(shù)據(jù)設(shè)計:用于說明軟件系統(tǒng)所涉及的數(shù)據(jù)對象的邏輯數(shù)據(jù)結(jié)構(gòu)的設(shè)計。 (6) 出錯處理設(shè)計:用于說明軟件系統(tǒng)可能出現(xiàn)的各種錯誤及可采取的處理措施。第51頁,共128頁。5.3 面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計方法5.3.1 數(shù)據(jù)流圖的類型 面向數(shù)據(jù)流的體系設(shè)計方法能夠方便地將需求分析階段生成的數(shù)據(jù)流圖轉(zhuǎn)換成設(shè)計階段所需的軟件結(jié)構(gòu)。但對于不同類型的數(shù)據(jù)流圖,轉(zhuǎn)換得到的軟件結(jié)構(gòu)也不同,因此有必要首先研究一下數(shù)據(jù)流圖的典型形式。根據(jù)數(shù)據(jù)流圖的結(jié)構(gòu)特點通??蓪?shù)據(jù)流圖劃分為如下兩個基本類型

33、。第52頁,共128頁。 1. 變換型數(shù)據(jù)流圖 變換型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點為:由(邏輯)輸入、變換中心和(邏輯)輸出三部分組成,如圖5.8所示。該類型數(shù)據(jù)流圖所描述的加工過程為:首先,外部數(shù)據(jù)沿邏輯輸入路徑進(jìn)入系統(tǒng),同時數(shù)據(jù)的形式由外部形式轉(zhuǎn)化為內(nèi)部形式;接著,數(shù)據(jù)被送往變換中心進(jìn)行加工處理;最后,經(jīng)過加工得到的結(jié)果數(shù)據(jù)的內(nèi)部形式被轉(zhuǎn)換為外部形式并沿邏輯輸出路徑離開系統(tǒng)??梢钥闯?,變換型數(shù)據(jù)流圖反映的是一個順序結(jié)構(gòu)的加工過程。第53頁,共128頁。圖5.8 變換型數(shù)據(jù)流圖的基本模型 第54頁,共128頁。 2. 事務(wù)型數(shù)據(jù)流圖 原則上,所有基本系統(tǒng)模型都屬于變換型,但其中有一類具有特殊形態(tài)

34、的數(shù)據(jù)流圖又被單獨劃分為事務(wù)型。事務(wù)型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點為:輸入流在經(jīng)過某個被稱為“事務(wù)中心”的加工時被分離為多個發(fā)散的輸出流,形成多個平行的加工處理路徑,如圖5.9所示。該類型數(shù)據(jù)流圖所描述的加工過程為:外部數(shù)據(jù)沿輸入通路進(jìn)入系統(tǒng)后,被送往事務(wù)中心;事務(wù)中心接收輸入數(shù)據(jù)并分析確定其類型;最后根據(jù)所確定的類型為數(shù)據(jù)選擇其中的一條加工路徑。第55頁,共128頁。圖5.9 事務(wù)型數(shù)據(jù)流圖的基本模型第56頁,共128頁。5.3.2 面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計過程 運用面向數(shù)據(jù)流的方法進(jìn)行軟件體系結(jié)構(gòu)的設(shè)計時,應(yīng)該首先對需求分析階段得到的數(shù)據(jù)流圖進(jìn)行復(fù)查,必要時進(jìn)行修改和精化;接著在仔細(xì)分析系統(tǒng)數(shù)

35、據(jù)流圖的基礎(chǔ)上,確定數(shù)據(jù)流圖的類型,并按照相應(yīng)的設(shè)計步驟將數(shù)據(jù)流圖轉(zhuǎn)化為軟件結(jié)構(gòu);最后還要根據(jù)體系結(jié)構(gòu)設(shè)計的原則對得到的軟件結(jié)構(gòu)進(jìn)行優(yōu)化和改進(jìn)。面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計過程如圖5.10所示。第57頁,共128頁。圖5.10 面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計過程第58頁,共128頁。 一般來說,大多數(shù)系統(tǒng)的加工問題被表示為變換型,可采用變換分析設(shè)計方法建立系統(tǒng)的軟件結(jié)構(gòu),但當(dāng)數(shù)據(jù)流圖具有明顯的事務(wù)特點時,則應(yīng)采用事務(wù)分析技術(shù)進(jìn)行處理。變換分析設(shè)計方法與事務(wù)分析設(shè)計方法類似,都遵循圖5.10所示的設(shè)計過程,主要差別僅在于由數(shù)據(jù)流圖向軟件結(jié)構(gòu)的映射方法不同。對于一個復(fù)雜的系統(tǒng),數(shù)據(jù)流圖中可能既存在變換流又存

36、在事務(wù)流,這時應(yīng)當(dāng)根據(jù)數(shù)據(jù)流圖的主要處理功能,選擇一個面向全局的、涉及整個軟件系統(tǒng)的總體類型,映射得到系統(tǒng)的整體軟件結(jié)構(gòu)。此外,再對局部范圍內(nèi)的數(shù)據(jù)流圖進(jìn)行具體研究,確定它們各自的類型并分別處理,得到系統(tǒng)的局部軟件結(jié)構(gòu)。第59頁,共128頁。 1. 變換分析設(shè)計 對于變換型的數(shù)據(jù)流圖,應(yīng)按照變換分析設(shè)計的方法建立系統(tǒng)的結(jié)構(gòu)圖。下面以圖5.11所示的工資計算系統(tǒng)數(shù)據(jù)流圖為例來介紹變換分析建立軟件結(jié)構(gòu)的具體步驟。第60頁,共128頁。 (1) 劃分邊界,區(qū)分系統(tǒng)的輸入、變換中心和輸出部分。 變換中心在圖中往往是多股數(shù)據(jù)流匯集的地方,經(jīng)驗豐富的設(shè)計人員通常可根據(jù)其特征直接確定系統(tǒng)的變換中心。另外,下

37、述方法可幫助設(shè)計人員確定系統(tǒng)的輸入和輸出:從數(shù)據(jù)流圖的物理輸入端出發(fā),沿著數(shù)據(jù)流方向逐步向系統(tǒng)內(nèi)部移動,直至遇到不能被看作是系統(tǒng)輸入的數(shù)據(jù)流為止,則此數(shù)據(jù)流之前的部分即為系統(tǒng)的輸入;同理,從數(shù)據(jù)流圖的物理輸出端出發(fā),逆著數(shù)據(jù)流方向逐步向系統(tǒng)內(nèi)部移動,直至遇到不能被看作是系統(tǒng)輸出的數(shù)據(jù)流為止,則該數(shù)據(jù)流之后的部分即為系統(tǒng)的輸出;夾在輸入和輸出之間的部分就是系統(tǒng)的變換中心。工資計算系統(tǒng)的數(shù)據(jù)流圖的劃分如圖5.11所示。第61頁,共128頁。圖5.11 進(jìn)行了邊界劃分的工資計算系統(tǒng)數(shù)據(jù)流圖第62頁,共128頁。 (2) 完成第一級分解,設(shè)計系統(tǒng)的上層模塊。 這一步主要是確定軟件結(jié)構(gòu)的頂層和第一層。任

38、何系統(tǒng)的頂層都只含一個用于控制的主模塊。變換型數(shù)據(jù)流圖對應(yīng)的軟件結(jié)構(gòu)的第一層一般由輸入、變換和輸出三種模塊組成。系統(tǒng)中的每個邏輯輸入對應(yīng)一個輸入模塊,完成為主模塊提供數(shù)據(jù)的功能;每一個邏輯輸出對應(yīng)一個輸出模塊,完成為主模塊輸出數(shù)據(jù)的功能;變換中心對應(yīng)一個變換模塊,完成將系統(tǒng)的邏輯輸入轉(zhuǎn)換為邏輯輸出的功能。工資計算系統(tǒng)的一級分解結(jié)果如圖5.12所示。第63頁,共128頁。圖5.12 工資計算系統(tǒng)的一級分解 第64頁,共128頁。 (3) 完成第二級分解,設(shè)計輸入、變換中心和輸出部分的中、下層模塊。 這一步主要是對上一步確定的軟件結(jié)構(gòu)進(jìn)行逐層細(xì)化,為每一個輸入、輸出模塊及變換模塊設(shè)計下屬模塊。通常

39、,一個輸入模塊應(yīng)包括用于接收數(shù)據(jù)和轉(zhuǎn)換數(shù)據(jù)(將接收的數(shù)據(jù)轉(zhuǎn)換成下級模塊所需的形式)的兩個下屬模塊;一個輸出模塊應(yīng)包括用于轉(zhuǎn)換數(shù)據(jù)(將上級模塊的處理結(jié)果轉(zhuǎn)換成輸出所需的形式)和傳出數(shù)據(jù)的兩個下屬模塊;變換模塊的分解沒有固定的方法,一般應(yīng)根據(jù)變換中心的組成情況及模塊分解的原則來確定下屬模塊。完成二級分解后,工資計算系統(tǒng)的軟件結(jié)構(gòu)如圖5.13所示(圖中省略了模塊調(diào)用傳遞的信息)。第65頁,共128頁。圖5.13 完成二級分解后的工資計算系統(tǒng)軟件結(jié)構(gòu)第66頁,共128頁。2. 事務(wù)分析設(shè)計圖5.14 進(jìn)行了邊界劃分的事務(wù)型數(shù)據(jù)流圖 第67頁,共128頁。 (1) 劃分邊界,明確數(shù)據(jù)流圖中的接收路徑、事

40、務(wù)中心和加工路徑。 事務(wù)中心在數(shù)據(jù)流圖中位于多條加工路徑的起點,經(jīng)過事務(wù)中心的數(shù)據(jù)流被分解為多個發(fā)散的數(shù)據(jù)流,根據(jù)這個特征很容易在圖中找到系統(tǒng)的事務(wù)中心。向事務(wù)中心提供數(shù)據(jù)的路徑是系統(tǒng)的接收路徑,而從事務(wù)中心引出的所有路徑都是系統(tǒng)的加工路徑,如圖5.14中對數(shù)據(jù)流圖的劃分。每條加工路徑都具有自己的結(jié)構(gòu)特征,可能為變換型,也可能為事務(wù)型。如圖5.14中,路徑1為變換型,路徑2為事務(wù)型。第68頁,共128頁。 (2) 建立事務(wù)型結(jié)構(gòu)的上層模塊。 事務(wù)型流圖對應(yīng)的軟件結(jié)構(gòu)的頂層只有一個由事務(wù)中心映射得到的總控模塊;總控模塊有兩個下級模塊,分別是由接收路徑映射得到的接收模塊和由全部加工路徑映射得到的調(diào)

41、度模塊。接收模塊負(fù)責(zé)接收系統(tǒng)處理所需的數(shù)據(jù),調(diào)度模塊負(fù)責(zé)控制下層的所有加工模塊。兩個模塊共同構(gòu)成了事務(wù)型軟件結(jié)構(gòu)的第一層。圖5.14中,事務(wù)型數(shù)據(jù)流圖映射得到的上層軟件結(jié)構(gòu)如圖5.15所示。第69頁,共128頁。圖5.15第70頁,共128頁。 (3) 分解、細(xì)化接收路徑和加工路徑,得到事務(wù)型結(jié)構(gòu)的下層模塊。 由于接收路徑通常都具有變換型的特性,因此對事務(wù)型結(jié)構(gòu)接收模塊的分解方法與對變換型結(jié)構(gòu)輸入模塊的分解方法相同。對加工路徑的分解應(yīng)按照每一條路徑本身的結(jié)構(gòu)特征,分別采用變換分析或事務(wù)分析方法進(jìn)行分解。經(jīng)過分解后得到的完整的事務(wù)型軟件結(jié)構(gòu)如圖5.16所示。第71頁,共128頁。圖5.16 完整

42、的事務(wù)型軟件結(jié)構(gòu)第72頁,共128頁。 3. 軟件結(jié)構(gòu)的改進(jìn)和優(yōu)化 為了使最終生成的軟件系統(tǒng)具有良好的風(fēng)格及較高的效率,應(yīng)在軟件的早期設(shè)計階段盡量地對軟件結(jié)構(gòu)進(jìn)行優(yōu)化。因此在建立軟件結(jié)構(gòu)后,軟件設(shè)計人員需要按照體系結(jié)構(gòu)設(shè)計的基本原則對其進(jìn)行必要的改進(jìn)和調(diào)整。軟件結(jié)構(gòu)的優(yōu)化應(yīng)該力求在保證模塊劃分合理的前提下,減少模塊的數(shù)量、提高模塊的內(nèi)聚性及降低模塊的耦合性,設(shè)計出具有良好特性的軟件結(jié)構(gòu)。第73頁,共128頁。5.4 詳細(xì)設(shè)計概述5.4.1 詳細(xì)設(shè)計的任務(wù) 詳細(xì)設(shè)計的任務(wù)主要有如下五點。 (1) 確定每個模塊的具體算法。根據(jù)體系結(jié)構(gòu)設(shè)計所建立的系統(tǒng)軟件結(jié)構(gòu),為劃分的每個模塊確定具體的算法,并選擇

43、某種表達(dá)工具將算法的詳細(xì)處理過程描述出來。 第74頁,共128頁。 (2) 確定每個模塊的內(nèi)部數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫的物理結(jié)構(gòu)。 為系統(tǒng)中的所有模塊確定并構(gòu)造算法實現(xiàn)所需的內(nèi)部數(shù)據(jù)結(jié)構(gòu);根據(jù)前一階段確定的數(shù)據(jù)庫的邏輯結(jié)構(gòu),對數(shù)據(jù)庫的存儲結(jié)構(gòu)、存取方法等物理結(jié)構(gòu)進(jìn)行設(shè)計。 (3) 確定模塊接口的具體細(xì)節(jié)。 按照模塊的功能要求,確定模塊接口的詳細(xì)信息,包括模塊之間的接口信息、模塊與系統(tǒng)外部的接口信息及用戶界面等。第75頁,共128頁。 (4) 為每個模塊設(shè)計一組測試用例。 由于負(fù)責(zé)詳細(xì)設(shè)計的軟件人員對模塊的實現(xiàn)細(xì)節(jié)十分清楚,因此由他們在完成詳細(xì)設(shè)計后提出模塊的測試要求是非常恰當(dāng)和有效的。 (5) 編寫文

44、檔,參加復(fù)審。 詳細(xì)設(shè)計階段的成果主要以詳細(xì)設(shè)計說明書的形式保留下來,在通過復(fù)審對其進(jìn)行改進(jìn)和完善后作為編碼階段進(jìn)行程序設(shè)計的主要依據(jù)。第76頁,共128頁。5.4.2 詳細(xì)設(shè)計可采用的工具 1. 程序流程圖 程序流程圖是最早出現(xiàn)且使用較為廣泛的算法表達(dá)工具之一,能夠有效地描述問題求解過程中的程序邏輯結(jié)構(gòu)。程序流程圖中經(jīng)常使用的基本符號如圖5.17所示。圖5.17 程序流程圖中的基本符號(a) 一般處理框;(b) 輸入/輸出框;(c) 判斷框;(d) 流程線;(e) 起止框第77頁,共128頁。 程序流程圖的主要優(yōu)點在于對程序的控制流程描述直觀、清晰,使用靈活,便于閱讀和掌握,因此在20世紀(jì)4

45、0年代末到70年代初被普遍采用。但隨著程序設(shè)計方法的發(fā)展,程序流程圖的許多缺點逐漸暴露出來。這些缺點主要體現(xiàn)在以下方面: (1) 程序流程圖中可以隨心所欲地使用流程線,容易造成程序控制結(jié)構(gòu)的混亂,與結(jié)構(gòu)化程序設(shè)計的思想相違背。第78頁,共128頁。 (2) 程序流程圖難以描述逐步求精的過程,容易導(dǎo)致程序員過早考慮程序的控制流程,而忽略程序全局結(jié)構(gòu)的設(shè)計。 (3) 程序流程圖難以表示系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)。 正是由于程序流程圖存在的這些缺點,越來越多的軟件設(shè)計人員放棄了對它的使用,而去選擇其他一些更有利于結(jié)構(gòu)化設(shè)計的表達(dá)工具,下面所介紹的NS圖和PAD圖就是其中的兩種圖形工具。第79頁,共128頁。

46、2. NS圖 NS圖又稱為盒圖,它是為了保證結(jié)構(gòu)化程序設(shè)計而由Nassi和Shneiderman共同提出的一種圖形工具。在NS圖中,所有的程序結(jié)構(gòu)均使用矩形框表示,它可以清晰地表達(dá)結(jié)構(gòu)中的嵌套及模塊的層次關(guān)系。NS圖中,基本控制結(jié)構(gòu)的表示符號如圖5.18所示。由于NS圖中沒有流程線,不可能隨意轉(zhuǎn)移控制,因而表達(dá)出的程序結(jié)構(gòu)必然符合結(jié)構(gòu)化程序設(shè)計的思想,有利于培養(yǎng)軟件設(shè)計人員的良好設(shè)計風(fēng)格。但當(dāng)所描述的程序嵌套層次較多時,NS圖的內(nèi)層方框會越畫越小,不僅影響可讀性而且不易修改。第80頁,共128頁。圖5.18 NS圖中基本控制結(jié)構(gòu)的表示符號順序結(jié)構(gòu);(b) 分支結(jié)構(gòu);(c) 多分支CASE結(jié)構(gòu);

47、(d) while-do結(jié)構(gòu);(e) do-until結(jié)構(gòu);(f) 調(diào)用模塊A第81頁,共128頁。 3. PAD圖 PAD(Problem Analysis Diagram,問題分析圖)是繼程序流程圖和NS圖后,由日立公司在20世紀(jì)70年代提出的又一種用于詳細(xì)設(shè)計的圖形表達(dá)工具。它只能用于結(jié)構(gòu)化程序的描述。PAD圖采用了易于使用的樹型結(jié)構(gòu)圖形符號,既利于清晰地表達(dá)程序結(jié)構(gòu),又利于修改。PAD圖中所經(jīng)常使用的基本符號如圖5.19所示。第82頁,共128頁。圖5.19 PAD中基本符號順序結(jié)構(gòu);(b) 分支結(jié)構(gòu);(c) 多分支CASE結(jié)構(gòu);(d) 當(dāng)型循環(huán);(e);直到型循環(huán);(f) 對s的細(xì)化

48、第83頁,共128頁。 PAD圖具有的主要優(yōu)點如下: (1) 使用PAD圖描述的程序結(jié)構(gòu)層次清晰,邏輯結(jié)構(gòu)關(guān)系直觀、易讀、易記、易修改。 (2) PAD圖為多種常用高級語言提供了相應(yīng)的圖形符號, 每種控制語句都與一個專門的圖形符號相對應(yīng),易于PAD圖向高級語言源程序轉(zhuǎn)換。 (3) 支持自頂向下、逐步求精的設(shè)計過程。 (4) 既能夠描述程序的邏輯結(jié)構(gòu),又能夠描述系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)。第84頁,共128頁。圖5.20 三種詳細(xì)設(shè)計中使用的圖形工具示例采用程序流程圖描述計算應(yīng)發(fā)工資模塊;(b) 采用NS圖描述計算應(yīng)發(fā)工資模塊;(c) 采用PAD圖描述計算應(yīng)發(fā)工資模塊第85頁,共128頁。 4. PDL語

49、言 PDL (Process Design Language)語言即過程設(shè)計語言,是一種用于描述程序算法和定義數(shù)據(jù)結(jié)構(gòu)的偽代碼。PDL語言的構(gòu)成與用于描述加工的結(jié)構(gòu)化語言相似,是一種兼有自然語言和結(jié)構(gòu)化程序設(shè)計語言語法的“混合型”語言。自然語言的采用使算法的描述靈活自由、清晰易懂,結(jié)構(gòu)化程序設(shè)計語言的采用使控制結(jié)構(gòu)的表達(dá)具有固定的形式且符合結(jié)構(gòu)化設(shè)計的思想。PDL語言與結(jié)構(gòu)化語言的主要區(qū)別在于:由于PDL語言表達(dá)的算法是編碼的直接依據(jù),因此其語法結(jié)構(gòu)更加嚴(yán)格并且處理過程描述更加具體詳細(xì)。第86頁,共128頁。 PDL語言的主要特點如下: (1) 各種定義語句及控制結(jié)構(gòu)的表達(dá)都具有嚴(yán)格的語法形式

50、,使程序結(jié)構(gòu)、數(shù)據(jù)說明等更加清晰。 (2) 提供了數(shù)據(jù)說明機(jī)制,可用于定義簡單及復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。 (3) 提供了模塊的定義和調(diào)用機(jī)制,方便了程序模塊化的表達(dá)。第87頁,共128頁。 PDL語言的主要定義語句及基本控制結(jié)構(gòu)的表達(dá)如下所示:定義語句 (1) 數(shù)據(jù)定義: DECLARE 屬性 變量名, 屬性包括:整型、實型、雙精度型、字符型、指針、數(shù)組及結(jié)構(gòu)等類型。第88頁,共128頁。(2) 模塊定義:PROCEDURE模塊名(參數(shù))RETURNEND第89頁,共128頁?;究刂平Y(jié)構(gòu)(1) 順序結(jié)構(gòu):順序結(jié)構(gòu)的語句序列采用自然語言進(jìn)行描述。語句序列S1語句序列S2語句序列Sn第90頁,共128頁

51、。(2) 選擇結(jié)構(gòu): IF-ELSE結(jié)構(gòu)IF條件IF條件語句序列S1 或語句序列SELSEENDIF語句序列S2ENDIF第91頁,共128頁。 多分支IF結(jié)構(gòu)IF條件1 語句序列S1ELSEIF條件2 語句序列S2ELSE 語句序列SnENDIF第92頁,共128頁。 CASE結(jié)構(gòu)CASE 表達(dá)式 OFCASE 取值1 語句序列S1CASE取值2 語句序列S2ELSE 語句序列SnENDCASE第93頁,共128頁。(3) 循環(huán)結(jié)構(gòu): FOR結(jié)構(gòu)FOR循環(huán)變量=初值 TO 終值循環(huán)體SEND FOR WHILE結(jié)構(gòu)WHILE 條件循環(huán)體SENDWHILE第94頁,共128頁。 UNTIL結(jié)構(gòu)

52、REPEAT循環(huán)體S UNTIL 條件輸入/輸出語句 輸入語句: GET(輸入變量表) 輸出語句: PUT(輸出變量表)模塊調(diào)用語句 CALL 模塊名(參數(shù))第95頁,共128頁。5.4.3 詳細(xì)設(shè)計的原則 為了能夠使模塊的邏輯描述清晰準(zhǔn)確,在詳細(xì)設(shè)計階段應(yīng)遵循下列原則。 (1) 將保證程序的清晰度放在首位。 由于結(jié)構(gòu)清晰的程序易于理解和修改,并且會大大減少錯誤發(fā)生的機(jī)率,因此除了對執(zhí)行效率有嚴(yán)格要求的實時系統(tǒng)外,通常在詳細(xì)設(shè)計過程中應(yīng)優(yōu)先考慮程序的清晰度,而將程序的效率放在第二位。第96頁,共128頁。 (2) 設(shè)計過程中應(yīng)采用逐步細(xì)化的實現(xiàn)方法。 從體系結(jié)構(gòu)設(shè)計到詳細(xì)設(shè)計,本身就是一個細(xì)化

53、模塊描述的過程,由粗到細(xì)、分步進(jìn)行的細(xì)化有助于保證所生成程序的可靠性,因此在詳細(xì)設(shè)計中特別適合采用逐步細(xì)化的方法。在對程序進(jìn)行細(xì)化的過程中,還應(yīng)同時對數(shù)據(jù)描述進(jìn)行細(xì)化。第97頁,共128頁。 (3) 選擇適當(dāng)?shù)谋磉_(dá)工具。 在模塊算法確定之后,如何將其精確明了地表達(dá)出來,對詳細(xì)設(shè)計的實現(xiàn)同樣十分重要。上一節(jié)中介紹了幾種較為常用的表達(dá)工具,這些工具各有特色。如圖形工具便于設(shè)計人員與用戶的交流,而PDL語言便于將詳細(xì)設(shè)計的結(jié)果轉(zhuǎn)換為源程序。設(shè)計人員應(yīng)根據(jù)具體情況選擇適當(dāng)?shù)谋磉_(dá)工具。第98頁,共128頁。5.4.4 詳細(xì)設(shè)計說明書 詳細(xì)設(shè)計說明書是詳細(xì)設(shè)計階段最重要的技術(shù)文檔。與體系結(jié)構(gòu)設(shè)計說明書相比

54、,前者側(cè)重于軟件結(jié)構(gòu)的規(guī)定,后者則側(cè)重于對模塊實現(xiàn)具體細(xì)節(jié)的描述。詳細(xì)設(shè)計說明書可以看作是在體系結(jié)構(gòu)設(shè)計說明書所確定的系統(tǒng)總體結(jié)構(gòu)的基礎(chǔ)上,對其中各個模塊實現(xiàn)過程的進(jìn)一步描述和細(xì)化。通常,詳細(xì)設(shè)計說明書中應(yīng)主要包括以下幾方面的內(nèi)容:第99頁,共128頁。 (1) 引言:用于說明編寫本說明書的目的、背景,定義所用到的術(shù)語和縮略語,以及列出文檔中所引用的參考資料等。 (2) 總體設(shè)計:用于給出軟件系統(tǒng)的體系結(jié)構(gòu)圖。 (3) 模塊描述:依次對各個模塊進(jìn)行詳細(xì)的描述,主要包括模塊的功能和性能,實現(xiàn)模塊功能的算法,模塊的輸入及輸出,模塊接口的詳細(xì)信息等。第100頁,共128頁。5.5 面向數(shù)據(jù)流的詳細(xì)設(shè)

55、計方法 面向數(shù)據(jù)流的詳細(xì)設(shè)計方法中所采用的關(guān)鍵技術(shù)主要包括以下兩個方面: (1) 設(shè)計過程中采用了自頂向下,逐步細(xì)分的方法。面向數(shù)據(jù)流的設(shè)計,無論是在進(jìn)行體系結(jié)構(gòu)設(shè)計或是進(jìn)行詳細(xì)設(shè)計時都采用了自頂向下、逐步細(xì)分的方法。在體系結(jié)構(gòu)設(shè)計中,通過采用這種方法可以將需要處理的問題分解細(xì)化為一個由多個模塊組成的層次結(jié)構(gòu)的軟件系統(tǒng)。第101頁,共128頁。 在詳細(xì)設(shè)計中,通過采用這種方法可以將系統(tǒng)中的每個模塊逐步分解細(xì)化為一系列的具體處理步驟。自頂向下、逐步細(xì)分的方法符合人類思維的一般方式,可將一個原本復(fù)雜的大問題逐漸分解為若干個易于解決的、簡單的問題,然后各個擊破。由于這種方法在解決問題時有效地控制住了

56、復(fù)雜度和難度,因此大大減少了設(shè)計過程中出現(xiàn)錯誤的可能,能夠顯著提高軟件開發(fā)的可靠性及縮短軟件開發(fā)的周期。第102頁,共128頁。 所有模塊的實現(xiàn)都只采用單入口、單出口的三種基本控制結(jié)構(gòu)。在面向數(shù)據(jù)流的詳細(xì)設(shè)計中,為了保證程序結(jié)構(gòu)的清晰度,通常限制只能采用三種基本控制結(jié)構(gòu)來構(gòu)造程序。這三種基本的控制結(jié)構(gòu)分別為順序結(jié)構(gòu)、選擇結(jié)構(gòu)(IF-THEN-ELSE型)和DO-WHILE循環(huán)結(jié)構(gòu)。它們的共同特點是均只有一個入口和一個出口。這三種基本控制結(jié)構(gòu)的流程圖如圖5.21所示。單入口、單出口控制結(jié)構(gòu)的采用,使面向數(shù)據(jù)流的詳細(xì)設(shè)計中的每個程序模塊都能保持清晰的邏輯結(jié)構(gòu)。在實際的軟件開發(fā)工作中,為了方便使用或

57、提高程序效率,有時在面向數(shù)據(jù)流的詳細(xì)設(shè)計中還允許使用直到型循環(huán)結(jié)構(gòu)。第103頁,共128頁。圖5.21 三種基本控制結(jié)構(gòu)的流程圖(a) 順序結(jié)構(gòu);(b) 選擇結(jié)構(gòu);(c) DO-WHILE循環(huán)結(jié)構(gòu)第104頁,共128頁。 (2) 采用DO-UNTIL循環(huán)結(jié)構(gòu)和多分支選擇結(jié)構(gòu)(DO-CASE)兩種補(bǔ)充結(jié)構(gòu)。 這兩種補(bǔ)充結(jié)構(gòu)的流程圖如圖5.22所示。只允許使用三種基本控制結(jié)構(gòu)的詳細(xì)設(shè)計通常被稱為經(jīng)典的結(jié)構(gòu)程序設(shè)計,而加入了兩種補(bǔ)充結(jié)構(gòu)的詳細(xì)設(shè)計則被稱為擴(kuò)展的結(jié)構(gòu)程序設(shè)計。面向數(shù)據(jù)流的詳細(xì)設(shè)計中并非完全禁止GOTO語句的使用,例如限制在同一控制結(jié)構(gòu)內(nèi)部的GOTO語句并不會破壞程序的結(jié)構(gòu)化特點。此外,

58、當(dāng)程序中需要立即從循環(huán)中轉(zhuǎn)移出來時,在一些結(jié)構(gòu)化語言中提供了相應(yīng)的實現(xiàn)語句,如C語言中的break語句,這類語句實質(zhì)上是局限的GOTO語句。允許使用這類語句的程序設(shè)計被稱為修正的結(jié)構(gòu)程序設(shè)計。第105頁,共128頁。圖5.22 兩種補(bǔ)充結(jié)構(gòu)的流程圖(a) DO-UNTIL循環(huán)結(jié)構(gòu);(b) 多分支選擇結(jié)構(gòu)第106頁,共128頁。 綜上所述,在面向數(shù)據(jù)流的詳細(xì)設(shè)計方法中,自頂向下、逐步細(xì)分保證了程序的可靠性,而基本控制結(jié)構(gòu)的使用則保證了程序的清晰易懂。采用這種詳細(xì)設(shè)計方法的缺點是,程序結(jié)構(gòu)的清晰往往要以存儲容量的增加和運行效率的降低為代價,不過由于硬件技術(shù)的飛速發(fā)展,存儲容量和運行時間已不再是軟件

59、開發(fā)人員需要首要考慮的問題了。第107頁,共128頁。5.6 面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法 面向數(shù)據(jù)流的設(shè)計方法是以系統(tǒng)中的數(shù)據(jù)流作為設(shè)計的出發(fā)點,而面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法則是以系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)作為設(shè)計的出發(fā)點。由于大多數(shù)目標(biāo)軟件都是為了解決信息處理問題,并且算法和數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計中兩個不可分割的側(cè)面,算法的結(jié)構(gòu)往往在很大程度上依賴于它要處理的數(shù)據(jù)結(jié)構(gòu),因此可以根據(jù)軟件所要處理的信息的數(shù)據(jù)結(jié)構(gòu)來設(shè)計軟件。例如,通常對重復(fù)出現(xiàn)的數(shù)據(jù)結(jié)構(gòu)要采用循環(huán)結(jié)構(gòu)來處理,對選擇性的數(shù)據(jù)結(jié)構(gòu)采用選擇結(jié)構(gòu)來處理,而對分層的數(shù)據(jù)結(jié)構(gòu)往往要采用相對應(yīng)的分層程序結(jié)構(gòu)來處理。第108頁,共128頁。 面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法和

60、面向數(shù)據(jù)流的設(shè)計方法雖然出發(fā)點不同,但同樣都遵循結(jié)構(gòu)程序設(shè)計和自頂向下、逐步細(xì)分的設(shè)計原則。面向數(shù)據(jù)流的設(shè)計分為體系結(jié)構(gòu)設(shè)計和詳細(xì)設(shè)計,體系結(jié)構(gòu)設(shè)計的目標(biāo)是導(dǎo)出系統(tǒng)的軟件結(jié)構(gòu),詳細(xì)設(shè)計完成模塊具體實現(xiàn)過程的設(shè)計;而面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法并不明確地使用軟件結(jié)構(gòu)的概念,它的目標(biāo)是得到系統(tǒng)的程序結(jié)構(gòu),最適合在詳細(xì)設(shè)計階段使用,只在少數(shù)情況下被獨立地用于小規(guī)模加工系統(tǒng)開發(fā)的系統(tǒng)設(shè)計。通??稍谶M(jìn)行了面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計后,采用面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法確定軟件結(jié)構(gòu)中部分或全部模塊的邏輯處理過程。正是由于以上原因,本書在介紹面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計方法時,并未將其分為體系結(jié)構(gòu)設(shè)計和詳細(xì)設(shè)計兩個階段。第109頁,

溫馨提示

  • 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

提交評論