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

下載本文檔

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

文檔簡(jiǎn)介

1、第4章 軟件結(jié)構(gòu)設(shè)計(jì),設(shè)計(jì):應(yīng)用各種技術(shù)和原理,對(duì)設(shè)備、過(guò)程或系統(tǒng)作出足夠詳細(xì)的定義,使之能夠在物理上得以實(shí)現(xiàn)。 軟件結(jié)構(gòu)設(shè)計(jì):是一個(gè)把軟件需求變換為軟件表示的過(guò)程,是對(duì)軟件的整體結(jié)構(gòu)、程序結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、文件結(jié)構(gòu)、接口定義等的設(shè)計(jì),是宏觀上的設(shè)計(jì)。,4.1 軟件結(jié)構(gòu)設(shè)計(jì)概述,軟件設(shè)計(jì)與程序設(shè)計(jì)的區(qū)別:,程序設(shè)計(jì)就是編程序,這是大家熟悉的,很多人印象中的“做軟件”就是編程序, 因此可能有人會(huì)把程序設(shè)計(jì)和軟件設(shè)計(jì)等同起來(lái)。這是不對(duì)的,軟件設(shè)計(jì)是宏觀上的設(shè)計(jì)。而程序設(shè)計(jì)僅僅是軟件設(shè)計(jì)的實(shí)現(xiàn),所以做軟件決不簡(jiǎn)單等同與編程序。,4.2 軟件結(jié)構(gòu)設(shè)計(jì)的目標(biāo)、任務(wù)和過(guò)程,目標(biāo):綜合采用各種技術(shù)手段,將系統(tǒng)

2、需求轉(zhuǎn)換為數(shù)據(jù)結(jié)構(gòu)、模塊結(jié)構(gòu)(或?qū)ο?類結(jié)構(gòu))的表達(dá)形式,并實(shí)現(xiàn)系統(tǒng)的性能、安全性、可靠性要求。取得最佳方案。最佳方案的標(biāo)準(zhǔn):(1)開(kāi)發(fā)費(fèi)用??;(2)資源消耗低;(3)開(kāi)發(fā)時(shí)間短;(4)生產(chǎn)效率高;(5)可靠性較高;(6)可維護(hù)性好。,結(jié)果:用模塊結(jié)構(gòu)圖表達(dá)。,任務(wù):,結(jié)構(gòu)設(shè)計(jì)是一個(gè)自頂向下,逐步具體的綜合性的設(shè)計(jì)過(guò)程。主要內(nèi)容:,(1)綜合分析系統(tǒng)的各種實(shí)現(xiàn)方案,提出最佳實(shí)現(xiàn)方案的建議。,(2)制定設(shè)計(jì)規(guī)范、標(biāo)準(zhǔn)及約定原則。,(3)軟件結(jié)構(gòu)設(shè)計(jì):采用某種軟件設(shè)計(jì)方法,按照模塊的構(gòu)造原則,逐步、逐層地設(shè)計(jì)軟件的模塊層次結(jié)構(gòu)。,(4)數(shù)據(jù)結(jié)構(gòu)以及接口的設(shè)計(jì)。,(5)系統(tǒng)性能設(shè)計(jì)。,(6)系統(tǒng)安全

3、性能設(shè)計(jì):系統(tǒng)的自保護(hù)設(shè)計(jì);數(shù)據(jù)一致性設(shè)計(jì);容錯(cuò)設(shè)計(jì)。,(7)系統(tǒng)可靠性設(shè)計(jì)。,(8)設(shè)計(jì)文檔的編寫(xiě):結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū);用戶手冊(cè);系統(tǒng)初步的測(cè)試計(jì)劃說(shuō)明書(shū)。,(9)設(shè)計(jì)的審查和復(fù)審。,軟件結(jié)構(gòu)設(shè)計(jì)過(guò)程:,1. 設(shè)想供選擇方案; 2.選擇合理的方案; 3.推薦最優(yōu)方案; 4.功能分解; 5.設(shè)計(jì)軟件結(jié)構(gòu); 6.設(shè)計(jì)數(shù)據(jù)庫(kù); 7.制訂測(cè)試計(jì)劃; 8.書(shū)寫(xiě)文檔; 9.審查和復(fù)審;,4.3 軟件設(shè)計(jì)中的基本概念和原理,1. 模塊化 所謂模塊,是指具有相對(duì)獨(dú)立性的,由數(shù)據(jù)說(shuō)明、執(zhí)行語(yǔ)句等程序?qū)ο髽?gòu)成的集合。程序中的每個(gè)模塊都需要單獨(dú)命名,通過(guò)名字可實(shí)現(xiàn)對(duì)指定模塊的訪問(wèn)。在高級(jí)語(yǔ)言中,模塊具體表現(xiàn)為函數(shù)、子

