軟件結(jié)構(gòu)設計_第1頁
軟件結(jié)構(gòu)設計_第2頁
軟件結(jié)構(gòu)設計_第3頁
軟件結(jié)構(gòu)設計_第4頁
軟件結(jié)構(gòu)設計_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 軟件結(jié)構(gòu)設計 第第4 4章章 軟件結(jié)構(gòu)設計軟件結(jié)構(gòu)設計n設計:應用各種技術(shù)和原理,對設備、過程或系統(tǒng)作出足夠詳細的定義,使之能夠在物理上得以實現(xiàn)。n軟件結(jié)構(gòu)設計:是一個把軟件需求變換為軟件表示的過程,是對軟件的整體結(jié)構(gòu)、程序結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、文件結(jié)構(gòu)、接口定義等的設計,是宏觀上的設計。第4章 軟件結(jié)構(gòu)設計 軟件設計結(jié)構(gòu)設計(總體設計)任務:制訂系統(tǒng)實現(xiàn)方案和設計規(guī)范并合理確定系統(tǒng)的整體模塊結(jié)構(gòu)及接口關(guān)系。詳細設計(模塊設計)任務:詳細規(guī)定每個模塊功能的實現(xiàn)算法。結(jié)構(gòu)化設計方法;數(shù)據(jù)結(jié)構(gòu)驅(qū)動的設計方法面向?qū)ο蟮脑O計方法結(jié)構(gòu)設計第4章 軟件結(jié)構(gòu)設計 軟件設計與程序設計的區(qū)別:軟件設計與程序設

2、計的區(qū)別: 程序設計就是編程序,這是大家熟悉的,很多人印象中的“做軟件”就是編程序, 因此可能有人會把程序設計和軟件設計等同起來。這是不對的,軟件設計是宏觀上的設計。而程序設計僅僅是軟件設計的實現(xiàn),所以做軟件決不簡單等同與編程序。 第4章 軟件結(jié)構(gòu)設計 第4章 軟件結(jié)構(gòu)設計 第4章 軟件結(jié)構(gòu)設計 第4章 軟件結(jié)構(gòu)設計 軟件結(jié)構(gòu)設計過程:軟件結(jié)構(gòu)設計過程: 1. . 設想供選擇方案;設想供選擇方案; 2.2.選擇合理的方案;選擇合理的方案; 3.3.推薦最優(yōu)方案;推薦最優(yōu)方案; 4.4.功能分解;功能分解; 5.5.設計軟件結(jié)構(gòu);設計軟件結(jié)構(gòu); 6.6.設計數(shù)據(jù)庫;設計數(shù)據(jù)庫; 7.7.制訂測試

3、計劃;制訂測試計劃; 8.8.書寫文檔;書寫文檔; 9.9.審查和復審;審查和復審; 第4章 軟件結(jié)構(gòu)設計 4.3 4.3 軟件設計中的基本概念和原理軟件設計中的基本概念和原理 1. 1. 模塊化模塊化 所謂模塊,是指具有相對獨立性的,由數(shù)據(jù)說明、執(zhí)行語句所謂模塊,是指具有相對獨立性的,由數(shù)據(jù)說明、執(zhí)行語句等程序?qū)ο髽?gòu)成的集合等程序?qū)ο髽?gòu)成的集合。程序中的每個模塊都需要單獨命名,通過名字可實現(xiàn)對指定模塊的訪問。在高級語言中,模塊具體表現(xiàn)為函數(shù)、子程序、過程等。一個模塊具有輸入/輸出(接口)、功能、內(nèi)部數(shù)據(jù)和程序代碼四個特征。輸入/輸出用于實現(xiàn)模塊與其他模塊間的數(shù)據(jù)傳送,即向模塊傳入所需的原始數(shù)

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

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

