版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章結(jié)構(gòu)化軟件設(shè)計(jì)
4.1軟件設(shè)計(jì)中的基本概念和原理4.2體系結(jié)構(gòu)設(shè)計(jì)概述4.3面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)方法4.4詳細(xì)設(shè)計(jì)概述4.5面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法4.6面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法4.7小結(jié)第4章結(jié)構(gòu)化軟件設(shè)計(jì)4.1軟件設(shè)計(jì)中的基本概念和原14.1軟件設(shè)計(jì)中的基本概念和原理
1.模塊化所謂模塊,是指具有相對(duì)獨(dú)立性的,由數(shù)據(jù)說(shuō)明、執(zhí)行語(yǔ)句等程序?qū)ο髽?gòu)成的集合。程序中的每個(gè)模塊都需要單獨(dú)命名,通過(guò)名字可實(shí)現(xiàn)對(duì)指定模塊的訪(fǎng)問(wèn)。在高級(jí)語(yǔ)言中,模塊具體表現(xiàn)為函數(shù)、子程序、過(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)部特征。4.1軟件設(shè)計(jì)中的基本概念和原理1.模塊化2模塊化是指將整個(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)行以下推理。首先,我們?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所需的工作量大。模塊化是指將整個(gè)程序劃分為若干個(gè)模塊,每個(gè)模塊用于實(shí)3在人們解決問(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è)擊破,所需要的工作量小于直接解決復(fù)雜問(wèn)題所需的工作量。在人們解決問(wèn)題的過(guò)程中,發(fā)現(xiàn)存在有另一個(gè)有趣的規(guī)律4根據(jù)上面的推理,我們可以得到這樣一個(gè)結(jié)論,模塊化可以降低解決問(wèn)題的復(fù)雜度,從而降低軟件開(kāi)發(fā)的工作量。但是不是模塊劃分得越多越好呢?雖然增加程序中的模塊數(shù)可以降低開(kāi)發(fā)每個(gè)模塊的工作量,但同時(shí)卻增加了設(shè)計(jì)模塊接口的工作量。通過(guò)圖5.1所示的模塊數(shù)與軟件開(kāi)發(fā)成本的關(guān)系圖中可以看出,當(dāng)劃分的模塊數(shù)處于最小成本區(qū)時(shí),開(kāi)發(fā)軟件的總成本最低。雖然目前還不能得到模塊數(shù)M的精確取值,但總成本曲線(xiàn)對(duì)我們進(jìn)行模塊劃分具有重要的指導(dǎo)意義。模塊化不但可以降低軟件開(kāi)發(fā)的難度,而且可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性。此外,模塊化還有利于提高代碼的可重用性及團(tuán)隊(duì)合作開(kāi)發(fā)大型軟件的可行性。根據(jù)上面的推理,我們可以得到這樣一個(gè)結(jié)論,模塊化可以5圖4.1模塊數(shù)與軟件開(kāi)發(fā)成本圖4.1模塊數(shù)與軟件開(kāi)發(fā)成本6
2.抽象抽象是人類(lèi)在解決復(fù)雜問(wèn)題時(shí)經(jīng)常采用的一種思維方式,它是指將現(xiàn)實(shí)世界中具有共性的一類(lèi)事物的相似的、本質(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ò)程中從問(wèn)題定義到最終的軟件生成,每一階段都是在前一階段基礎(chǔ)上對(duì)軟件解法的抽象層上的一次求精和細(xì)化。2.抽象7結(jié)構(gòu)化程序中自頂向下、逐步求精的模塊劃分思想正是人類(lèi)思維中運(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)用抽象的方法還能夠提高代碼的可重用性。結(jié)構(gòu)化程序中自頂向下、逐步求精的模塊劃分思想正是人類(lèi)思維8
3.信息隱蔽信息隱蔽是指一個(gè)模塊將自身的內(nèi)部信息向其他模塊隱藏起來(lái),以避免其他模塊不恰當(dāng)?shù)脑L(fǎng)問(wèn)和修改,只有對(duì)那些為了完成系統(tǒng)功能所必須的數(shù)據(jù)交換才被允許在模塊間進(jìn)行。信息隱蔽的目的主要是為了提高模塊的獨(dú)立性,減少將一個(gè)模塊中的錯(cuò)誤擴(kuò)散到其他模塊的機(jī)會(huì)。但是需要強(qiáng)調(diào)一點(diǎn),信息隱蔽并不意味著某個(gè)模塊中的內(nèi)部信息對(duì)其他模塊來(lái)說(shuō)是完全不可見(jiàn)或不能使用的,而是說(shuō)模塊之間的信息傳遞只能通過(guò)合法的調(diào)用接口來(lái)實(shí)現(xiàn)。顯然,信息隱蔽對(duì)提高軟件的可讀性和可維護(hù)性都是非常重要的。3.信息隱蔽9
4.模塊獨(dú)立性1)耦合性耦合性是對(duì)一個(gè)軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系緊密程度的度量指標(biāo)。模塊間的聯(lián)系越緊密,耦合性就越高,模塊的獨(dú)立性也就越低。由于模塊間的聯(lián)系是通過(guò)模塊接口實(shí)現(xiàn)的,因此,模塊耦合性的高低主要取決于模塊接口的復(fù)雜程度、調(diào)用模塊的方式以及通過(guò)模塊接口的數(shù)據(jù)。模塊間的耦合性主要可劃分為如下幾種類(lèi)型。4.模塊獨(dú)立性10(1)數(shù)據(jù)耦合。若兩個(gè)模塊之間僅通過(guò)模塊參數(shù)交換信息,且交換的信息全部為簡(jiǎn)單數(shù)據(jù),則稱(chēng)這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)據(jù)耦合。數(shù)據(jù)耦合的例子如下所示:(1)數(shù)據(jù)耦合。若兩個(gè)模塊之間僅通過(guò)模塊參數(shù)交換信11sum(inta,intb){intc;c=a+b;return(c);}main(){intx,y;
printf("x+y=%d",sum(x,y));}/*主函數(shù)與sum函數(shù)之間即為數(shù)據(jù)耦合關(guān)系*/…sum(inta,intb)…12(2)公共耦合。若兩個(gè)或多個(gè)模塊通過(guò)引用公共數(shù)據(jù)相互聯(lián)系,則稱(chēng)這種耦合為公共耦合。例如,在程序中定義了全局變量,并在多個(gè)模塊中對(duì)全局變量進(jìn)行了引用,則引用全局變量的多個(gè)模塊間就具有了公共耦合關(guān)系。FORTRAN語(yǔ)言中使用的common語(yǔ)句也會(huì)在多個(gè)模塊間建立公共耦合關(guān)系。公共耦合的復(fù)雜度隨著耦合的模塊個(gè)數(shù)的增加而顯著增加。在程序設(shè)計(jì)中,若兩個(gè)模塊間需要交換的數(shù)據(jù)較多,僅通過(guò)參數(shù)傳遞難以實(shí)現(xiàn)時(shí),可以考慮采用公共耦合完成,但一定注意盡量降低公共耦合的程度。(2)公共耦合。若兩個(gè)或多個(gè)模塊通過(guò)引用公共數(shù)據(jù)相13(3)控制耦合。若模塊之間交換的信息中包含有控制信息(盡管有時(shí)控制信息是以數(shù)據(jù)的形式出現(xiàn)的),則稱(chēng)這種耦合為控制耦合??刂岂詈鲜侵械瘸潭鹊鸟詈?,它會(huì)增加程序的復(fù)雜性??刂岂詈系睦尤缦滤荆簐oidoutput(flag){if(flag)printf("OK!");elseprintf("NO!");}main(){intflag;output(flag);}/*主函數(shù)與output函數(shù)之間即為控制耦合關(guān)系*/…(3)控制耦合。若模塊之間交換的信息中包含有控制14(4)內(nèi)容耦合。若一個(gè)模塊對(duì)另一模塊中的內(nèi)容(包括數(shù)據(jù)和程序段)進(jìn)行了直接的引用甚至修改,或通過(guò)非正常入口進(jìn)入到另一模塊內(nèi)部,或一個(gè)模塊具有多個(gè)入口,或兩個(gè)模塊共享一部分代碼,則稱(chēng)模塊間的這種耦合為內(nèi)容耦合。內(nèi)容耦合是所有耦合關(guān)系中程度最高的,會(huì)使因模塊間的聯(lián)系過(guò)于緊密而對(duì)后期的開(kāi)發(fā)和維護(hù)工作帶來(lái)很大的麻煩,因此,應(yīng)堅(jiān)決避免任何形式的內(nèi)容耦合。實(shí)際上,許多高級(jí)程序設(shè)計(jì)語(yǔ)言在設(shè)計(jì)時(shí)就充分考慮到了內(nèi)容耦合的危害,因而在規(guī)定語(yǔ)法時(shí)就已經(jīng)杜絕了任何形式的內(nèi)容耦合。耦合是影響軟件復(fù)雜度的一個(gè)重要因素,設(shè)計(jì)過(guò)程中應(yīng)力求降低程序的耦合性。在以上所介紹的耦合中,數(shù)據(jù)耦合的程度最低,其次是公共耦合,再其次是控制耦合,程度最高的是內(nèi)容耦合。(4)內(nèi)容耦合。若一個(gè)模塊對(duì)另一模塊中的內(nèi)容(包括152)內(nèi)聚性?xún)?nèi)聚性是對(duì)一個(gè)模塊內(nèi)部各個(gè)組成元素之間相互結(jié)合的緊密程度的度量指標(biāo)。模塊中組成元素結(jié)合的越緊密,模塊的內(nèi)聚性就越高,模塊的獨(dú)立性也就越高。理想的內(nèi)聚性要求模塊的功能應(yīng)明確、單一,即一個(gè)模塊只做一件事情。模塊的內(nèi)聚性和耦合性是兩個(gè)相互對(duì)立且又密切相關(guān)的概念。事實(shí)上,它們是同一事物的兩個(gè)方面,模塊的高內(nèi)聚性往往就意味著模塊間的低耦合性。因?yàn)槌绦蛑械母鱾€(gè)部分必定是有聯(lián)系的,若將其中密切相關(guān)的部分放在同一個(gè)模塊中,模塊間的聯(lián)系就會(huì)降低;反之,若將密切相關(guān)的部分分散放在不同的模塊之中,模塊間的聯(lián)系必然會(huì)加強(qiáng)。在進(jìn)行模塊化設(shè)計(jì)時(shí),耦合性和內(nèi)聚性都是必須考慮的重要指標(biāo)。但經(jīng)實(shí)踐證明,保證模塊的高內(nèi)聚性比低耦合性更為重要,在軟件設(shè)計(jì)時(shí)應(yīng)將更多的注意力集中在提高模塊的內(nèi)聚性上。2)內(nèi)聚性16(1)偶然內(nèi)聚。若一個(gè)模塊由多個(gè)完成不同任務(wù)的語(yǔ)句段組成,各語(yǔ)句段之間的聯(lián)系十分松散或根本沒(méi)有任何聯(lián)系,則稱(chēng)此模塊的內(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)系,因此難于理解和修改,會(huì)給軟件開(kāi)發(fā)帶來(lái)很大的困擾。事實(shí)上,偶然內(nèi)聚的模塊出錯(cuò)的機(jī)率要比其他類(lèi)型的模塊大得多。偶然內(nèi)聚是內(nèi)聚程度最低的一種,在軟件設(shè)計(jì)時(shí)應(yīng)盡量避免。(1)偶然內(nèi)聚。若一個(gè)模塊由多個(gè)完成不同任務(wù)的語(yǔ)句17(2)邏輯內(nèi)聚。若一個(gè)模塊可實(shí)現(xiàn)多個(gè)邏輯上相同或相似的一類(lèi)功能,則稱(chēng)該模塊的內(nèi)聚為邏輯內(nèi)聚。例如,將程序中多種不同類(lè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ú)立性。(2)邏輯內(nèi)聚。若一個(gè)模塊可實(shí)現(xiàn)多個(gè)邏輯上相同或相18(3)時(shí)間內(nèi)聚。若一個(gè)模塊包含了需要在同一時(shí)間段中執(zhí)行的多個(gè)任務(wù),則稱(chēng)該模塊的內(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ì)造成耦合性的增加。(3)時(shí)間內(nèi)聚。若一個(gè)模塊包含了需要在同一時(shí)間段中19(4)過(guò)程內(nèi)聚。若一個(gè)模塊中的各個(gè)部分相關(guān),并且必須按特定的次序執(zhí)行,則稱(chēng)該模塊的內(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ù),則稱(chēng)該模塊的內(nèi)聚為通信內(nèi)聚。由于通信內(nèi)聚模塊中的各個(gè)部分都與某個(gè)共同的數(shù)據(jù)密切相關(guān),因此內(nèi)聚性高于前幾種內(nèi)聚。(4)過(guò)程內(nèi)聚。若一個(gè)模塊中的各個(gè)部分相關(guān),并且必20(6)順序內(nèi)聚。若一個(gè)模塊中的各個(gè)部分都與同一個(gè)功能密切相關(guān),并且必須按照先后順序執(zhí)行(通常前一個(gè)部分的輸出數(shù)據(jù)就是后一個(gè)部分的輸入數(shù)據(jù)),則稱(chēng)該模塊的內(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)聚程度很高且易于理解。(6)順序內(nèi)聚。若一個(gè)模塊中的各個(gè)部分都與同一個(gè)功能21(7)功能內(nèi)聚。若一個(gè)模塊中各個(gè)組成部分構(gòu)成一個(gè)整體并共同完成一個(gè)單一的功能,則稱(chēng)該模塊的內(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所示。(7)功能內(nèi)聚。若一個(gè)模塊中各個(gè)組成部分構(gòu)成一個(gè)整22圖4.2內(nèi)聚性的排列圖4.2內(nèi)聚性的排列234.2體系結(jié)構(gòu)設(shè)計(jì)概述4.2.1體系結(jié)構(gòu)設(shè)計(jì)的任務(wù)在體系結(jié)構(gòu)設(shè)計(jì)過(guò)程中,首先要根據(jù)需求分析階段產(chǎn)生的成果尋求實(shí)現(xiàn)目標(biāo)系統(tǒng)的各種可能的方案,然后由系統(tǒng)分析員對(duì)所有可能的方案進(jìn)行綜合分析比較,從中選擇出一個(gè)最佳方案向用戶(hù)推薦。在與用戶(hù)達(dá)成共識(shí)之后,系統(tǒng)分析員就可以著手對(duì)選擇出的最佳方案進(jìn)行體系結(jié)構(gòu)的設(shè)計(jì),并為軟件確定數(shù)據(jù)結(jié)構(gòu)及設(shè)計(jì)數(shù)據(jù)庫(kù)。體系結(jié)構(gòu)設(shè)計(jì)階段結(jié)束時(shí),系統(tǒng)分析員需要提交軟件的體系結(jié)構(gòu)說(shuō)明書(shū)并參加該階段的評(píng)審。體系結(jié)構(gòu)設(shè)計(jì)的主要任務(wù)有如下四點(diǎn)。4.2體系結(jié)構(gòu)設(shè)計(jì)概述4.2.1體系結(jié)構(gòu)設(shè)計(jì)的任務(wù)24
1.軟件體系結(jié)構(gòu)設(shè)計(jì)設(shè)計(jì)軟件的體系結(jié)構(gòu)需要在對(duì)需求分析階段生成的數(shù)據(jù)流圖進(jìn)一步分析和精化的基礎(chǔ)上,首先將系統(tǒng)按照功能劃分為模塊,接著需要確定模塊之間的調(diào)用關(guān)系及其接口,最后還應(yīng)該對(duì)劃分的結(jié)果進(jìn)行優(yōu)化和調(diào)整。良好的軟件結(jié)構(gòu)設(shè)計(jì)對(duì)詳細(xì)設(shè)計(jì)及編碼階段的工作都是至關(guān)重要的。1.軟件體系結(jié)構(gòu)設(shè)計(jì)25
2.數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)設(shè)計(jì)體系結(jié)構(gòu)設(shè)計(jì)中應(yīng)對(duì)需求分析階段所生成的數(shù)據(jù)字典加以細(xì)化,從計(jì)算機(jī)技術(shù)實(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ù)庫(kù)建立了概念數(shù)據(jù)模型(最常采用的是E-R模型)。體系結(jié)構(gòu)設(shè)計(jì)階段需要將原本獨(dú)立于數(shù)據(jù)庫(kù)實(shí)現(xiàn)的概念模型與具體的數(shù)據(jù)庫(kù)管理系統(tǒng)的特征結(jié)合起來(lái),建立數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),主要包括確定數(shù)據(jù)庫(kù)的模式、子模式及對(duì)數(shù)據(jù)庫(kù)進(jìn)行規(guī)范和優(yōu)化等。2.數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫(kù)設(shè)計(jì)26
3.系統(tǒng)可靠性、安全性設(shè)計(jì)可靠性設(shè)計(jì)也稱(chēng)為質(zhì)量設(shè)計(jì),目的是為了保證程序及其文檔具有較高的正確性和容錯(cuò)性,并對(duì)可能出現(xiàn)的錯(cuò)誤易于修改和維護(hù)。安全性設(shè)計(jì)的主要目的是為了增強(qiáng)系統(tǒng)的自我防護(hù)能力和運(yùn)行的穩(wěn)定性,防止系統(tǒng)遭受到有意或無(wú)意地入侵和破壞,保證系統(tǒng)在安全的環(huán)境下正常地工作。3.系統(tǒng)可靠性、安全性設(shè)計(jì)27
4.編寫(xiě)文檔,參加復(fù)審體系結(jié)構(gòu)設(shè)計(jì)階段應(yīng)交付的文檔通常包括:體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)、用戶(hù)手冊(cè)、數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū)及系統(tǒng)初步測(cè)試計(jì)劃。(1)體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū):給出系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)的結(jié)果,為系統(tǒng)的詳細(xì)設(shè)計(jì)提供基礎(chǔ)。(2)用戶(hù)手冊(cè):根據(jù)體系結(jié)構(gòu)設(shè)計(jì)成果,對(duì)需求分析階段編寫(xiě)的用戶(hù)手冊(cè)進(jìn)行補(bǔ)充和修改。(3)測(cè)試計(jì)劃:明確測(cè)試中應(yīng)采用的策略、方案、預(yù)期的測(cè)試結(jié)果及測(cè)試的進(jìn)度安排。4.編寫(xiě)文檔,參加復(fù)審28(4)數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū):主要用于給出目標(biāo)系統(tǒng)中數(shù)據(jù)庫(kù)管理系統(tǒng)的選擇及邏輯結(jié)構(gòu)等的設(shè)計(jì)結(jié)果。體系結(jié)構(gòu)設(shè)計(jì)階段復(fù)審的重點(diǎn)主要是系統(tǒng)的總體結(jié)構(gòu)、模塊劃分和內(nèi)/外接口等方面,復(fù)審的對(duì)象就是該階段的設(shè)計(jì)文檔。由于體系結(jié)構(gòu)設(shè)計(jì)中的微小失誤可能會(huì)導(dǎo)致軟件開(kāi)發(fā)中的重大問(wèn)題,因此復(fù)審一定要按嚴(yán)格的步驟,通過(guò)正式會(huì)議的方式進(jìn)行,爭(zhēng)取盡可能地及早發(fā)現(xiàn)設(shè)計(jì)中的缺陷和錯(cuò)誤。除軟件開(kāi)發(fā)人員以外,體系結(jié)構(gòu)設(shè)計(jì)復(fù)審必須有用戶(hù)參加,必要時(shí)還可以邀請(qǐng)相關(guān)領(lǐng)域的專(zhuān)家參加會(huì)議。(4)數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū):主要用于給出目標(biāo)系統(tǒng)中數(shù)據(jù)294.2.2體系結(jié)構(gòu)設(shè)計(jì)中可采用的工具1.HIPO圖HIPO(HierarchyPlusInput/Processing/Output)圖是IBM公司在20世紀(jì)70年代發(fā)展起來(lái)的用于描述軟件結(jié)構(gòu)的圖形工具。它實(shí)質(zhì)上是在描述軟件總體模塊結(jié)構(gòu)的層次圖(H圖)的基礎(chǔ)上,加入了用于描述每個(gè)模塊輸入/輸出數(shù)據(jù)和處理功能的IPO圖,因此它的中文全名為層次圖加輸入/處理/輸出圖。4.2.2體系結(jié)構(gòu)設(shè)計(jì)中可采用的工具301)HIPO圖中的H圖H圖用于在體系結(jié)構(gòu)設(shè)計(jì)過(guò)程中描繪軟件的層次結(jié)構(gòu)。在H圖中,每一個(gè)矩形框代表一個(gè)模塊,圖中最頂層的矩形框表示系統(tǒng)中的主控模塊,矩形框之間的連線(xiàn)用于表示模塊之間的調(diào)用關(guān)系。為了使H圖更具有可追蹤性,可以為除頂層矩形框以外的其他矩形框加上能反映層次關(guān)系的編號(hào)。H圖比較適用于自頂向下進(jìn)行分解的軟件結(jié)構(gòu)設(shè)計(jì)方法。工資計(jì)算系統(tǒng)的H圖如圖4.3所示。1)HIPO圖中的H圖31圖4.3工資計(jì)算系統(tǒng)的H圖圖4.3工資計(jì)算系統(tǒng)的H圖32
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.4所示。2)IPO圖33圖4.4計(jì)算工資模塊的IPO圖圖4.4計(jì)算工資模塊的IPO圖34
2.結(jié)構(gòu)圖在軟件工程中,軟件結(jié)構(gòu)經(jīng)常采用20世紀(jì)70年代中期由Yourdon等人提出的結(jié)構(gòu)圖(SC,StructureChart)這種圖形工具來(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。2.結(jié)構(gòu)圖35表4.1結(jié)構(gòu)圖中的基本符號(hào)ABCABC符號(hào)含義用于表示模塊,方框中標(biāo)明模塊的名稱(chēng)用于描述模塊之間的調(diào)用關(guān)系用于表示模塊調(diào)用過(guò)程中傳遞的信息,箭頭上標(biāo)明信息的名稱(chēng);箭頭尾部為空心圓表示傳遞的信息是數(shù)據(jù),若為實(shí)心圓則表示傳遞的是控制信息
表示模塊A選擇調(diào)用模塊B或模塊C表示模塊A循環(huán)調(diào)用模塊B和模塊C表4.1結(jié)構(gòu)圖中的基本符號(hào)ABCABC符號(hào)含364.2.3體系結(jié)構(gòu)設(shè)計(jì)的原則體系結(jié)構(gòu)設(shè)計(jì)的原則有如下6點(diǎn)。(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)。4.2.3體系結(jié)構(gòu)設(shè)計(jì)的原則37(2)保持適中的模塊規(guī)模。程序中模塊的規(guī)模過(guò)大,會(huì)降低程序的可讀性;而模塊規(guī)模過(guò)小,勢(shì)必會(huì)導(dǎo)致程序中的模塊數(shù)目過(guò)多,增加接口的復(fù)雜性。對(duì)于模塊的適當(dāng)規(guī)模并沒(méi)有嚴(yán)格的規(guī)定,但普遍的觀(guān)點(diǎn)是模塊中的語(yǔ)句數(shù)最好保持在10~100之間。為了使模塊的規(guī)模適中,在保證模塊獨(dú)立性的前提下,可對(duì)程序中規(guī)模過(guò)小的模塊進(jìn)行合并或?qū)σ?guī)模過(guò)大的模塊進(jìn)行分解。(2)保持適中的模塊規(guī)模。38(3)模塊應(yīng)具有高扇入和適當(dāng)?shù)纳瘸?。在模塊調(diào)用中,某個(gè)模塊的上級(jí)模塊數(shù)被稱(chēng)為該模塊的扇入(如圖4.5(a)所示,模塊M的扇入數(shù)為n);而某個(gè)模塊可以調(diào)用的下級(jí)模塊數(shù)被稱(chēng)為該模塊的扇出(如圖4.5(b)所示,模塊M的扇出數(shù)為k)。顯然,一個(gè)模塊的扇入表明了共有多少個(gè)模塊需要調(diào)用該模塊,而其扇出表明了該模塊可以控制的下級(jí)模塊的數(shù)目。(3)模塊應(yīng)具有高扇入和適當(dāng)?shù)纳瘸觥?9圖4.5模塊的扇入和扇出(a)扇入;(b)扇出圖4.5模塊的扇入和扇出40模塊的扇入越大,則說(shuō)明共享該模塊的上級(jí)模塊數(shù)越多,或者說(shuō)該模塊在程序中的重用性越高,這正是程序設(shè)計(jì)所追求的目標(biāo)之一。當(dāng)多個(gè)模塊具有一部分相同功能時(shí),應(yīng)將這部分相同的功能分離出來(lái),編寫(xiě)成獨(dú)立的模塊供需要的模塊調(diào)用。通過(guò)消除不同模塊中的重復(fù)內(nèi)容,提高代碼的可重用性,可以減少程序的總代碼量,便于程序的測(cè)試和維護(hù)。模塊的扇入越大,則說(shuō)明共享該模塊的上級(jí)模塊數(shù)越多,或41模塊的扇出若過(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è)計(jì)良好的典型系統(tǒng)中,模塊的平均扇出通常為3或4。模塊的扇出若過(guò)大,如在一個(gè)模塊中要調(diào)用八個(gè)下級(jí)模塊,42可以看出:在一個(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.6所示。可以看出:在一個(gè)好的軟件結(jié)構(gòu)中,模塊應(yīng)具有較高的扇入43圖4.6軟件結(jié)構(gòu)圖示例圖4.6軟件結(jié)構(gòu)圖示例44(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。深度在程序中表現(xiàn)為模塊的嵌套調(diào)用,嵌套的層數(shù)越多,程序就越復(fù)雜,程序的可理解性也就隨之下降。對(duì)寬度影響最大的因素是模塊的扇出,即模塊可以調(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)深度的增加。(4)軟件結(jié)構(gòu)中的深度和寬度不宜過(guò)大。45(5)模塊的作用域應(yīng)處于其控制域范圍之內(nèi)。模塊的作用域是指受該模塊內(nèi)一個(gè)判定條件影響的所有模塊范圍。模塊的控制域是指該模塊本身以及所有該模塊的下屬模塊(包括該模塊可以直接調(diào)用的下級(jí)模塊和可以間接調(diào)用的更下層的模塊)。例如,在圖4.7中,模塊C的控制域?yàn)槟KC、E和F;若在模塊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):(5)模塊的作用域應(yīng)處于其控制域范圍之內(nèi)。46①將判定位置上移。如將圖4.7中的模塊C中的判定條件上移到上級(jí)模塊B中或?qū)⒛KC整個(gè)合并到模塊B中。②將超出作用域的模塊下移。如將圖4.7中的模塊D移至模塊C的下一層上,使模塊D處于模塊C的控制域中。①將判定位置上移。如將圖4.7中的模塊C中的判定條47圖4.7模塊的作用域和控制域圖4.7模塊的作用域和控制域48(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ù)。(6)盡量降低模塊的接口復(fù)雜度。494.2.4體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)是體系結(jié)構(gòu)設(shè)計(jì)階段中最重要的技術(shù)文檔,其主要內(nèi)容應(yīng)包括:(1)引言:用于說(shuō)明編寫(xiě)本說(shuō)明書(shū)的目的、背景,定義所用到的術(shù)語(yǔ)和縮略語(yǔ),以及列出文檔中所引用的參考資料等。(2)總體設(shè)計(jì):用于說(shuō)明軟件的需求規(guī)定、運(yùn)行環(huán)境要求、處理流程及軟件體系結(jié)構(gòu)等。(3)運(yùn)行設(shè)計(jì):用于說(shuō)明軟件的運(yùn)行模塊組合、運(yùn)行控制方式及運(yùn)行時(shí)間等。4.2.4體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)50(4)模塊設(shè)計(jì):用于說(shuō)明軟件中各模塊的功能、性能及接口等。(5)數(shù)據(jù)設(shè)計(jì):用于說(shuō)明軟件系統(tǒng)所涉及的數(shù)據(jù)對(duì)象的邏輯數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)。(6)出錯(cuò)處理設(shè)計(jì):用于說(shuō)明軟件系統(tǒng)可能出現(xiàn)的各種錯(cuò)誤及可采取的處理措施。(4)模塊設(shè)計(jì):用于說(shuō)明軟件中各模塊的功能、性能及514.3面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)方法4.3.1數(shù)據(jù)流圖的類(lèi)型面向數(shù)據(jù)流的體系設(shè)計(jì)方法能夠方便地將需求分析階段生成的數(shù)據(jù)流圖轉(zhuǎn)換成設(shè)計(jì)階段所需的軟件結(jié)構(gòu)。但對(duì)于不同類(lèi)型的數(shù)據(jù)流圖,轉(zhuǎn)換得到的軟件結(jié)構(gòu)也不同,因此有必要首先研究一下數(shù)據(jù)流圖的典型形式。根據(jù)數(shù)據(jù)流圖的結(jié)構(gòu)特點(diǎn)通??蓪?shù)據(jù)流圖劃分為如下兩個(gè)基本類(lèi)型。4.3面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)方法4.3.1數(shù)據(jù)流圖52
1.變換型數(shù)據(jù)流圖變換型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點(diǎn)為:由(邏輯)輸入、變換中心和(邏輯)輸出三部分組成,如圖5.8所示。該類(lèi)型數(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)。可以看出,變換型數(shù)據(jù)流圖反映的是一個(gè)順序結(jié)構(gòu)的加工過(guò)程。1.變換型數(shù)據(jù)流圖53圖4.8變換型數(shù)據(jù)流圖的基本模型圖4.8變換型數(shù)據(jù)流圖的基本模型54
2.事務(wù)型數(shù)據(jù)流圖原則上,所有基本系統(tǒng)模型都屬于變換型,但其中有一類(lèi)具有特殊形態(tài)的數(shù)據(jù)流圖又被單獨(dú)劃分為事務(wù)型。事務(wù)型數(shù)據(jù)流圖呈現(xiàn)出的結(jié)構(gòu)特點(diǎn)為:輸入流在經(jīng)過(guò)某個(gè)被稱(chēng)為“事務(wù)中心”的加工時(shí)被分離為多個(gè)發(fā)散的輸出流,形成多個(gè)平行的加工處理路徑,如圖4.9所示。該類(lèi)型數(shù)據(jù)流圖所描述的加工過(guò)程為:外部數(shù)據(jù)沿輸入通路進(jìn)入系統(tǒng)后,被送往事務(wù)中心;事務(wù)中心接收輸入數(shù)據(jù)并分析確定其類(lèi)型;最后根據(jù)所確定的類(lèi)型為數(shù)據(jù)選擇其中的一條加工路徑。2.事務(wù)型數(shù)據(jù)流圖55圖4.9事務(wù)型數(shù)據(jù)流圖的基本模型圖4.9事務(wù)型數(shù)據(jù)流圖的基本模型564.3.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ù)流圖的類(lèi)型,并按照相應(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ò)程如圖4.10所示。4.3.2面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)過(guò)程57圖4.10面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)過(guò)程圖4.10面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)過(guò)程58一般來(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ì)方法類(lèi)似,都遵循圖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)的總體類(lèi)型,映射得到系統(tǒng)的整體軟件結(jié)構(gòu)。此外,再對(duì)局部范圍內(nèi)的數(shù)據(jù)流圖進(jìn)行具體研究,確定它們各自的類(lèi)型并分別處理,得到系統(tǒng)的局部軟件結(jié)構(gòu)。一般來(lái)說(shuō),大多數(shù)系統(tǒng)的加工問(wèn)題被表示為變換型,可采用591.變換分析設(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)的具體步驟。1.變換分析設(shè)計(jì)60(1)劃分邊界,區(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),直至遇到不能被看作是系統(tǒng)輸出的數(shù)據(jù)流為止,則該數(shù)據(jù)流之后的部分即為系統(tǒng)的輸出;夾在輸入和輸出之間的部分就是系統(tǒng)的變換中心。工資計(jì)算系統(tǒng)的數(shù)據(jù)流圖的劃分如圖4.11所示。(1)劃分邊界,區(qū)分系統(tǒng)的輸入、變換中心和輸出部分61圖4.11進(jìn)行了邊界劃分的工資計(jì)算系統(tǒng)數(shù)據(jù)流圖圖4.11進(jìn)行了邊界劃分的工資計(jì)算系統(tǒng)數(shù)據(jù)流圖62(2)完成第一級(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所示。(2)完成第一級(jí)分解,設(shè)計(jì)系統(tǒng)的上層模塊。63圖4.12工資計(jì)算系統(tǒng)的一級(jí)分解圖4.12工資計(jì)算系統(tǒng)的一級(jí)分解64(3)完成第二級(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è)下屬模塊;變換模塊的分解沒(méi)有固定的方法,一般應(yīng)根據(jù)變換中心的組成情況及模塊分解的原則來(lái)確定下屬模塊。完成二級(jí)分解后,工資計(jì)算系統(tǒng)的軟件結(jié)構(gòu)如圖4.13所示(圖中省略了模塊調(diào)用傳遞的信息)。(3)完成第二級(jí)分解,設(shè)計(jì)輸入、變換中心和輸出部分65圖4.13完成二級(jí)分解后的工資計(jì)算系統(tǒng)軟件結(jié)構(gòu)圖4.13完成二級(jí)分解后的工資計(jì)算系統(tǒng)軟件結(jié)構(gòu)662.事務(wù)分析設(shè)計(jì)圖4.14進(jìn)行了邊界劃分的事務(wù)型數(shù)據(jù)流圖2.事務(wù)分析設(shè)計(jì)圖4.14進(jìn)行了邊界劃分的事務(wù)型數(shù)據(jù)流67(1)劃分邊界,明確數(shù)據(jù)流圖中的接收路徑、事務(wù)中心和加工路徑。事務(wù)中心在數(shù)據(jù)流圖中位于多條加工路徑的起點(diǎn),經(jīng)過(guò)事務(wù)中心的數(shù)據(jù)流被分解為多個(gè)發(fā)散的數(shù)據(jù)流,根據(jù)這個(gè)特征很容易在圖中找到系統(tǒng)的事務(wù)中心。向事務(wù)中心提供數(shù)據(jù)的路徑是系統(tǒng)的接收路徑,而從事務(wù)中心引出的所有路徑都是系統(tǒng)的加工路徑,如圖4.14中對(duì)數(shù)據(jù)流圖的劃分。每條加工路徑都具有自己的結(jié)構(gòu)特征,可能為變換型,也可能為事務(wù)型。如圖4.14中,路徑1為變換型,路徑2為事務(wù)型。(1)劃分邊界,明確數(shù)據(jù)流圖中的接收路徑、事務(wù)中心68(2)建立事務(wù)型結(jié)構(gòu)的上層模塊。事務(wù)型流圖對(duì)應(yīng)的軟件結(jié)構(gòu)的頂層只有一個(gè)由事務(wù)中心映射得到的總控模塊;總控模塊有兩個(gè)下級(jí)模塊,分別是由接收路徑映射得到的接收模塊和由全部加工路徑映射得到的調(diào)度模塊。接收模塊負(fù)責(zé)接收系統(tǒng)處理所需的數(shù)據(jù),調(diào)度模塊負(fù)責(zé)控制下層的所有加工模塊。兩個(gè)模塊共同構(gòu)成了事務(wù)型軟件結(jié)構(gòu)的第一層。圖4.14中,事務(wù)型數(shù)據(jù)流圖映射得到的上層軟件結(jié)構(gòu)如圖4.15所示。(2)建立事務(wù)型結(jié)構(gòu)的上層模塊。69圖4.15圖4.1570(3)分解、細(xì)化接收路徑和加工路徑,得到事務(wù)型結(jié)構(gòu)的下層模塊。由于接收路徑通常都具有變換型的特性,因此對(duì)事務(wù)型結(jié)構(gòu)接收模塊的分解方法與對(duì)變換型結(jié)構(gòu)輸入模塊的分解方法相同。對(duì)加工路徑的分解應(yīng)按照每一條路徑本身的結(jié)構(gòu)特征,分別采用變換分析或事務(wù)分析方法進(jìn)行分解。經(jīng)過(guò)分解后得到的完整的事務(wù)型軟件結(jié)構(gòu)如圖4.16所示。(3)分解、細(xì)化接收路徑和加工路徑,得到事務(wù)型結(jié)構(gòu)71圖4.16完整的事務(wù)型軟件結(jié)構(gòu)圖4.16完整的事務(wù)型軟件結(jié)構(gòu)72
3.軟件結(jié)構(gòu)的改進(jìn)和優(yōu)化為了使最終生成的軟件系統(tǒng)具有良好的風(fēng)格及較高的效率,應(yīng)在軟件的早期設(shè)計(jì)階段盡量地對(duì)軟件結(jié)構(gòu)進(jìn)行優(yōu)化。因此在建立軟件結(jié)構(gòu)后,軟件設(shè)計(jì)人員需要按照體系結(jié)構(gòu)設(shè)計(jì)的基本原則對(duì)其進(jìn)行必要的改進(jìn)和調(diào)整。軟件結(jié)構(gòu)的優(yōu)化應(yīng)該力求在保證模塊劃分合理的前提下,減少模塊的數(shù)量、提高模塊的內(nèi)聚性及降低模塊的耦合性,設(shè)計(jì)出具有良好特性的軟件結(jié)構(gòu)。3.軟件結(jié)構(gòu)的改進(jìn)和優(yōu)化734.4詳細(xì)設(shè)計(jì)概述4.4.1詳細(xì)設(shè)計(jì)的任務(wù)詳細(xì)設(shè)計(jì)的任務(wù)主要有如下五點(diǎn)。(1)確定每個(gè)模塊的具體算法。根據(jù)體系結(jié)構(gòu)設(shè)計(jì)所建立的系統(tǒng)軟件結(jié)構(gòu),為劃分的每個(gè)模塊確定具體的算法,并選擇某種表達(dá)工具將算法的詳細(xì)處理過(guò)程描述出來(lái)。
4.4詳細(xì)設(shè)計(jì)概述4.4.1詳細(xì)設(shè)計(jì)的任務(wù)74(2)確定每個(gè)模塊的內(nèi)部數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)。為系統(tǒng)中的所有模塊確定并構(gòu)造算法實(shí)現(xiàn)所需的內(nèi)部數(shù)據(jù)結(jié)構(gòu);根據(jù)前一階段確定的數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),對(duì)數(shù)據(jù)庫(kù)的存儲(chǔ)結(jié)構(gòu)、存取方法等物理結(jié)構(gòu)進(jìn)行設(shè)計(jì)。(3)確定模塊接口的具體細(xì)節(jié)。按照模塊的功能要求,確定模塊接口的詳細(xì)信息,包括模塊之間的接口信息、模塊與系統(tǒng)外部的接口信息及用戶(hù)界面等。(2)確定每個(gè)模塊的內(nèi)部數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)。75(4)為每個(gè)模塊設(shè)計(jì)一組測(cè)試用例。由于負(fù)責(zé)詳細(xì)設(shè)計(jì)的軟件人員對(duì)模塊的實(shí)現(xiàn)細(xì)節(jié)十分清楚,因此由他們?cè)谕瓿稍敿?xì)設(shè)計(jì)后提出模塊的測(cè)試要求是非常恰當(dāng)和有效的。(5)編寫(xiě)文檔,參加復(fù)審。詳細(xì)設(shè)計(jì)階段的成果主要以詳細(xì)設(shè)計(jì)說(shuō)明書(shū)的形式保留下來(lái),在通過(guò)復(fù)審對(duì)其進(jìn)行改進(jìn)和完善后作為編碼階段進(jìn)行程序設(shè)計(jì)的主要依據(jù)。(4)為每個(gè)模塊設(shè)計(jì)一組測(cè)試用例。764.4.2詳細(xì)設(shè)計(jì)可采用的工具1.程序流程圖程序流程圖是最早出現(xiàn)且使用較為廣泛的算法表達(dá)工具之一,能夠有效地描述問(wèn)題求解過(guò)程中的程序邏輯結(jié)構(gòu)。程序流程圖中經(jīng)常使用的基本符號(hào)如圖4.17所示。圖4.17程序流程圖中的基本符號(hào)(a)一般處理框;(b)輸入/輸出框;(c)判斷框;(d)流程線(xiàn);(e)起止框4.4.2詳細(xì)設(shè)計(jì)可采用的工具圖4.17程序流程圖中77程序流程圖的主要優(yōu)點(diǎn)在于對(duì)程序的控制流程描述直觀(guān)、清晰,使用靈活,便于閱讀和掌握,因此在20世紀(jì)40年代末到70年代初被普遍采用。但隨著程序設(shè)計(jì)方法的發(fā)展,程序流程圖的許多缺點(diǎn)逐漸暴露出來(lái)。這些缺點(diǎn)主要體現(xiàn)在以下方面:(1)程序流程圖中可以隨心所欲地使用流程線(xiàn),容易造成程序控制結(jié)構(gòu)的混亂,與結(jié)構(gòu)化程序設(shè)計(jì)的思想相違背。程序流程圖的主要優(yōu)點(diǎn)在于對(duì)程序的控制流程描述直觀(guān)、清78(2)程序流程圖難以描述逐步求精的過(guò)程,容易導(dǎo)致程序員過(guò)早考慮程序的控制流程,而忽略程序全局結(jié)構(gòu)的設(shè)計(jì)。(3)程序流程圖難以表示系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)。正是由于程序流程圖存在的這些缺點(diǎn),越來(lái)越多的軟件設(shè)計(jì)人員放棄了對(duì)它的使用,而去選擇其他一些更有利于結(jié)構(gòu)化設(shè)計(jì)的表達(dá)工具,下面所介紹的N-S圖和PAD圖就是其中的兩種圖形工具。(2)程序流程圖難以描述逐步求精的過(guò)程,容易導(dǎo)致程79
2.N-S圖N-S圖又稱(chēng)為盒圖,它是為了保證結(jié)構(gòu)化程序設(shè)計(jì)而由Nassi和Shneiderman共同提出的一種圖形工具。在N-S圖中,所有的程序結(jié)構(gòu)均使用矩形框表示,它可以清晰地表達(dá)結(jié)構(gòu)中的嵌套及模塊的層次關(guān)系。N-S圖中,基本控制結(jié)構(gòu)的表示符號(hào)如圖4.18所示。由于N-S圖中沒(méi)有流程線(xiàn),不可能隨意轉(zhuǎn)移控制,因而表達(dá)出的程序結(jié)構(gòu)必然符合結(jié)構(gòu)化程序設(shè)計(jì)的思想,有利于培養(yǎng)軟件設(shè)計(jì)人員的良好設(shè)計(jì)風(fēng)格。但當(dāng)所描述的程序嵌套層次較多時(shí),N-S圖的內(nèi)層方框會(huì)越畫(huà)越小,不僅影響可讀性而且不易修改。2.N-S圖80圖4.18N-S圖中基本控制結(jié)構(gòu)的表示符號(hào)順序結(jié)構(gòu);(b)分支結(jié)構(gòu);(c)多分支CASE結(jié)構(gòu);(d)while-do結(jié)構(gòu);(e)do-until結(jié)構(gòu);(f)調(diào)用模塊A圖4.18N-S圖中基本控制結(jié)構(gòu)的表示符號(hào)81
3.PAD圖PAD(ProblemAnalysisDiagram,問(wèn)題分析圖)是繼程序流程圖和N-S圖后,由日立公司在20世紀(jì)70年代提出的又一種用于詳細(xì)設(shè)計(jì)的圖形表達(dá)工具。它只能用于結(jié)構(gòu)化程序的描述。PAD圖采用了易于使用的樹(shù)型結(jié)構(gòu)圖形符號(hào),既利于清晰地表達(dá)程序結(jié)構(gòu),又利于修改。PAD圖中所經(jīng)常使用的基本符號(hào)如圖4.19所示。3.PAD圖82圖4.19PAD中基本符號(hào)順序結(jié)構(gòu);(b)分支結(jié)構(gòu);(c)多分支CASE結(jié)構(gòu);(d)當(dāng)型循環(huán);(e);直到型循環(huán);(f)對(duì)s的細(xì)化圖4.19PAD中基本符號(hào)83PAD圖具有的主要優(yōu)點(diǎn)如下:(1)使用PAD圖描述的程序結(jié)構(gòu)層次清晰,邏輯結(jié)構(gòu)關(guān)系直觀(guān)、易讀、易記、易修改。(2)PAD圖為多種常用高級(jí)語(yǔ)言提供了相應(yīng)的圖形符號(hào),每種控制語(yǔ)句都與一個(gè)專(zhuān)門(mén)的圖形符號(hào)相對(duì)應(yīng),易于PAD圖向高級(jí)語(yǔ)言源程序轉(zhuǎn)換。(3)支持自頂向下、逐步求精的設(shè)計(jì)過(guò)程。(4)既能夠描述程序的邏輯結(jié)構(gòu),又能夠描述系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)。PAD圖具有的主要優(yōu)點(diǎn)如下:84圖4.20三種詳細(xì)設(shè)計(jì)中使用的圖形工具示例采用程序流程圖描述計(jì)算應(yīng)發(fā)工資模塊;(b)采用N-S圖描述計(jì)算應(yīng)發(fā)工資模塊;(c)采用PAD圖描述計(jì)算應(yīng)發(fā)工資模塊圖4.20三種詳細(xì)設(shè)計(jì)中使用的圖形工具示例85
4.PDL語(yǔ)言PDL(ProcessDesignLanguage)語(yǔ)言即過(guò)程設(shè)計(jì)語(yǔ)言,是一種用于描述程序算法和定義數(shù)據(jù)結(jié)構(gòu)的偽代碼。PDL語(yǔ)言的構(gòu)成與用于描述加工的結(jié)構(gòu)化語(yǔ)言相似,是一種兼有自然語(yǔ)言和結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言語(yǔ)法的“混合型”語(yǔ)言。自然語(yǔ)言的采用使算法的描述靈活自由、清晰易懂,結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言的采用使控制結(jié)構(gòu)的表達(dá)具有固定的形式且符合結(jié)構(gòu)化設(shè)計(jì)的思想。PDL語(yǔ)言與結(jié)構(gòu)化語(yǔ)言的主要區(qū)別在于:由于PDL語(yǔ)言表達(dá)的算法是編碼的直接依據(jù),因此其語(yǔ)法結(jié)構(gòu)更加嚴(yán)格并且處理過(guò)程描述更加具體詳細(xì)。4.PDL語(yǔ)言86PDL語(yǔ)言的主要特點(diǎn)如下:(1)各種定義語(yǔ)句及控制結(jié)構(gòu)的表達(dá)都具有嚴(yán)格的語(yǔ)法形式,使程序結(jié)構(gòu)、數(shù)據(jù)說(shuō)明等更加清晰。(2)提供了數(shù)據(jù)說(shuō)明機(jī)制,可用于定義簡(jiǎn)單及復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。(3)提供了模塊的定義和調(diào)用機(jī)制,方便了程序模塊化的表達(dá)。PDL語(yǔ)言的主要特點(diǎn)如下:87PDL語(yǔ)言的主要定義語(yǔ)句及基本控制結(jié)構(gòu)的表達(dá)如下所示:定義語(yǔ)句(1)數(shù)據(jù)定義:DECLARE屬性變量名,…屬性包括:整型、實(shí)型、雙精度型、字符型、指針、數(shù)組及結(jié)構(gòu)等類(lèi)型。PDL語(yǔ)言的主要定義語(yǔ)句及基本控制結(jié)構(gòu)的表達(dá)如下所示88(2)模塊定義:PROCEDURE模塊名(參數(shù))
RETURNEND…(2)模塊定義:…89基本控制結(jié)構(gòu)(1)順序結(jié)構(gòu):順序結(jié)構(gòu)的語(yǔ)句序列采用自然語(yǔ)言進(jìn)行描述。 語(yǔ)句序列S1 語(yǔ)句序列S2
語(yǔ)句序列Sn…基本控制結(jié)構(gòu)…90(2)選擇結(jié)構(gòu):①I(mǎi)F-ELSE結(jié)構(gòu)IF條件 IF條件 語(yǔ)句序列S1 或 語(yǔ)句序列SELSE ENDIF 語(yǔ)句序列S2ENDIF(2)選擇結(jié)構(gòu):91②多分支IF結(jié)構(gòu)IF條件1語(yǔ)句序列S1ELSEIF條件2語(yǔ)句序列S2ELSE語(yǔ)句序列SnENDIF…②多分支IF結(jié)構(gòu)…92③CASE結(jié)構(gòu)CASE表達(dá)式OFCASE取值1語(yǔ)句序列S1CASE取值2語(yǔ)句序列S2
ELSE語(yǔ)句序列SnENDCASE…③CASE結(jié)構(gòu)…93(3)循環(huán)結(jié)構(gòu):①FOR結(jié)構(gòu)FOR循環(huán)變量=初值TO終值 循環(huán)體SENDFOR②WHILE結(jié)構(gòu)WHILE條件 循環(huán)體SENDWHILE(3)循環(huán)結(jié)構(gòu):94③UNTIL結(jié)構(gòu)REPEAT 循環(huán)體SUNTIL條件3)輸入/輸出語(yǔ)句①輸入語(yǔ)句:GET(輸入變量表)②輸出語(yǔ)句:PUT(輸出變量表)4)模塊調(diào)用語(yǔ)句CALL模塊名(參數(shù))③UNTIL結(jié)構(gòu)954.4.3詳細(xì)設(shè)計(jì)的原則為了能夠使模塊的邏輯描述清晰準(zhǔn)確,在詳細(xì)設(shè)計(jì)階段應(yīng)遵循下列原則。(1)將保證程序的清晰度放在首位。由于結(jié)構(gòu)清晰的程序易于理解和修改,并且會(huì)大大減少錯(cuò)誤發(fā)生的機(jī)率,因此除了對(duì)執(zhí)行效率有嚴(yán)格要求的實(shí)時(shí)系統(tǒng)外,通常在詳細(xì)設(shè)計(jì)過(guò)程中應(yīng)優(yōu)先考慮程序的清晰度,而將程序的效率放在第二位。4.4.3詳細(xì)設(shè)計(jì)的原則96(2)設(shè)計(jì)過(guò)程中應(yīng)采用逐步細(xì)化的實(shí)現(xiàn)方法。從體系結(jié)構(gòu)設(shè)計(jì)到詳細(xì)設(shè)計(jì),本身就是一個(gè)細(xì)化模塊描述的過(guò)程,由粗到細(xì)、分步進(jìn)行的細(xì)化有助于保證所生成程序的可靠性,因此在詳細(xì)設(shè)計(jì)中特別適合采用逐步細(xì)化的方法。在對(duì)程序進(jìn)行細(xì)化的過(guò)程中,還應(yīng)同時(shí)對(duì)數(shù)據(jù)描述進(jìn)行細(xì)化。(2)設(shè)計(jì)過(guò)程中應(yīng)采用逐步細(xì)化的實(shí)現(xiàn)方法。97(3)選擇適當(dāng)?shù)谋磉_(dá)工具。在模塊算法確定之后,如何將其精確明了地表達(dá)出來(lái),對(duì)詳細(xì)設(shè)計(jì)的實(shí)現(xiàn)同樣十分重要。上一節(jié)中介紹了幾種較為常用的表達(dá)工具,這些工具各有特色。如圖形工具便于設(shè)計(jì)人員與用戶(hù)的交流,而PDL語(yǔ)言便于將詳細(xì)設(shè)計(jì)的結(jié)果轉(zhuǎn)換為源程序。設(shè)計(jì)人員應(yīng)根據(jù)具體情況選擇適當(dāng)?shù)谋磉_(dá)工具。(3)選擇適當(dāng)?shù)谋磉_(dá)工具。984.4.4詳細(xì)設(shè)計(jì)說(shuō)明書(shū)詳細(xì)設(shè)計(jì)說(shuō)明書(shū)是詳細(xì)設(shè)計(jì)階段最重要的技術(shù)文檔。與體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)相比,前者側(cè)重于軟件結(jié)構(gòu)的規(guī)定,后者則側(cè)重于對(duì)模塊實(shí)現(xiàn)具體細(xì)節(jié)的描述。詳細(xì)設(shè)計(jì)說(shuō)明書(shū)可以看作是在體系結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)所確定的系統(tǒng)總體結(jié)構(gòu)的基礎(chǔ)上,對(duì)其中各個(gè)模塊實(shí)現(xiàn)過(guò)程的進(jìn)一步描述和細(xì)化。通常,詳細(xì)設(shè)計(jì)說(shuō)明書(shū)中應(yīng)主要包括以下幾方面的內(nèi)容:4.4.4詳細(xì)設(shè)計(jì)說(shuō)明書(shū)99(1)引言:用于說(shuō)明編寫(xiě)本說(shuō)明書(shū)的目的、背景,定義所用到的術(shù)語(yǔ)和縮略語(yǔ),以及列出文檔中所引用的參考資料等。(2)總體設(shè)計(jì):用于給出軟件系統(tǒng)的體系結(jié)構(gòu)圖。(3)模塊描述:依次對(duì)各個(gè)模塊進(jìn)行詳細(xì)的描述,主要包括模塊的功能和性能,實(shí)現(xiàn)模塊功能的算法,模塊的輸入及輸出,模塊接口的詳細(xì)信息等。(1)引言:用于說(shuō)明編寫(xiě)本說(shuō)明書(shū)的目的、背景,定義1004.5面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法中所采用的關(guān)鍵技術(shù)主要包括以下兩個(gè)方面:(1)設(shè)計(jì)過(guò)程中采用了自頂向下,逐步細(xì)分的方法。面向數(shù)據(jù)流的設(shè)計(jì),無(wú)論是在進(jìn)行體系結(jié)構(gòu)設(shè)計(jì)或是進(jìn)行詳細(xì)設(shè)計(jì)時(shí)都采用了自頂向下、逐步細(xì)分的方法。在體系結(jié)構(gòu)設(shè)計(jì)中,通過(guò)采用這種方法可以將需要處理的問(wèn)題分解細(xì)化為一個(gè)由多個(gè)模塊組成的層次結(jié)構(gòu)的軟件系統(tǒng)。4.5面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)101在詳細(xì)設(shè)計(jì)中,通過(guò)采用這種方法可以將系統(tǒng)中的每個(gè)模塊逐步分解細(xì)化為一系列的具體處理步驟。自頂向下、逐步細(xì)分的方法符合人類(lèi)思維的一般方式,可將一個(gè)原本復(fù)雜的大問(wèn)題逐漸分解為若干個(gè)易于解決的、簡(jiǎn)單的問(wèn)題,然后各個(gè)擊破。由于這種方法在解決問(wèn)題時(shí)有效地控制住了復(fù)雜度和難度,因此大大減少了設(shè)計(jì)過(guò)程中出現(xiàn)錯(cuò)誤的可能,能夠顯著提高軟件開(kāi)發(fā)的可靠性及縮短軟件開(kāi)發(fā)的周期。在詳細(xì)設(shè)計(jì)中,通過(guò)采用這種方法可以將系統(tǒng)中的每個(gè)模塊102所有模塊的實(shí)現(xiàn)都只采用單入口、單出口的三種基本控制結(jié)構(gòu)。在面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)中,為了保證程序結(jié)構(gòu)的清晰度,通常限制只能采用三種基本控制結(jié)構(gòu)來(lái)構(gòu)造程序。這三種基本的控制結(jié)構(gòu)分別為順序結(jié)構(gòu)、選擇結(jié)構(gòu)(IF-THEN-ELSE型)和DO-WHILE循環(huán)結(jié)構(gòu)。它們的共同特點(diǎn)是均只有一個(gè)入口和一個(gè)出口。這三種基本控制結(jié)構(gòu)的流程圖如圖5.21所示。單入口、單出口控制結(jié)構(gòu)的采用,使面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)中的每個(gè)程序模塊都能保持清晰的邏輯結(jié)構(gòu)。在實(shí)際的軟件開(kāi)發(fā)工作中,為了方便使用或提高程序效率,有時(shí)在面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)中還允許使用直到型循環(huán)結(jié)構(gòu)。所有模塊的實(shí)現(xiàn)都只采用單入口、單出口的三種基本控制結(jié)103圖4.21三種基本控制結(jié)構(gòu)的流程圖(a)順序結(jié)構(gòu);(b)選擇結(jié)構(gòu);(c)DO-WHILE循環(huán)結(jié)構(gòu)圖4.21三種基本控制結(jié)構(gòu)的流程圖104(2)采用DO-UNTIL循環(huán)結(jié)構(gòu)和多分支選擇結(jié)構(gòu)(DO-CASE)兩種補(bǔ)充結(jié)構(gòu)。這兩種補(bǔ)充結(jié)構(gòu)的流程圖如圖4.22所示。只允許使用三種基本控制結(jié)構(gòu)的詳細(xì)設(shè)計(jì)通常被稱(chēng)為經(jīng)典的結(jié)構(gòu)程序設(shè)計(jì),而加入了兩種補(bǔ)充結(jié)構(gòu)的詳細(xì)設(shè)計(jì)則被稱(chēng)為擴(kuò)展的結(jié)構(gòu)程序設(shè)計(jì)。面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)中并非完全禁止GOTO語(yǔ)句的使用,例如限制在同一控制結(jié)構(gòu)內(nèi)部的GOTO語(yǔ)句并不會(huì)破壞程序的結(jié)構(gòu)化特點(diǎn)。此外,當(dāng)程序中需要立即從循環(huán)中轉(zhuǎn)移出來(lái)時(shí),在一些結(jié)構(gòu)化語(yǔ)言中提供了相應(yīng)的實(shí)現(xiàn)語(yǔ)句,如C語(yǔ)言中的break語(yǔ)句,這類(lèi)語(yǔ)句實(shí)質(zhì)上是局限的GOTO語(yǔ)句。允許使用這類(lèi)語(yǔ)句的程序設(shè)計(jì)被稱(chēng)為修正的結(jié)構(gòu)程序設(shè)計(jì)。(2)采用DO-UNTIL循環(huán)結(jié)構(gòu)和多分支選擇結(jié)105圖4.22兩種補(bǔ)充結(jié)構(gòu)的流程圖(a)DO-UNTIL循環(huán)結(jié)構(gòu);(b)多分支選擇結(jié)構(gòu)圖4.22兩種補(bǔ)充結(jié)構(gòu)的流程圖106綜上所述,在面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法中,自頂向下、逐步細(xì)分保證了程序的可靠性,而基本控制結(jié)構(gòu)的使用則保證了程序的清晰易懂。采用這種詳細(xì)設(shè)計(jì)方法的缺點(diǎn)是,程序結(jié)構(gòu)的清晰往往要以存儲(chǔ)容量的增加和運(yùn)行效率的降低為代價(jià),不過(guò)由于硬件技術(shù)的飛速發(fā)展,存儲(chǔ)容量和運(yùn)行時(shí)間已不再是軟件開(kāi)發(fā)人員需要首要考慮的問(wèn)題了。綜上所述,在面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法中,自頂向下、逐1074.6面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法面向數(shù)據(jù)流的設(shè)計(jì)方法是以系統(tǒng)中的數(shù)據(jù)流作為設(shè)計(jì)的出發(fā)點(diǎn),而面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法則是以系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)作為設(shè)計(jì)的出發(fā)點(diǎn)。由于大多數(shù)目標(biāo)軟件都是為了解決信息處理問(wèn)題,并且算法和數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計(jì)中兩個(gè)不可分割的側(cè)面,算法的結(jié)構(gòu)往往在很大程度上依賴(lài)于它要處理的數(shù)據(jù)結(jié)構(gòu),因此可以根據(jù)軟件所要處理的信息的數(shù)據(jù)結(jié)構(gòu)來(lái)設(shè)計(jì)軟件。例如,通常對(duì)重復(fù)出現(xiàn)的數(shù)據(jù)結(jié)構(gòu)要采用循環(huán)結(jié)構(gòu)來(lái)處理,對(duì)選擇性的數(shù)據(jù)結(jié)構(gòu)采用選擇結(jié)構(gòu)來(lái)處理,而對(duì)分層的數(shù)據(jù)結(jié)構(gòu)往往要采用相對(duì)應(yīng)的分層程序結(jié)構(gòu)來(lái)處理。4.6面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法面向數(shù)據(jù)流的設(shè)計(jì)方法是108面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法和面向數(shù)據(jù)流的設(shè)計(jì)方法雖然出發(fā)點(diǎn)不同,但同樣都遵循結(jié)構(gòu)程序設(shè)計(jì)和自頂向下、逐步細(xì)分的設(shè)計(jì)原則。面向數(shù)據(jù)流的設(shè)計(jì)分為體系結(jié)構(gòu)設(shè)計(jì)和詳細(xì)設(shè)計(jì),體系結(jié)構(gòu)設(shè)計(jì)的目標(biāo)是導(dǎo)出系統(tǒng)的軟件結(jié)構(gòu),詳細(xì)設(shè)計(jì)完成模塊具體實(shí)現(xiàn)過(guò)程的設(shè)計(jì);而面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法并不明確地使用軟件結(jié)構(gòu)的概念,它的目標(biāo)是得到系統(tǒng)的程序結(jié)構(gòu),最適合在詳細(xì)設(shè)計(jì)階段使用,只在少數(shù)情況下被獨(dú)立地用于小規(guī)模加工系統(tǒng)開(kāi)發(fā)的系統(tǒng)設(shè)計(jì)。通??稍谶M(jìn)行了面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)后,采用面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法確定軟件結(jié)構(gòu)中部分或全部模塊的邏輯處理過(guò)程。正是由于以上原因,本書(shū)在介紹面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法時(shí),并未將其分為體系結(jié)構(gòu)設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)階段。面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法和面向數(shù)據(jù)流的設(shè)計(jì)方法雖然出發(fā)109通常面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法的設(shè)計(jì)步驟如下:(1)畫(huà)出系統(tǒng)中輸入、輸出數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)圖。(2)根據(jù)數(shù)據(jù)結(jié)構(gòu)圖,映射得到相應(yīng)的程序結(jié)構(gòu)圖。(3)按照程序結(jié)構(gòu)圖,分析得到程序的詳細(xì)過(guò)程性描述。通常面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法的設(shè)計(jì)步驟如下:110在面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法中,最典型的代表是Jackson方法和Warnier方法。由于這兩種面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法有很多的類(lèi)似之處,本節(jié)僅以Jackson方法為例,介紹從數(shù)據(jù)結(jié)構(gòu)導(dǎo)出程序過(guò)程性描述的具體步驟。Jackson方法是由英國(guó)的M.A.Jackson在1975年首先提出的,他同時(shí)還提出了與這種方法配套使用的、用于描述系統(tǒng)數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)的圖形工具,被稱(chēng)為Jackson圖。Jackson方法從目標(biāo)系統(tǒng)的輸入、輸出數(shù)據(jù)結(jié)構(gòu)入手,導(dǎo)出程序框架結(jié)構(gòu),再補(bǔ)充其他細(xì)節(jié),就可得到完整的程序結(jié)構(gòu)圖。這一方法對(duì)輸入、輸出數(shù)據(jù)結(jié)構(gòu)明確的中、小型系統(tǒng)特別有效,如商業(yè)應(yīng)用中的文件、表格處理。該方法也可與其他方法結(jié)合,用于模塊的詳細(xì)設(shè)計(jì)。下面首先介紹使用Jackson圖描述數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)的具體方法,之后再介紹運(yùn)用Jackson方法如何從Jackson圖逐步得到對(duì)程序處理過(guò)程的描述。在面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法中,最典型的代表是Jacks111
1.Jackson圖Jackson圖由方框、連線(xiàn)及有特殊含義的一些標(biāo)記組成。由于盡管數(shù)據(jù)結(jié)構(gòu)種類(lèi)繁多,但其數(shù)據(jù)元素之間的聯(lián)系只有順序、選擇和循環(huán)三種,因此邏輯數(shù)據(jù)結(jié)構(gòu)的類(lèi)型也只有這三種。此外,結(jié)構(gòu)化的程序中也只含有這三種基本結(jié)構(gòu)。因此,使用Jackson圖無(wú)論表達(dá)數(shù)據(jù)結(jié)構(gòu)或程序結(jié)構(gòu),都是由這三種基本結(jié)構(gòu)組合而成的。這三種基本結(jié)構(gòu)在Jackson圖中的表示符號(hào)如圖4.23所示。1.Jackson圖112圖4.23三種基本結(jié)構(gòu)在Jackson圖中的表示符號(hào)(a)順序結(jié)構(gòu);(b)選擇結(jié)構(gòu);(c);循環(huán)結(jié)構(gòu)圖4.23三種基本結(jié)構(gòu)在Jackson圖中的表示符號(hào)113在圖4.23中,(a)圖表示A由B、C和D三部分順序組成;(b)圖表示A根據(jù)分支條件由B、C、D三個(gè)部分中選擇一個(gè),注意A、B和C上均標(biāo)有“°”標(biāo)記表示選擇;(c)圖表示A由B重復(fù)若干次組成,注意B上標(biāo)有“*”標(biāo)記表示重復(fù)。由于Jackson圖可直觀(guān)、清晰地描述系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu),因此與上一章所介紹的Warnier圖(Warnier圖原來(lái)是Warnier方法中使用的專(zhuān)用表達(dá)工具)一樣,已經(jīng)成為了一種在需求分析和設(shè)計(jì)階段均可采用的通用圖形表達(dá)手段。在圖4.23中,(a)圖表示A由B、C和D三部分順序114
2.Jackson方法Jackson方法是一種典型的面向數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)程序設(shè)計(jì)方法,其設(shè)計(jì)目標(biāo)是從分析系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)出發(fā),最后得出用Jackson偽代碼表示的程序處理過(guò)程。為了便于理解,下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明Jackson方法的具體設(shè)計(jì)步驟。假定某單位原來(lái)存在一個(gè)職工工資文件和一個(gè)職工檔案文件,兩個(gè)文件中的記錄均按照職工編號(hào)升序排列且數(shù)目相等,現(xiàn)在要將這兩個(gè)獨(dú)立的文件合并為一個(gè)職工工資檔案文件。采用Jackson方法設(shè)計(jì),共分為如下四步進(jìn)行:2.Jackson方法115(1)分析問(wèn)題,確定輸入、輸出數(shù)據(jù)的邏輯結(jié)構(gòu),并用Jackson圖將其描述出來(lái)。如上面例子中的輸入數(shù)據(jù)為職工檔案文件和職工工資文件,輸出數(shù)據(jù)為職工工資檔案文件,用Jackson圖表示的輸入和輸出數(shù)據(jù)結(jié)構(gòu)如圖4.24所示。(1)分析問(wèn)題,確定輸入、輸出數(shù)據(jù)的邏輯結(jié)構(gòu),并116圖4.24輸入和輸出數(shù)據(jù)結(jié)構(gòu)(a)輸入數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu);(b)輸出數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)圖4.24輸入和輸出數(shù)據(jù)結(jié)構(gòu)117(3)找出輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)中有對(duì)應(yīng)關(guān)系的單元,并按下列規(guī)則導(dǎo)出描述程序結(jié)構(gòu)的Jackson圖。所謂對(duì)應(yīng)單元,是指在程序中具有因果關(guān)系,可以同時(shí)處理的數(shù)據(jù)單元。若這些單元在結(jié)構(gòu)圖中重復(fù)出現(xiàn),則它們?cè)谳斎虢Y(jié)構(gòu)和輸出結(jié)構(gòu)中重復(fù)出現(xiàn)的次數(shù)都相同時(shí)才算作是對(duì)應(yīng)單元?!駷槊繉?duì)輸入結(jié)構(gòu)與輸出結(jié)構(gòu)中有對(duì)應(yīng)關(guān)系的數(shù)據(jù)單元在程序結(jié)構(gòu)圖的相應(yīng)層次畫(huà)一個(gè)處理框?!駷檩斎霐?shù)據(jù)結(jié)構(gòu)中剩余的每一個(gè)數(shù)據(jù)單元在程序結(jié)構(gòu)圖的相應(yīng)層次畫(huà)一個(gè)處理框?!駷檩敵鰯?shù)據(jù)結(jié)構(gòu)中剩余的每一個(gè)數(shù)據(jù)單元在程序結(jié)構(gòu)圖的相應(yīng)層次畫(huà)一個(gè)處理框。(3)找出輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)中有對(duì)應(yīng)關(guān)系的118圖4.25生成工資檔案文件的程序結(jié)構(gòu)圖圖4.25生成工資檔案文件的程序結(jié)構(gòu)圖119(3)列出完成結(jié)構(gòu)圖中各處理框功能的所有操作、分支及循環(huán)條件,并把它們放到程序結(jié)構(gòu)圖上的適當(dāng)位置。在導(dǎo)出程序結(jié)構(gòu)圖的過(guò)程中,當(dāng)順序結(jié)構(gòu)中混雜有循環(huán)或選擇結(jié)構(gòu)時(shí),應(yīng)通過(guò)增加中間層次對(duì)其進(jìn)行改進(jìn),保證結(jié)構(gòu)的清晰性。例子中所涉及的基本操作和條件如下:A.打開(kāi)輸入文件;B.新建工資檔案文件;C.讀取輸入文件中的一條記錄;D.關(guān)閉文件;E.合并生成工資檔案記錄;F.將工資檔案記錄寫(xiě)入文件;G.終止;I(1).輸入文件未結(jié)束。將這些操作及條件分配到程序結(jié)構(gòu)圖的適當(dāng)位置之后,結(jié)果如圖4.26(a)所示??梢钥吹剑趫D4.26(a)中的產(chǎn)生工資檔案文件順序結(jié)構(gòu)中,混有產(chǎn)生工資檔案記錄這個(gè)循環(huán)結(jié)構(gòu)。為了防止混淆,應(yīng)將其改進(jìn)為圖4.26(b)所示的程序結(jié)構(gòu)圖。(3)列出完成結(jié)構(gòu)圖中各處理框功能的所有操作、分支120圖4.26加入基本操作和條件后的程序結(jié)構(gòu)圖(a)改進(jìn)前的程序結(jié)構(gòu)圖;(b)改進(jìn)后的程序結(jié)構(gòu)圖圖4.26加入基本操作和條件后的程序結(jié)構(gòu)圖121(4)用Jackson偽代碼寫(xiě)出程序的處理過(guò)程。Jackson方法中使用的偽代碼和Jackson圖完全對(duì)應(yīng),以下是與圖5.23所示的Jackson圖中三種基本結(jié)構(gòu)對(duì)應(yīng)的偽代碼表示?!耥樞蚪Y(jié)構(gòu):其中,seq和end是關(guān)鍵字。Aseq B C DAend(4)用Jackson偽代碼寫(xiě)出程序的處理過(guò)程。122●選擇結(jié)構(gòu):其中,select、or和end是關(guān)鍵字;cond1、cond2和cond3分別是執(zhí)行B、C或D的條件。Aselectcond1 BAorcond2 CAorcond3 DAend●選擇結(jié)構(gòu):其中,select、or和end是關(guān)123●循環(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu)有until和while兩種形式,其中,itel、until、while和end是關(guān)鍵字;cond是循環(huán)的條件。Aiteluntil(或while)cond BAend●循環(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu)有until和while兩種形124圖4.26(b)所示的程序結(jié)構(gòu)圖對(duì)應(yīng)的偽代碼表示如下:產(chǎn)生工資檔案文件seq打開(kāi)兩個(gè)輸入文件新建工資檔案文件程序體itelwhile輸入文件未結(jié)束產(chǎn)生工資檔案記錄seq從兩個(gè)輸入文件中各讀取一條記錄 合并生成工資檔案記錄 將生成的工資檔案記錄寫(xiě)入工資檔案文件中產(chǎn)生工資檔案記錄end程序體end關(guān)閉所有文件終止產(chǎn)生工資檔案文件end圖4.26(b)所示的程序結(jié)構(gòu)圖對(duì)應(yīng)的偽代碼表示如下:125
從上面的例子中可以看出,對(duì)于一個(gè)輸入、輸出數(shù)據(jù)結(jié)構(gòu)之間對(duì)應(yīng)關(guān)系清晰的小規(guī)模數(shù)據(jù)處理問(wèn)題來(lái)說(shuō),采用Jackson方法可以很方便地得到系統(tǒng)的處理過(guò)程描述。但當(dāng)輸入、輸出數(shù)據(jù)出現(xiàn)錯(cuò)誤或輸入、輸出數(shù)據(jù)間沒(méi)有對(duì)應(yīng)關(guān)系(稱(chēng)為結(jié)構(gòu)沖突)時(shí),上面所介紹的映射規(guī)則就無(wú)法處理了,此時(shí)需要利用Jackson方法中的補(bǔ)充技術(shù)進(jìn)行處理。有關(guān)補(bǔ)充技術(shù)的內(nèi)容可參閱Jackson本人的專(zhuān)著。從上面的例子中可以看出,對(duì)于一個(gè)輸入、輸出數(shù)據(jù)1264.7小結(jié)軟件設(shè)計(jì)是一個(gè)將軟件需求轉(zhuǎn)換為軟件實(shí)現(xiàn)方案的過(guò)程,分為體系結(jié)構(gòu)設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)階段。體系結(jié)構(gòu)設(shè)計(jì)階段主要完成對(duì)系統(tǒng)宏觀(guān)結(jié)構(gòu)的設(shè)計(jì),詳細(xì)設(shè)計(jì)階段則完成系統(tǒng)內(nèi)部實(shí)現(xiàn)細(xì)節(jié)的確定。系統(tǒng)體系結(jié)構(gòu)的設(shè)計(jì)應(yīng)遵循相應(yīng)的設(shè)計(jì)原則,特別是要保證模塊的獨(dú)立性。體系結(jié)構(gòu)設(shè)計(jì)過(guò)程中通常采用結(jié)構(gòu)圖或HIPO圖來(lái)描述軟件的層次結(jié)構(gòu)。詳細(xì)設(shè)計(jì)的過(guò)程實(shí)質(zhì)上是對(duì)體系結(jié)構(gòu)設(shè)計(jì)成果的逐步細(xì)化,最終可得到對(duì)系統(tǒng)中各模塊實(shí)現(xiàn)算法的具體描述。詳細(xì)設(shè)計(jì)的成果可采用程序流程圖、N-S圖、PAD圖或PDL語(yǔ)言等手段進(jìn)行描述。4.7小結(jié)軟件設(shè)計(jì)是一個(gè)將軟件需求轉(zhuǎn)換為軟件127在面向數(shù)據(jù)流的體系設(shè)計(jì)方法中,將數(shù)據(jù)流圖劃分為變換型和事務(wù)型兩種類(lèi)型,對(duì)于不同類(lèi)型的數(shù)據(jù)流圖采用不同的映射方法獲得系統(tǒng)的軟件結(jié)構(gòu)。在面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法中,通過(guò)采用“自頂向下、逐步細(xì)分”的策略有效地控制了設(shè)計(jì)工作的難度,嚴(yán)格采用三種基本結(jié)構(gòu)進(jìn)行設(shè)計(jì)則保證了程序結(jié)構(gòu)的清晰度。在面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法中,能夠根據(jù)系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)導(dǎo)出目標(biāo)系統(tǒng)的程序結(jié)構(gòu),最適合在詳細(xì)設(shè)計(jì)階段使用。本章僅以Jackson方法為例對(duì)面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法進(jìn)行了簡(jiǎn)要的介紹,要使用該方法解決實(shí)際問(wèn)題還需閱讀相關(guān)的專(zhuān)著及進(jìn)行必要的實(shí)踐。在面向數(shù)據(jù)流的體系設(shè)計(jì)方法中,將數(shù)據(jù)流圖劃分為變換型128第4章結(jié)構(gòu)化軟件設(shè)計(jì)
4.1軟件設(shè)計(jì)中的基本概念和原理4.2體系結(jié)構(gòu)設(shè)計(jì)概述4.3面向數(shù)據(jù)流的體系結(jié)構(gòu)設(shè)計(jì)方法4.4詳細(xì)設(shè)計(jì)概述4.5面向數(shù)據(jù)流的詳細(xì)設(shè)計(jì)方法4.6面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)方法4.7小結(jié)第4章結(jié)構(gòu)化軟件設(shè)計(jì)4.1軟件設(shè)計(jì)中的基本概念和原1294.1軟件設(shè)計(jì)中的基本概念和原理
1.模塊化所謂模塊,是指具有相對(duì)獨(dú)立性的,由數(shù)據(jù)說(shuō)明、執(zhí)行語(yǔ)句等程序?qū)ο髽?gòu)成的集合。程序中的每個(gè)模塊都需要單獨(dú)命名,通過(guò)名字可實(shí)現(xiàn)對(duì)指定模塊的訪(fǎng)問(wèn)。在高級(jí)語(yǔ)言中,模塊具體表現(xiàn)為函數(shù)、子程序、過(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)部特征。4.1軟件設(shè)計(jì)中的基本概念和原理1.模塊化130模塊化是指將整個(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)行以下推理。首先,我們?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所需的工作量大。模塊化是指將整個(gè)程序劃分為若干個(gè)模塊,每個(gè)模塊用于實(shí)131在人們解決問(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è)擊破,所需要的工作量小于直接解決復(fù)雜問(wèn)題所需的工作量。在人們解決問(wèn)題的過(guò)程中,發(fā)現(xiàn)存在有另一個(gè)有趣的規(guī)律132根據(jù)上面的推理,我們可以得到這樣一個(gè)結(jié)論,模塊化可以降低解決問(wèn)題的復(fù)雜度,從而降低軟件開(kāi)發(fā)的工作量。但是不是模塊劃分得越多越好呢?雖然增加程序中的模塊數(shù)可以降低開(kāi)發(fā)每個(gè)模塊的工作量,但同時(shí)卻增加了設(shè)計(jì)模塊接口的工作量。通過(guò)圖5.1所示的模塊數(shù)與軟件開(kāi)發(fā)成本的關(guān)系圖中可以看出,當(dāng)劃分的模塊數(shù)處于最小成本區(qū)時(shí),開(kāi)發(fā)軟件的總成本最低。雖然目前還不能得到模塊數(shù)M的精確取值,但總成本曲線(xiàn)對(duì)我們進(jìn)行模塊劃分具有重要的指導(dǎo)意義。模塊化不但可以降低軟件開(kāi)發(fā)的難度,而且可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性。此外,模塊化還有利于提高代碼的可重用性及團(tuán)隊(duì)合作開(kāi)發(fā)大型軟件的可行性。根據(jù)上面的推理,我們可以得到這樣一個(gè)結(jié)論,模塊化可以133圖4.1模塊數(shù)與軟件開(kāi)發(fā)成本圖4.1模塊數(shù)與軟件開(kāi)發(fā)成本134
2.抽象抽象是人類(lèi)在解決復(fù)雜問(wèn)題時(shí)經(jīng)常采用的一種思維方式,它是指將現(xiàn)實(shí)世界中具有共性的一類(lèi)事物的相似的、本質(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ò)程中從問(wèn)題定義到最終的軟件生成,每一階段都是在前一階段基礎(chǔ)上對(duì)軟件解法的抽象層上的一次求精和細(xì)化。2.抽象135結(jié)構(gòu)化程序中自頂向下、逐步求精的模塊劃分思想正是人類(lèi)思維中運(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)用抽象的方法還能夠提高代碼的可重用性。結(jié)構(gòu)化程序中自頂向下、逐步求精的模塊劃分思想正是人類(lèi)思維136
3.信息隱蔽信息隱蔽是指一個(gè)模塊將自身的內(nèi)部信息向其他模塊隱藏起來(lái),以避免其他模塊不恰當(dāng)?shù)脑L(fǎng)問(wèn)和修改,只有對(duì)那些為了完成系統(tǒng)功能所必須的數(shù)據(jù)交換才被允許在模塊間進(jìn)行。信息隱蔽的目的主要是為了提高模塊的獨(dú)立性,減少將一個(gè)模塊中的錯(cuò)誤擴(kuò)散到其他模塊的機(jī)會(huì)。但是需要強(qiáng)調(diào)一點(diǎn),信息隱蔽并不意味著某個(gè)模塊中的內(nèi)部信息對(duì)其他模塊來(lái)說(shuō)是完全不可見(jiàn)或不能使用的,而是說(shuō)模塊之間的信息傳遞只能通過(guò)合法的調(diào)用接口來(lái)實(shí)現(xiàn)。顯然,信息隱蔽對(duì)提高軟件的可讀性和可維護(hù)性都是非常重要的。3.信息隱蔽137
4.模塊獨(dú)立性1)耦合性耦合性是對(duì)一個(gè)軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系緊密程度的度量指標(biāo)。模塊間的聯(lián)系越緊密,耦合性就越高,模塊的獨(dú)立性也就越低。由于模塊間的聯(lián)系是通過(guò)模塊接口實(shí)現(xiàn)的,因此,模塊耦合性的高低主要取決于模塊接口的復(fù)雜程度、調(diào)用模塊的方式以及通過(guò)模塊接口的數(shù)據(jù)。模塊間的耦合性主要可劃分為如下幾種類(lèi)型。4.模塊獨(dú)立性138(1)數(shù)據(jù)耦合。若兩個(gè)模塊之間僅通過(guò)模塊參數(shù)交換信息,且交換的信息全部為簡(jiǎn)單數(shù)據(jù),則稱(chēng)這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療健康大數(shù)據(jù)標(biāo)準(zhǔn)體系-洞察分析
- 溫室氣體排放與氣候變化關(guān)系-洞察分析
- 2025工程車(chē)出租合同范文
- 2025園林景觀(guān)石材供貨合同
- 2025服裝定作買(mǎi)賣(mài)合同范本
- 2025不銹鋼加工安裝合同
- 船舶制造公司財(cái)務(wù)人員聘用協(xié)議
- 螺旋千斤頂課程設(shè)計(jì)
- 產(chǎn)業(yè)園租賃中止協(xié)議
- 健身房停車(chē)位租賃協(xié)議
- 遼寧省沈陽(yáng)市2022-2023學(xué)年六年級(jí)上學(xué)期語(yǔ)文期末試卷(含答案)
- 23J916-1:住宅排氣道(一)
- 四年級(jí)全冊(cè)《勞動(dòng)》課程知識(shí)點(diǎn)匯總精排
- 小學(xué)語(yǔ)文二年級(jí)上冊(cè)第八單元說(shuō)教材
- 教育學(xué)原理課后答案主編項(xiàng)賢明
- 幼兒園故事課件:《畫(huà)龍點(diǎn)睛》
- 小學(xué)科學(xué)五年級(jí)上冊(cè)期末測(cè)試質(zhì)量分析
- 音樂(lè)與人生-西南交通大學(xué)中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 電子科技公司安全生產(chǎn)管理制度
- 收款單位變更委托書(shū)
- 用計(jì)算機(jī)計(jì)算圓周率-滬教版高中必修一數(shù)據(jù)與計(jì)算第三單位
評(píng)論
0/150
提交評(píng)論