4、程序、過(guò)程等。一個(gè)模塊具有輸入/輸出(接口)、功能、內(nèi)部數(shù)據(jù)和程序代碼四個(gè)特征。輸入/輸出用于實(shí)現(xiàn)模塊與其他模塊間的數(shù)據(jù)傳送,即向模塊傳入所需的原始數(shù)據(jù)及從模塊傳出得到的結(jié)果數(shù)據(jù)。功能指模塊所完成的工作。模塊的輸入/輸出和功能構(gòu)成了模塊的外部特征。內(nèi)部數(shù)據(jù)是指僅能在模塊內(nèi)部使用的局部量。程序代碼用于描述實(shí)現(xiàn)模塊功能的具體方法和步驟。模塊的內(nèi)部數(shù)據(jù)和程序代碼反映的是模塊的內(nèi)部特征。,模塊化是指將整個(gè)程序劃分為若干個(gè)模塊,每個(gè)模塊用于實(shí)現(xiàn)一個(gè)特定的功能。劃分模塊對(duì)于解決大型復(fù)雜的問(wèn)題是非常必要的,可以大大降低解決問(wèn)題的難度。為了說(shuō)明這一點(diǎn),我們可對(duì)問(wèn)題復(fù)雜性、開(kāi)發(fā)工作量和模塊數(shù)之間的關(guān)系進(jìn)行以下推

5、理。 首先,我們?cè)O(shè)C(x)為問(wèn)題x所對(duì)應(yīng)的復(fù)雜度函數(shù),E(x)為解決問(wèn)題x所需要的工作量函數(shù)。對(duì)于兩個(gè)問(wèn)題P1和P2,如果: C(P1) C(P2) 即問(wèn)題P1的復(fù)雜度比P2高,則顯然有: E(P1) E(P2) 即解決問(wèn)題P1比P2所需的工作量大。,在人們解決問(wèn)題的過(guò)程中,發(fā)現(xiàn)存在有另一個(gè)有趣的規(guī)律: C(P1+P2) C(P1)+C(P2) 即解決由多個(gè)問(wèn)題復(fù)合而成的大問(wèn)題的復(fù)雜度大于單獨(dú)解決各個(gè)問(wèn)題的復(fù)雜度之和。也就是說(shuō),對(duì)于一個(gè)復(fù)雜問(wèn)題,將其分解成多個(gè)小問(wèn)題分別解決比較容易。由此我們可以推出: E(P1+P2) E(P1)+E(P2) 即將復(fù)雜問(wèn)題分解成若干個(gè)小問(wèn)題,各個(gè)擊破,所需要的

6、工作量小于直接解決復(fù)雜問(wèn)題所需的工作量。,根據(jù)上面的推理,我們可以得到這樣一個(gè)結(jié)論,模塊化可以降低解決問(wèn)題的復(fù)雜度,從而降低軟件開(kāi)發(fā)的工作量。雖然增加程序中的模塊數(shù)可以降低開(kāi)發(fā)每個(gè)模塊的工作量,但同時(shí)卻增加了設(shè)計(jì)模塊接口的工作量。通過(guò)圖4.1所示的模塊數(shù)與軟件開(kāi)發(fā)成本的關(guān)系圖中可以看出,當(dāng)劃分的模塊數(shù)處于最小成本區(qū)時(shí),開(kāi)發(fā)軟件的總成本最低。 模塊化不但可以降低軟件開(kāi)發(fā)的難度,而且可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性。此外,模塊化還有利于提高代碼的可重用性及團(tuán)隊(duì)合作開(kāi)發(fā)大型軟件的可行性。,圖4.1 模塊數(shù)與軟件開(kāi)發(fā)成本,2. 模塊獨(dú)立性 1) 耦合性 耦合性是對(duì)一個(gè)軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系