6、解決問題的復雜度,從而降低軟件開發(fā)的工作量。雖然增加程序中的模塊數(shù)可以降低開發(fā)每個模塊的工作量,但同時卻增加了設計模塊接口的工作量。通過圖4.1所示的模塊數(shù)與軟件開發(fā)成本的關(guān)系圖中可以看出,當劃分的模塊數(shù)處于最小成本區(qū)時,開發(fā)軟件的總成本最低。 模塊化不但可以降低軟件開發(fā)的難度,而且可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性。此外,模塊化還有利于提高代碼的可重用性及團隊合作開發(fā)大型軟件的可行性。第4章 軟件結(jié)構(gòu)設計 圖4.1 模塊數(shù)與軟件開發(fā)成本成本(工作量)模塊數(shù)接口成本軟件總成本最小成本區(qū)M成本 / 模塊第4章 軟件結(jié)構(gòu)設計 2. 2. 模塊獨立性模塊獨立性 1) 耦合性 耦合性是對一個軟件

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

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

9、 (3) 控制耦合。若模塊之間交換的信息中包含有控制信息(盡管有時控制信息是以數(shù)據(jù)的形式出現(xiàn)的),則稱這種耦合為控制耦合??刂岂詈鲜侵械瘸潭鹊鸟詈希鼤黾映绦虻膹碗s性??刂岂詈系睦尤缦滤荆簐oid output(flag)if (flag) printf(OK! ); else printf(NO! );main() int flag;output(flag); /*主函數(shù)與output函數(shù)之間即為控制耦合關(guān)系*/第4章 軟件結(jié)構(gòu)設計 (4) 內(nèi)容耦合。若一個模塊對另一模塊中的內(nèi)容(包括數(shù)據(jù)和程序段)進行了直接的引用甚至修改,或通過非正常入口進入到另一模塊內(nèi)部,或一個模塊具有多個入口,或

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

11、互結(jié)合的緊密內(nèi)聚性是對一個模塊內(nèi)部各個組成元素之間相互結(jié)合的緊密程度的度量指標程度的度量指標。模塊中組成元素結(jié)合的越緊密,模塊的內(nèi)聚性就越高,模塊的獨立性也就越高。模塊的內(nèi)聚性和耦合性是兩個相互對立且又密切相關(guān)的概念。事實上,它們是同一事物的兩個方面,模塊的高內(nèi)聚性往往就意味著模塊間的低耦合性。因為程序中的各個部分必定是有聯(lián)系的,若將其中密切相關(guān)的部分放在同一個模塊中,模塊間的聯(lián)系就會降低;反之,若將密切相關(guān)的部分分散放在不同的模塊之中,模塊間的聯(lián)系必然會加強。在進行模塊化設計時,耦合性和內(nèi)聚性都是必須考慮的重要指標。但在軟件設計時應將更多的注意力集中在提高模塊的內(nèi)聚性上。模塊的內(nèi)聚性主要可劃

12、分為如下幾種不同的類型。第4章 軟件結(jié)構(gòu)設計 (1) 偶然內(nèi)聚。若一個模塊由多個完成不同任務的語句段組成,各語句段之間的聯(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)聚是內(nèi)聚程度最低的一種,在軟件設計時應盡量避免。第4章 軟件結(jié)構(gòu)設計 (2) 邏輯內(nèi)聚。若一個模塊可實現(xiàn)多個邏輯上相同或相似的一類功能,則稱該模塊的內(nèi)聚為邏輯內(nèi)聚。例如,將程序中多種不同類型數(shù)據(jù)的輸出放在同一個模塊

13、中實現(xiàn),這個模塊就屬于邏輯聚合。邏輯內(nèi)聚比偶然內(nèi)聚的內(nèi)聚程度高一些。雖然邏輯聚合模塊的組成部分之間有一定的關(guān)系,但不同功能混在一起并公用模塊中的部分代碼,給修改帶來了一定的麻煩。另外,為了在調(diào)用模塊時能選擇執(zhí)行其中的某個功能,需要傳遞相應的控制參數(shù),因而會造成模塊間的控制耦合,降低模塊的獨立性。第4章 軟件結(jié)構(gòu)設計 (3) 時間內(nèi)聚。若一個模塊包含了需要在同一時間段中執(zhí)行的多個任務,則稱該模塊的內(nèi)聚為時間內(nèi)聚。例如,將多個變量的初始化放在同一個模塊中實現(xiàn),或?qū)⑿枰瑫r使用的多個庫文件的打開操作放在同一個模塊中,都會產(chǎn)生時間內(nèi)聚的模塊。由于時間內(nèi)聚模塊中的各個部分在時間上的聯(lián)系,其內(nèi)聚程度比邏輯

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

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

16、所介紹的七種內(nèi)聚中,按照內(nèi)聚性從低到高進行排列的結(jié)果如圖4.2所示。 第4章 軟件結(jié)構(gòu)設計 偶然內(nèi)聚邏輯內(nèi)聚時間內(nèi)聚低內(nèi)聚過程內(nèi)聚通信內(nèi)聚中內(nèi)聚順序內(nèi)聚功能內(nèi)聚高內(nèi)聚低高圖圖4.2 內(nèi)聚性的排列內(nèi)聚性的排列 第4章 軟件結(jié)構(gòu)設計 3. 3. 抽象抽象 抽象是人類在解決復雜問題時經(jīng)常采用的一種思維方式,它是指將現(xiàn)實世界中具有共性的一類事物的相似的、本質(zhì)的方面集中概括起來,而暫時忽略它們之間的細節(jié)差異。在軟件開發(fā)中運用抽象的概念,可以將復雜問題的求解過程分層,在不同的抽象層上實現(xiàn)難度的分解。在抽象級別較高的層次上,可以將瑣碎的細節(jié)的信息暫時隱藏起來,以利于解決系統(tǒng)中的全局性的問題。軟件開發(fā)過程中從

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

18、息隱蔽是指一個模塊將自身的內(nèi)部信息向其他模塊隱藏起來,以避免其他模塊不恰當?shù)脑L問和修改,只有對那些為了完成系統(tǒng)功能所必須的數(shù)據(jù)交換才被允許在模塊間進行。信息隱蔽的目的主要是為了提高模塊的獨立性,減少將一個模塊中的錯誤擴散到其他模塊的機會。但信息隱蔽并不意味著某個模塊中的內(nèi)部信息對其他模塊來說是完全不可見或不能使用的,而是說模塊之間的信息傳遞只能通過合法的調(diào)用接口來實現(xiàn)。顯然,信息隱蔽對提高軟件的可讀性和可維護性都是非常重要的。第4章 軟件結(jié)構(gòu)設計 5. 5. 逐步求精逐步求精 “為了能集中精力解決主要問題而盡量推遲對問題細節(jié)的考慮”??梢钥醋魇且豁棸岩粋€時期內(nèi)必須解決的種種問題按優(yōu)先級排列序的

19、技術(shù),是由Niklaus Wirth提出的一種自頂向下的設計策略。求精實際上是一個細化過程。抽象與求精是一對互補的概念。 第4章 軟件結(jié)構(gòu)設計 4.4 4.4 啟發(fā)式規(guī)則啟發(fā)式規(guī)則 (1) 降低模塊的耦合性,提高模塊的內(nèi)聚性。 為了提高軟件中各個模塊的獨立性,提高程序的可讀性、可測試性和可維護性,在軟件體系結(jié)構(gòu)設計時應盡可能采用內(nèi)聚性高的模塊,如最好實現(xiàn)功能內(nèi)聚;盡量只使用數(shù)據(jù)耦合,限制公共耦合的使用,避免控制耦合的使用,杜絕內(nèi)容耦合的出現(xiàn)。第4章 軟件結(jié)構(gòu)設計 (2) 保持適中的模塊規(guī)模。 程序中模塊的規(guī)模過大,會降低程序的可讀性;而模塊規(guī)模過小,勢必會導致程序中的模塊數(shù)目過多,增加接口的復

20、雜性。對于模塊的適當規(guī)模并沒有嚴格的規(guī)定,但普遍的觀點是模塊中的語句數(shù)最好保持在10100之間。為了使模塊的規(guī)模適中,在保證模塊獨立性的前提下,可對程序中規(guī)模過小的模塊進行合并或?qū)σ?guī)模過大的模塊進行分解。第4章 軟件結(jié)構(gòu)設計 (3) 模塊應具有高扇入和適當?shù)纳瘸?在模塊調(diào)用中,某個模塊的上級模塊數(shù)被稱為該模塊的扇入(如圖4.3(a)所示,模塊M的扇入數(shù)為n);而某個模塊可以調(diào)用的下級模塊數(shù)被稱為該模塊的扇出(如圖4.3(b)所示,模塊M的扇出數(shù)為k)。顯然,一個模塊的扇入表明了共有多少個模塊需要調(diào)用該模塊,而其扇出表明了該模塊可以控制的下級模塊的數(shù)目。第4章 軟件結(jié)構(gòu)設計 圖4.3 模塊的扇入

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

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

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