7、緊密程度的度量指標(biāo)。模塊間的聯(lián)系越緊密,耦合性就越高,模塊的獨(dú)立性也就越低。由于模塊間的聯(lián)系是通過(guò)模塊接口實(shí)現(xiàn)的,因此,模塊耦合性的高低主要取決于模塊接口的復(fù)雜程度、調(diào)用模塊的方式以及通過(guò)模塊接口的數(shù)據(jù)。模塊間的耦合性主要可劃分為如下幾種類型。,(1) 數(shù)據(jù)耦合。若兩個(gè)模塊之間僅通過(guò)模塊參數(shù)交換信息,且交換的信息全部為簡(jiǎn)單數(shù)據(jù),則稱這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)據(jù)耦合。數(shù)據(jù)耦合的例子如下所示:,(2) 公共耦合。若兩個(gè)或多個(gè)模塊通過(guò)引用公共數(shù)據(jù)相互聯(lián)系,則稱這種耦合為公共耦合。例如,在程序中定義了全局變量,并在多個(gè)模塊中對(duì)全局變量進(jìn)行了引用,則引用全局變量的多個(gè)

8、模塊間就具有了公共耦合關(guān)系。 FORTRAN語(yǔ)言中使用的common語(yǔ)句也會(huì)在多個(gè)模塊間建立公共耦合關(guān)系。公共耦合的復(fù)雜度隨著耦合的模塊個(gè)數(shù)的增加而顯著增加。在程序設(shè)計(jì)中,若兩個(gè)模塊間需要交換的數(shù)據(jù)較多,僅通過(guò)參數(shù)傳遞難以實(shí)現(xiàn)時(shí),可以考慮采用公共耦合完成,但一定注意盡量降低公共耦合的程度。,(4) 內(nèi)容耦合。若一個(gè)模塊對(duì)另一模塊中的內(nèi)容(包括數(shù)據(jù)和程序段)進(jìn)行了直接的引用甚至修改,或通過(guò)非正常入口進(jìn)入到另一模塊內(nèi)部,或一個(gè)模塊具有多個(gè)入口,或兩個(gè)模塊共享一部分代碼,則稱模塊間的這種耦合為內(nèi)容耦合。內(nèi)容耦合是所有耦合關(guān)系中程度最高的,會(huì)使因模塊間的聯(lián)系過(guò)于緊密而對(duì)后期的開(kāi)發(fā)和維護(hù)工作帶來(lái)很大的麻

9、煩,因此,應(yīng)堅(jiān)決避免任何形式的內(nèi)容耦合。實(shí)際上,許多高級(jí)程序設(shè)計(jì)語(yǔ)言在規(guī)定語(yǔ)法時(shí)就已經(jīng)杜絕了任何形式的內(nèi)容耦合。 耦合是影響軟件復(fù)雜度的一個(gè)重要因素,設(shè)計(jì)過(guò)程中應(yīng)力求降低程序的耦合性。在以上所介紹的耦合中,數(shù)據(jù)耦合的程度最低,其次是公共耦合,再其次是控制耦合,程度最高的是內(nèi)容耦合。,2) 內(nèi)聚性 內(nèi)聚性是對(duì)一個(gè)模塊內(nèi)部各個(gè)組成元素之間相互結(jié)合的緊密程度的度量指標(biāo)。模塊中組成元素結(jié)合的越緊密,模塊的內(nèi)聚性就越高,模塊的獨(dú)立性也就越高。模塊的內(nèi)聚性和耦合性是兩個(gè)相互對(duì)立且又密切相關(guān)的概念。事實(shí)上,它們是同一事物的兩個(gè)方面,模塊的高內(nèi)聚性往往就意味著模塊間的低耦合性。因?yàn)槌绦蛑械母鱾€(gè)部分必定是有聯(lián)系

10、的,若將其中密切相關(guān)的部分放在同一個(gè)模塊中,模塊間的聯(lián)系就會(huì)降低;反之,若將密切相關(guān)的部分分散放在不同的模塊之中,模塊間的聯(lián)系必然會(huì)加強(qiáng)。在進(jìn)行模塊化設(shè)計(jì)時(shí),耦合性和內(nèi)聚性都是必須考慮的重要指標(biāo)。但在軟件設(shè)計(jì)時(shí)應(yīng)將更多的注意力集中在提高模塊的內(nèi)聚性上。模塊的內(nèi)聚性主要可劃分為如下幾種不同的類型。,(1) 偶然內(nèi)聚。若一個(gè)模塊由多個(gè)完成不同任務(wù)的語(yǔ)句段組成,各語(yǔ)句段之間的聯(lián)系十分松散或根本沒(méi)有任何聯(lián)系,則稱此模塊的內(nèi)聚為偶然內(nèi)聚。例如,程序中多處出現(xiàn)一些無(wú)聯(lián)系的語(yǔ)句段序列,為了節(jié)省內(nèi)存空間將其組合成為一個(gè)模塊,這個(gè)模塊就屬于偶然內(nèi)聚。偶然內(nèi)聚的模塊由于組成部分之間沒(méi)有實(shí)質(zhì)的聯(lián)系,因此難于理解和修

11、改,會(huì)給軟件開(kāi)發(fā)帶來(lái)很大的困擾。偶然內(nèi)聚是內(nèi)聚程度最低的一種,在軟件設(shè)計(jì)時(shí)應(yīng)盡量避免。,(2) 邏輯內(nèi)聚。若一個(gè)模塊可實(shí)現(xiàn)多個(gè)邏輯上相同或相似的一類功能,則稱該模塊的內(nèi)聚為邏輯內(nèi)聚。例如,將程序中多種不同類型數(shù)據(jù)的輸出放在同一個(gè)模塊中實(shí)現(xiàn),這個(gè)模塊就屬于邏輯聚合。邏輯內(nèi)聚比偶然內(nèi)聚的內(nèi)聚程度高一些。雖然邏輯聚合模塊的組成部分之間有一定的關(guān)系,但不同功能混在一起并公用模塊中的部分代碼,給修改帶來(lái)了一定的麻煩。另外,為了在調(diào)用模塊時(shí)能選擇執(zhí)行其中的某個(gè)功能,需要傳遞相應(yīng)的控制參數(shù),因而會(huì)造成模塊間的控制耦合,降低模塊的獨(dú)立性。,(3) 時(shí)間內(nèi)聚。若一個(gè)模塊包含了需要在同一時(shí)間段中執(zhí)行的多個(gè)任務(wù),則

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

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

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

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

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

17、細(xì)化過(guò)程。抽象與求精是一對(duì)互補(bǔ)的概念。,4.4 啟發(fā)式規(guī)則,(1) 降低模塊的耦合性,提高模塊的內(nèi)聚性。 為了提高軟件中各個(gè)模塊的獨(dú)立性,提高程序的可讀性、可測(cè)試性和可維護(hù)性,在軟件體系結(jié)構(gòu)設(shè)計(jì)時(shí)應(yīng)盡可能采用內(nèi)聚性高的模塊,如最好實(shí)現(xiàn)功能內(nèi)聚;盡量只使用數(shù)據(jù)耦合,限制公共耦合的使用,避免控制耦合的使用,杜絕內(nèi)容耦合的出現(xiàn)。,(2) 保持適中的模塊規(guī)模。 程序中模塊的規(guī)模過(guò)大,會(huì)降低程序的可讀性;而模塊規(guī)模過(guò)小,勢(shì)必會(huì)導(dǎo)致程序中的模塊數(shù)目過(guò)多,增加接口的復(fù)雜性。對(duì)于模塊的適當(dāng)規(guī)模并沒(méi)有嚴(yán)格的規(guī)定,但普遍的觀點(diǎn)是模塊中的語(yǔ)句數(shù)最好保持在10100之間。為了使模塊的規(guī)模適中,在保證模塊獨(dú)立性的前提下

18、,可對(duì)程序中規(guī)模過(guò)小的模塊進(jìn)行合并或?qū)σ?guī)模過(guò)大的模塊進(jìn)行分解。,(3) 模塊應(yīng)具有高扇入和適當(dāng)?shù)纳瘸?在模塊調(diào)用中,某個(gè)模塊的上級(jí)模塊數(shù)被稱為該模塊的扇入(如圖4.3(a)所示,模塊M的扇入數(shù)為n);而某個(gè)模塊可以調(diào)用的下級(jí)模塊數(shù)被稱為該模塊的扇出(如圖4.3(b)所示,模塊M的扇出數(shù)為k)。顯然,一個(gè)模塊的扇入表明了共有多少個(gè)模塊需要調(diào)用該模塊,而其扇出表明了該模塊可以控制的下級(jí)模塊的數(shù)目。,圖4.3 模塊的扇入和扇出 (a) 扇入;(b) 扇出,模塊的扇入越大,則說(shuō)明共享該模塊的上級(jí)模塊數(shù)越多,或者說(shuō)該模塊在程序中的重用性越高,這正是程序設(shè)計(jì)所追求的目標(biāo)之一。當(dāng)多個(gè)模塊具有一部分相同功能時(shí)