24、的兩個方面,降低深度會引起寬度的增加,而降低寬度又會帶來深度的增加。第4章 軟件結(jié)構(gòu)設計 (5) 模塊的作用域應處于其控制域范圍之內(nèi)。 模塊的作用域是指受該模塊內(nèi)一個判定條件影響的所有模塊范圍。模塊的控制域是指該模塊本身以及所有該模塊的下屬模塊(包括該模塊可以直接調(diào)用的下級模塊和可以間接調(diào)用的更下層的模塊)。例如,在圖4.5中,模塊C的控制域為模塊C、E和F;若在模塊C中存在一個對模塊D、E和F均有影響的判定條件,即模塊C的作用域為模塊C、D、E和F(圖中帶陰影的模塊),則顯然模塊C的作用域超出了其作用域。由于模塊D在模塊C的作用域中,因此模塊C對模塊D的控制信息必然要通過上級模塊B進行傳遞,

25、這樣不但會增加模塊間的耦合性,而且會給模塊的維護和修改帶來麻煩(若要修改模塊C,可能會對不在它控制域中的模塊D造成影響)。因此,軟件設計時應使各個模塊的作用域處于其控制域范圍之內(nèi)。若發(fā)現(xiàn)不符合此設計原則的模塊,可通過下面的方法進行改進:第4章 軟件結(jié)構(gòu)設計 將判定位置上移。如將圖4.7中的模塊C中的判定條件上移到上級模塊B中或?qū)⒛KC整個合并到模塊B中。 將超出作用域的模塊下移。如將圖4.5中的模塊D移至模塊C的下一層上,使模塊D處于模塊C的控制域中。第4章 軟件結(jié)構(gòu)設計 MABCDEF圖圖4.5 模塊的作用域和控制域模塊的作用域和控制域 第4章 軟件結(jié)構(gòu)設計 (6) 盡量降低模塊的接口復雜度

26、。 由于復雜的模塊接口是導致軟件出現(xiàn)錯誤的主要原因之一,因此在軟件設計中應盡量使模塊接口簡單清晰,如減少接口傳送的信息個數(shù)以及確保實參和形參的一致性和對應性等。降低模塊的接口復雜度,可以提高軟件的可讀性,減少出現(xiàn)錯誤的可能性,并有利于軟件的測試和維護。 (7)設計單入口單出口模塊 (8)模塊功能應該可以預測第4章 軟件結(jié)構(gòu)設計 4.5.1 4.5.1 描述軟件結(jié)構(gòu)用的圖形工具描述軟件結(jié)構(gòu)用的圖形工具 1. HIPO1. HIPO圖圖 HIPO(Hierarchy Plus Input/Processing/Output)圖是IBM公司在20世紀70年代發(fā)展起來的用于描述軟件結(jié)構(gòu)的圖形工具。它實

27、質(zhì)上是在描述軟件總體模塊結(jié)構(gòu)的層次圖(H圖)的基礎上,加入了用于描述每個模塊輸入/輸出數(shù)據(jù)和處理功能的IPO圖,因此它的中文全名為層次圖加輸入/處理/輸出圖。4.5 4.5 軟件結(jié)構(gòu)設計方法軟件結(jié)構(gòu)設計方法第4章 軟件結(jié)構(gòu)設計 1) HIPO圖中的H圖 H圖用于在體系結(jié)構(gòu)設計過程中描繪軟件的層次結(jié)構(gòu)。在H圖中,每一個矩形框代表一個模塊,圖中最頂層的矩形框表示系統(tǒng)中的主控模塊,矩形框之間的連線用于表示模塊之間的調(diào)用關(guān)系。為了使H圖更具有可追蹤性,可以為除頂層矩形框以外的其他矩形框加上能反映層次關(guān)系的編號。H圖比較適用于自頂向下進行分解的軟件結(jié)構(gòu)設計方法。工資計算系統(tǒng)的H圖如下圖所示。第4章 軟件