19、,應(yīng)將這部分相同的功能分離出來(lái),編寫(xiě)成獨(dú)立的模塊供需要的模塊調(diào)用。通過(guò)消除不同模塊中的重復(fù)內(nèi)容,提高代碼的可重用性,可以減少程序的總代碼量,便于程序的測(cè)試和維護(hù)。,模塊的扇出若過(guò)大,如在一個(gè)模塊中要調(diào)用八個(gè)下級(jí)模塊,則會(huì)使該模塊的調(diào)用控制過(guò)于復(fù)雜。這種現(xiàn)象發(fā)生的原因通常都是由于設(shè)計(jì)階段,模塊細(xì)化的過(guò)程中,分解速度過(guò)快造成的。最常見(jiàn)的解決辦法是通過(guò)在此模塊和下級(jí)模塊間增加一個(gè)中間層來(lái)控制模塊分解的速度。模塊的扇出過(guò)小,如扇出為1(下級(jí)模塊層中只有一個(gè)模塊),在系統(tǒng)設(shè)計(jì)中通常是不可取的。常見(jiàn)的解決方法是考慮將其合并到上級(jí)模塊中。但若合并會(huì)影響模塊的獨(dú)立性,則將其保留下來(lái)也未嘗不可。根據(jù)實(shí)踐經(jīng)驗(yàn),設(shè)

20、計(jì)良好的典型系統(tǒng)中,模塊的平均扇出通常為3或4。,可以看出:在一個(gè)好的軟件結(jié)構(gòu)中,模塊應(yīng)具有較高的扇入和適當(dāng)?shù)纳瘸?。但絕不能為了單純追求高扇入或合適的扇出而破壞了模塊的獨(dú)立性。此外,經(jīng)過(guò)對(duì)大量軟件系統(tǒng)的研究后發(fā)現(xiàn),在設(shè)計(jì)良好的軟件結(jié)構(gòu)中,通常頂層的扇出數(shù)較大,中間層的扇出數(shù)較小,底層的扇入數(shù)較大,如圖4.4所示。,圖4.4 軟件結(jié)構(gòu)圖示例,(4) 軟件結(jié)構(gòu)中的深度和寬度不宜過(guò)大。 所謂深度,是指軟件體系結(jié)構(gòu)中控制的層數(shù),它能夠粗略地反映出軟件系統(tǒng)的規(guī)模和復(fù)雜程度;所謂寬度,是指軟件體系結(jié)構(gòu)內(nèi)同一層次上模塊個(gè)數(shù)的最大值,通常寬度越大的系統(tǒng)越復(fù)雜。如圖4.6所示的軟件結(jié)構(gòu)圖中,深度為5,寬度為8。

21、深度在程序中表現(xiàn)為模塊的嵌套調(diào)用,嵌套的層數(shù)越多,程序就越復(fù)雜。模塊可以調(diào)用的下級(jí)模塊數(shù)越多,軟件結(jié)構(gòu)的寬度就越大。深度過(guò)大可通過(guò)將結(jié)構(gòu)中過(guò)于簡(jiǎn)單的模塊分層與上一級(jí)模塊合并來(lái)解決;而寬度過(guò)大則可通過(guò)增加中間層來(lái)解決。顯然,軟件結(jié)構(gòu)中的深度和寬度是相互對(duì)立的兩個(gè)方面,降低深度會(huì)引起寬度的增加,而降低寬度又會(huì)帶來(lái)深度的增加。,(5) 模塊的作用域應(yīng)處于其控制域范圍之內(nèi)。 模塊的作用域是指受該模塊內(nèi)一個(gè)判定條件影響的所有模塊范圍。模塊的控制域是指該模塊本身以及所有該模塊的下屬模塊(包括該模塊可以直接調(diào)用的下級(jí)模塊和可以間接調(diào)用的更下層的模塊)。例如,在圖4.5中,模塊C的控制域?yàn)槟KC、E和F;若在

22、模塊C中存在一個(gè)對(duì)模塊D、E和F均有影響的判定條件,即模塊C的作用域?yàn)槟KC、D、E和F(圖中帶陰影的模塊),則顯然模塊C的作用域超出了其作用域。由于模塊D在模塊C的作用域中,因此模塊C對(duì)模塊D的控制信息必然要通過(guò)上級(jí)模塊B進(jìn)行傳遞,這樣不但會(huì)增加模塊間的耦合性,而且會(huì)給模塊的維護(hù)和修改帶來(lái)麻煩(若要修改模塊C,可能會(huì)對(duì)不在它控制域中的模塊D造成影響)。因此,軟件設(shè)計(jì)時(shí)應(yīng)使各個(gè)模塊的作用域處于其控制域范圍之內(nèi)。若發(fā)現(xiàn)不符合此設(shè)計(jì)原則的模塊,可通過(guò)下面的方法進(jìn)行改進(jìn):, 將判定位置上移。如將圖4.7中的模塊C中的判定條件上移到上級(jí)模塊B中或?qū)⒛KC整個(gè)合并到模塊B中。 將超出作用域的模塊下移。如

23、將圖4.5中的模塊D移至模塊C的下一層上,使模塊D處于模塊C的控制域中。,圖4.5 模塊的作用域和控制域,(6) 盡量降低模塊的接口復(fù)雜度。 由于復(fù)雜的模塊接口是導(dǎo)致軟件出現(xiàn)錯(cuò)誤的主要原因之一,因此在軟件設(shè)計(jì)中應(yīng)盡量使模塊接口簡(jiǎn)單清晰,如減少接口傳送的信息個(gè)數(shù)以及確保實(shí)參和形參的一致性和對(duì)應(yīng)性等。降低模塊的接口復(fù)雜度,可以提高軟件的可讀性,減少出現(xiàn)錯(cuò)誤的可能性,并有利于軟件的測(cè)試和維護(hù)。 (7)設(shè)計(jì)單入口單出口模塊 (8)模塊功能應(yīng)該可以預(yù)測(cè),4.5.1 描述軟件結(jié)構(gòu)用的圖形工具 1. HIPO圖 HIPO(Hierarchy Plus Input/Processing/Output)圖是IB

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

25、如下圖所示。,圖4.6 工資計(jì)算系統(tǒng)的H圖,2) IPO圖 IPO圖能夠方便、清晰地描繪出模塊的輸入數(shù)據(jù)、加工和輸出數(shù)據(jù)之間的關(guān)系。與層次圖中每個(gè)矩形框相對(duì)應(yīng),應(yīng)該有一張IPO圖描述該矩形框所代表的模塊的具體處理過(guò)程,作為對(duì)層次圖中內(nèi)容的補(bǔ)充說(shuō)明。IPO圖的基本形式為:在圖中左邊的框中列出模塊涉及的所有輸入數(shù)據(jù),在中間的框中列出主要的加工,在右邊的框中列出處理后產(chǎn)生的輸出數(shù)據(jù);圖中的箭頭用于指明輸入數(shù)據(jù)、加工和輸出結(jié)果之間的關(guān)系。工資計(jì)算系統(tǒng)中的計(jì)算工資模塊的IPO圖如圖4.7所示。,圖4.7 計(jì)算工資模塊的IPO圖,2. 結(jié)構(gòu)圖 在軟件工程中,軟件結(jié)構(gòu)經(jīng)常采用20世紀(jì)70年代中期由Yourd

26、on等人提出的結(jié)構(gòu)圖(SC,Structure Chart)這種圖形工具來(lái)表示。結(jié)構(gòu)圖能夠描述出軟件系統(tǒng)的模塊層次結(jié)構(gòu),清楚地反映出程序中各模塊之間的調(diào)用關(guān)系和聯(lián)系。結(jié)構(gòu)圖中的基本符號(hào)及其含義見(jiàn)表。,表4.1 結(jié)構(gòu)圖中的基本符號(hào),4.5.2 面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計(jì)方法,1、數(shù)據(jù)流圖的類型 面向數(shù)據(jù)流的體系設(shè)計(jì)方法能夠方便地將需求分析階段生成的數(shù)據(jù)流圖轉(zhuǎn)換成設(shè)計(jì)階段所需的軟件結(jié)構(gòu)。但對(duì)于不同類型的數(shù)據(jù)流圖,轉(zhuǎn)換得到的軟件結(jié)構(gòu)也不同,因此有必要首先研究一下數(shù)據(jù)流圖的典型形式。根據(jù)數(shù)據(jù)流圖的結(jié)構(gòu)特點(diǎn)通??蓪?shù)據(jù)流圖劃分為如下兩個(gè)基本類型。,(1)變換型數(shù)據(jù)流圖 變換型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點(diǎn)為:由