28、結(jié)構(gòu)設計 圖4.6 工資計算系統(tǒng)的H圖計算出勤獎1.1.2.1計算業(yè)績獎1.1.2.2計算工資檔案各基本數(shù)據(jù)項之和1.1.1計算獎金1.1.2計算應發(fā)工資1.1計算水電扣款1.2.1計算缺勤扣款1.2.2計算所得稅扣款1.2.3計算扣款1.2計算實發(fā)工資1.3計算工資1查詢職工賬號2.1生成工資存款清單2.2工資轉(zhuǎn)存2打印工資清單3工資計算系統(tǒng)第4章 軟件結(jié)構(gòu)設計 2) IPO2) IPO圖圖 IPO圖能夠方便、清晰地描繪出模塊的輸入數(shù)據(jù)、加工和輸出數(shù)據(jù)之間的關(guān)系。與層次圖中每個矩形框相對應,應該有一張IPO圖描述該矩形框所代表的模塊的具體處理過程,作為對層次圖中內(nèi)容的補充說明。IPO圖的基本

29、形式為:在圖中左邊的框中列出模塊涉及的所有輸入數(shù)據(jù),在中間的框中列出主要的加工,在右邊的框中列出處理后產(chǎn)生的輸出數(shù)據(jù);圖中的箭頭用于指明輸入數(shù)據(jù)、加工和輸出結(jié)果之間的關(guān)系。工資計算系統(tǒng)中的計算工資模塊的IPO圖如圖4.7所示。第4章 軟件結(jié)構(gòu)設計 圖4.7 計算工資模塊的IPO圖業(yè)績表出勤表工資檔案文件獎懲條例水電扣款表計算獎金計算應發(fā)工資計算扣款計算實發(fā)工資獎金發(fā)放表應發(fā)工資表扣款表工資清單實發(fā)工資表第4章 軟件結(jié)構(gòu)設計 2. 2. 結(jié)構(gòu)圖結(jié)構(gòu)圖 在軟件工程中,軟件結(jié)構(gòu)經(jīng)常采用20世紀70年代中期由Yourdon等人提出的結(jié)構(gòu)圖(SC,Structure Chart)這種圖形工具來表示。結(jié)構(gòu)

30、圖能夠描述出軟件系統(tǒng)的模塊層次結(jié)構(gòu),清楚地反映出程序中各模塊之間的調(diào)用關(guān)系和聯(lián)系。結(jié)構(gòu)圖中的基本符號及其含義見表。第4章 軟件結(jié)構(gòu)設計 表表4.1 4.1 結(jié)構(gòu)圖中的基本符號結(jié)構(gòu)圖中的基本符號ABCABC符 號含 義用于表示模塊,方框中標明模塊的名稱用于描述模塊之間的調(diào)用關(guān)系用于表示模塊調(diào)用過程中傳遞的信息,箭頭上標明信息的名稱;箭頭尾部為空心圓表示傳遞的信息是數(shù)據(jù),若為實心圓則表示傳遞的是控制信息 表示模塊A選擇調(diào)用模塊B或模塊C表示模塊A循環(huán)調(diào)用模塊B和模塊C第4章 軟件結(jié)構(gòu)設計 4.5.2 4.5.2 面向數(shù)據(jù)流的軟件結(jié)構(gòu)設計方法面向數(shù)據(jù)流的軟件結(jié)構(gòu)設計方法1 1、數(shù)據(jù)流圖的類型、數(shù)據(jù)流

31、圖的類型 面向數(shù)據(jù)流的體系設計方法能夠方便地將需求分析階段生成的數(shù)據(jù)流圖轉(zhuǎn)換成設計階段所需的軟件結(jié)構(gòu)。但對于不同類型的數(shù)據(jù)流圖,轉(zhuǎn)換得到的軟件結(jié)構(gòu)也不同,因此有必要首先研究一下數(shù)據(jù)流圖的典型形式。根據(jù)數(shù)據(jù)流圖的結(jié)構(gòu)特點通常可將數(shù)據(jù)流圖劃分為如下兩個基本類型。第4章 軟件結(jié)構(gòu)設計 (1 1)變換型數(shù)據(jù)流圖)變換型數(shù)據(jù)流圖 變換型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點為:由(邏輯)輸入、變換中心和(邏輯)輸出三部分組成,如圖4.8所示。該類型數(shù)據(jù)流圖所描述的加工過程為:首先,外部數(shù)據(jù)沿邏輯輸入路徑進入系統(tǒng),同時數(shù)據(jù)的形式由外部形式轉(zhuǎn)化為內(nèi)部形式;接著,數(shù)據(jù)被送往變換中心進行加工處理;最后,經(jīng)過加工得到的結(jié)果數(shù)據(jù)