27、(邏輯)輸入、變換中心和(邏輯)輸出三部分組成,如圖4.8所示。該類型數(shù)據(jù)流圖所描述的加工過(guò)程為:首先,外部數(shù)據(jù)沿邏輯輸入路徑進(jìn)入系統(tǒng),同時(shí)數(shù)據(jù)的形式由外部形式轉(zhuǎn)化為內(nèi)部形式;接著,數(shù)據(jù)被送往變換中心進(jìn)行加工處理;最后,經(jīng)過(guò)加工得到的結(jié)果數(shù)據(jù)的內(nèi)部形式被轉(zhuǎn)換為外部形式并沿邏輯輸出路徑離開(kāi)系統(tǒng)??梢钥闯觯儞Q型數(shù)據(jù)流圖反映的是一個(gè)順序結(jié)構(gòu)的加工過(guò)程。,圖4.8 變換型數(shù)據(jù)流圖的基本模型,(2)事務(wù)型數(shù)據(jù)流圖 原則上,所有基本系統(tǒng)模型都屬于變換型,但其中有一類具有特殊形態(tài)的數(shù)據(jù)流圖又被單獨(dú)劃分為事務(wù)型。事務(wù)型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點(diǎn)為:輸入流在經(jīng)過(guò)某個(gè)被稱為“事務(wù)中心”的加工時(shí)被分離為多個(gè)發(fā)散的輸

28、出流,形成多個(gè)平行的加工處理路徑,如圖4.9所示。該類型數(shù)據(jù)流圖所描述的加工過(guò)程為:外部數(shù)據(jù)沿輸入通路進(jìn)入系統(tǒng)后,被送往事務(wù)中心;事務(wù)中心接收輸入數(shù)據(jù)并分析確定其類型;最后根據(jù)所確定的類型為數(shù)據(jù)選擇其中的一條加工路徑。,圖4.9 事務(wù)型數(shù)據(jù)流圖的基本模型,2、面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計(jì)過(guò)程 運(yùn)用面向數(shù)據(jù)流的方法進(jìn)行軟件體系結(jié)構(gòu)的設(shè)計(jì)時(shí),應(yīng)該首先對(duì)需求分析階段得到的數(shù)據(jù)流圖進(jìn)行復(fù)查,必要時(shí)進(jìn)行修改和精化;接著在仔細(xì)分析系統(tǒng)數(shù)據(jù)流圖的基礎(chǔ)上,確定數(shù)據(jù)流圖的類型,并按照相應(yīng)的設(shè)計(jì)步驟將數(shù)據(jù)流圖轉(zhuǎn)化為軟件結(jié)構(gòu);最后還要根據(jù)體系結(jié)構(gòu)設(shè)計(jì)的原則對(duì)得到的軟件結(jié)構(gòu)進(jìn)行優(yōu)化和改進(jìn)。面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)過(guò)程如圖

29、4.10所示。,圖4.10 面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)過(guò)程,一般來(lái)說(shuō),大多數(shù)系統(tǒng)的加工問(wèn)題被表示為變換型,可采用變換分析設(shè)計(jì)方法建立系統(tǒng)的軟件結(jié)構(gòu),但當(dāng)數(shù)據(jù)流圖具有明顯的事務(wù)特點(diǎn)時(shí),則應(yīng)采用事務(wù)分析技術(shù)進(jìn)行處理。變換分析設(shè)計(jì)方法與事務(wù)分析設(shè)計(jì)方法類似,都遵循圖4.10所示的設(shè)計(jì)過(guò)程,主要差別僅在于由數(shù)據(jù)流圖向軟件結(jié)構(gòu)的映射方法不同。對(duì)于一個(gè)復(fù)雜的系統(tǒng),數(shù)據(jù)流圖中可能既存在變換流又存在事務(wù)流,這時(shí)應(yīng)當(dāng)根據(jù)數(shù)據(jù)流圖的主要處理功能,選擇一個(gè)面向全局的、涉及整個(gè)軟件系統(tǒng)的總體類型,映射得到系統(tǒng)的整體軟件結(jié)構(gòu)。此外,再對(duì)局部范圍內(nèi)的數(shù)據(jù)流圖進(jìn)行具體研究,確定它們各自的類型并分別處理,得到系統(tǒng)的局部軟件結(jié)構(gòu)

30、。,(1)變換分析設(shè)計(jì) 對(duì)于變換型的數(shù)據(jù)流圖,應(yīng)按照變換分析設(shè)計(jì)的方法建立系統(tǒng)的結(jié)構(gòu)圖。下面以圖4.11所示的工資計(jì)算系統(tǒng)數(shù)據(jù)流圖為例來(lái)介紹變換分析建立軟件結(jié)構(gòu)的具體步驟。,A 劃分邊界,區(qū)分系統(tǒng)的輸入、變換中心和輸出部分。 變換中心在圖中往往是多股數(shù)據(jù)流匯集的地方,經(jīng)驗(yàn)豐富的設(shè)計(jì)人員通??筛鶕?jù)其特征直接確定系統(tǒng)的變換中心。另外,下述方法可幫助設(shè)計(jì)人員確定系統(tǒng)的輸入和輸出:從數(shù)據(jù)流圖的物理輸入端出發(fā),沿著數(shù)據(jù)流方向逐步向系統(tǒng)內(nèi)部移動(dòng),直至遇到不能被看作是系統(tǒng)輸入的數(shù)據(jù)流為止,則此數(shù)據(jù)流之前的部分即為系統(tǒng)的輸入;同理,從數(shù)據(jù)流圖的物理輸出端出發(fā),逆著數(shù)據(jù)流方向逐步向系統(tǒng)內(nèi)部移動(dòng),直至遇到不能被看

31、作是系統(tǒng)輸出的數(shù)據(jù)流為止,則該數(shù)據(jù)流之后的部分即為系統(tǒng)的輸出;夾在輸入和輸出之間的部分就是系統(tǒng)的變換中心。,圖4.11 進(jìn)行了邊界劃分的工資計(jì)算系統(tǒng)數(shù)據(jù)流圖,B 完成第一級(jí)分解,設(shè)計(jì)系統(tǒng)的上層模塊。 這一步主要是確定軟件結(jié)構(gòu)的頂層和第一層。任何系統(tǒng)的頂層都只含一個(gè)用于控制的主模塊。變換型數(shù)據(jù)流圖對(duì)應(yīng)的軟件結(jié)構(gòu)的第一層一般由輸入、變換和輸出三種模塊組成。系統(tǒng)中的每個(gè)邏輯輸入對(duì)應(yīng)一個(gè)輸入模塊,完成為主模塊提供數(shù)據(jù)的功能;每一個(gè)邏輯輸出對(duì)應(yīng)一個(gè)輸出模塊,完成為主模塊輸出數(shù)據(jù)的功能;變換中心對(duì)應(yīng)一個(gè)變換模塊,完成將系統(tǒng)的邏輯輸入轉(zhuǎn)換為邏輯輸出的功能。工資計(jì)算系統(tǒng)的一級(jí)分解結(jié)果如圖4.12所示。,圖4.

32、12 工資計(jì)算系統(tǒng)的一級(jí)分解,C 完成第二級(jí)分解,設(shè)計(jì)輸入、變換中心和輸出部分的中、下層模塊。 這一步主要是對(duì)上一步確定的軟件結(jié)構(gòu)進(jìn)行逐層細(xì)化,為每一個(gè)輸入、輸出模塊及變換模塊設(shè)計(jì)下屬模塊。通常,一個(gè)輸入模塊應(yīng)包括用于接收數(shù)據(jù)和轉(zhuǎn)換數(shù)據(jù)(將接收的數(shù)據(jù)轉(zhuǎn)換成下級(jí)模塊所需的形式)的兩個(gè)下屬模塊;一個(gè)輸出模塊應(yīng)包括用于轉(zhuǎn)換數(shù)據(jù)(將上級(jí)模塊的處理結(jié)果轉(zhuǎn)換成輸出所需的形式)和傳出數(shù)據(jù)的兩個(gè)下屬模塊;變換模塊的分解一般應(yīng)根據(jù)變換中心的組成情況及模塊分解的原則來(lái)確定下屬模塊。完成二級(jí)分解后,工資計(jì)算系統(tǒng)的軟件結(jié)構(gòu)如圖4.13所示。,圖4.13 完成二級(jí)分解后的工資計(jì)算系統(tǒng)軟件結(jié)構(gòu),(2)事務(wù)分析設(shè)計(jì),圖4.14 進(jìn)行了邊界劃分的事務(wù)型數(shù)據(jù)流圖,A 劃分邊界,明確數(shù)據(jù)流圖中的接收路徑、事務(wù)中心和加工路徑。 事務(wù)中心在數(shù)據(jù)流圖中位于多條加工路徑的起點(diǎn),經(jīng)過(guò)事務(wù)中心的數(shù)據(jù)流被分解為多個(gè)發(fā)散的數(shù)

溫馨提示

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