32、的內(nèi)部形式被轉(zhuǎn)換為外部形式并沿邏輯輸出路徑離開系統(tǒng)??梢钥闯?,變換型數(shù)據(jù)流圖反映的是一個順序結(jié)構(gòu)的加工過程。第4章 軟件結(jié)構(gòu)設計 變換中心變換輸入輸出圖圖4.8 變換型數(shù)據(jù)流圖的基本模型變換型數(shù)據(jù)流圖的基本模型 第4章 軟件結(jié)構(gòu)設計 (2 2)事務型數(shù)據(jù)流圖)事務型數(shù)據(jù)流圖 原則上,所有基本系統(tǒng)模型都屬于變換型,但其中有一類具有特殊形態(tài)的數(shù)據(jù)流圖又被單獨劃分為事務型。事務型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點為:輸入流在經(jīng)過某個被稱為“事務中心”的加工時被分離為多個發(fā)散的輸出流,形成多個平行的加工處理路徑,如圖4.9所示。該類型數(shù)據(jù)流圖所描述的加工過程為:外部數(shù)據(jù)沿輸入通路進入系統(tǒng)后,被送往事務中心;事務

33、中心接收輸入數(shù)據(jù)并分析確定其類型;最后根據(jù)所確定的類型為數(shù)據(jù)選擇其中的一條加工路徑。第4章 軟件結(jié)構(gòu)設計 圖4.9 事務型數(shù)據(jù)流圖的基本模型事務中心輸入流接收路徑加工路徑第4章 軟件結(jié)構(gòu)設計 2 2、面向數(shù)據(jù)流的軟件結(jié)構(gòu)設計過程、面向數(shù)據(jù)流的軟件結(jié)構(gòu)設計過程 運用面向數(shù)據(jù)流的方法進行軟件體系結(jié)構(gòu)的設計時,應該首先對需求分析階段得到的數(shù)據(jù)流圖進行復查,必要時進行修改和精化;接著在仔細分析系統(tǒng)數(shù)據(jù)流圖的基礎上,確定數(shù)據(jù)流圖的類型,并按照相應的設計步驟將數(shù)據(jù)流圖轉(zhuǎn)化為軟件結(jié)構(gòu);最后還要根據(jù)體系結(jié)構(gòu)設計的原則對得到的軟件結(jié)構(gòu)進行優(yōu)化和改進。面向數(shù)據(jù)流的體系結(jié)構(gòu)設計過程如圖4.10所示。第4章 軟件結(jié)構(gòu)

34、設計 圖4.10 面向數(shù)據(jù)流的體系結(jié)構(gòu)設計過程事務流變換流精化數(shù)據(jù)流圖區(qū)分事務中心、接收路徑及加工路徑區(qū)分變換中心、輸入及輸出部分映射成事務結(jié)構(gòu)映射成變換結(jié)構(gòu)詳細設計根據(jù)體系結(jié)構(gòu)設計基本原則優(yōu)化軟件結(jié)構(gòu)導出接口描述和全程數(shù)據(jù)結(jié)構(gòu)復查事務分析變換分析流類型第4章 軟件結(jié)構(gòu)設計 一般來說,大多數(shù)系統(tǒng)的加工問題被表示為變換型,可采用變換分析設計方法建立系統(tǒng)的軟件結(jié)構(gòu),但當數(shù)據(jù)流圖具有明顯的事務特點時,則應采用事務分析技術(shù)進行處理。變換分析設計方法與事務分析設計方法類似,都遵循圖4.10所示的設計過程,主要差別僅在于由數(shù)據(jù)流圖向軟件結(jié)構(gòu)的映射方法不同。對于一個復雜的系統(tǒng),數(shù)據(jù)流圖中可能既存在變換流又存

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

36、。另外,下述方法可幫助設計人員確定系統(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)的變換中心。第4章 軟件結(jié)構(gòu)設計 圖4.11 進行了邊界劃分的工資計算系統(tǒng)數(shù)據(jù)流圖獎金發(fā)放表缺勤扣款表工資檔案F2應發(fā)工資表所得稅扣款后勤部門水電扣款表工資清單F3實發(fā)工資表工資條職工打印工資清單職工個人工資賬號清單F4查找職工銀

37、行工資賬號實發(fā)工資銀行工資存款清單賬號計算出勤獎獎懲條例F1統(tǒng)計出勤、請假及曠工時數(shù)人事部門出勤表業(yè)績表計算缺勤扣款計算業(yè)績獎業(yè)績獎出勤獎出勤時數(shù)請假及曠工時數(shù)基本工資計算各項基本數(shù)據(jù)之和計算應發(fā)工資生成工資存款清單計算所得稅計算各項獎金之和計算實發(fā)工資第4章 軟件結(jié)構(gòu)設計 B 完成第一級分解,設計系統(tǒng)的上層模塊。 這一步主要是確定軟件結(jié)構(gòu)的頂層和第一層。任何系統(tǒng)的頂層都只含一個用于控制的主模塊。變換型數(shù)據(jù)流圖對應的軟件結(jié)構(gòu)的第一層一般由輸入、變換和輸出三種模塊組成。系統(tǒng)中的每個邏輯輸入對應一個輸入模塊,完成為主模塊提供數(shù)據(jù)的功能;每一個邏輯輸出對應一個輸出模塊,完成為主模塊輸出數(shù)據(jù)的功能;變

38、換中心對應一個變換模塊,完成將系統(tǒng)的邏輯輸入轉(zhuǎn)換為邏輯輸出的功能。工資計算系統(tǒng)的一級分解結(jié)果如圖4.12所示。第4章 軟件結(jié)構(gòu)設計 工資計算系統(tǒng)取得基本數(shù)據(jù)計算工資輸出計算結(jié)果圖圖4.12 工資計算系統(tǒng)的一級分解工資計算系統(tǒng)的一級分解 第4章 軟件結(jié)構(gòu)設計 C 完成第二級分解,設計輸入、變換中心和輸出部分的中、下層模塊。 這一步主要是對上一步確定的軟件結(jié)構(gòu)進行逐層細化,為每一個輸入、輸出模塊及變換模塊設計下屬模塊。通常,一個輸入模塊應包括用于接收數(shù)據(jù)和轉(zhuǎn)換數(shù)據(jù)(將接收的數(shù)據(jù)轉(zhuǎn)換成下級模塊所需的形式)的兩個下屬模塊;一個輸出模塊應包括用于轉(zhuǎn)換數(shù)據(jù)(將上級模塊的處理結(jié)果轉(zhuǎn)換成輸出所需的形式)和傳出

39、數(shù)據(jù)的兩個下屬模塊;變換模塊的分解一般應根據(jù)變換中心的組成情況及模塊分解的原則來確定下屬模塊。完成二級分解后,工資計算系統(tǒng)的軟件結(jié)構(gòu)如圖4.13所示。第4章 軟件結(jié)構(gòu)設計 圖4.13 完成二級分解后的工資計算系統(tǒng)軟件結(jié)構(gòu)取得水電扣款計算出勤獎、缺勤扣款計算業(yè)績獎計算基本工資讀水電扣款表讀考勤表讀業(yè)績表讀工資檔案取得基本數(shù)據(jù)計算應發(fā)工資計算實發(fā)工資計算獎金之和計算所得稅計算工資生成工資存款清單查找職工銀行工資賬號打印工資清單工資計算系統(tǒng)輸出計算結(jié)果第4章 軟件結(jié)構(gòu)設計 (2 2)事務分析設計)事務分析設計圖4.14 進行了邊界劃分的事務型數(shù)據(jù)流圖 AEGBCIJKH接收路徑事務中心F加工路徑 2加工路徑 1第4章 軟件結(jié)構(gòu)設計 A 劃分邊界,明確數(shù)據(jù)流圖中的接收路徑、事務中心和加工路徑

溫馨提示

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

評論

0/150

提交評論