軟件詳細(xì)設(shè)計(jì)第6章軟件總體設(shè)計(jì)_第1頁(yè)
軟件詳細(xì)設(shè)計(jì)第6章軟件總體設(shè)計(jì)_第2頁(yè)
軟件詳細(xì)設(shè)計(jì)第6章軟件總體設(shè)計(jì)_第3頁(yè)
軟件詳細(xì)設(shè)計(jì)第6章軟件總體設(shè)計(jì)_第4頁(yè)
軟件詳細(xì)設(shè)計(jì)第6章軟件總體設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩147頁(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)介

第6章軟件總體設(shè)計(jì)第6章

軟件總體設(shè)計(jì)軟件設(shè)計(jì)的重要性設(shè)計(jì)過(guò)程軟件總體設(shè)計(jì)設(shè)計(jì)基本原理體系結(jié)構(gòu)設(shè)計(jì)結(jié)構(gòu)化設(shè)計(jì)軟件結(jié)構(gòu)優(yōu)化小結(jié)第6章軟件總體設(shè)計(jì)6.1

軟件設(shè)計(jì)的重要性軟件設(shè)計(jì)處于軟件工程過(guò)程的技術(shù)核心地位。軟件開(kāi)發(fā)中不管應(yīng)用什么樣的開(kāi)發(fā)模式(development

paradigm),都要進(jìn)行軟件設(shè)計(jì)。當(dāng)軟件需求分析和定義完成后,就進(jìn)入設(shè)計(jì)階段,即在對(duì)系統(tǒng)的信息、功能、行為和各種要求理解的基礎(chǔ)上構(gòu)想未來(lái)的系統(tǒng)。這種構(gòu)想需要后面的編碼階段來(lái)構(gòu)造、測(cè)試階段來(lái)驗(yàn)證。軟件設(shè)計(jì)、構(gòu)造與驗(yàn)證這三項(xiàng)活動(dòng)是必不可少的。每一項(xiàng)都是按一定形式變換信息,最終使之成為被確認(rèn)的計(jì)算機(jī)軟件。在軟件工程過(guò)程中的這些技術(shù)階段的信息流如圖6.1所示。第6章軟件總體設(shè)計(jì)由圖6.1可以看出,在軟件需求提供的信息(information)、功能(functional)和行為(behavioral)模型上,設(shè)計(jì)階段可以使用任何一種設(shè)計(jì)方法。設(shè)計(jì)階段包括把分析階段所建立的信息域模型變換為數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)是軟件實(shí)現(xiàn)所需要

的;也包括定義程序結(jié)構(gòu)構(gòu)件(structural

components)之間的相互關(guān)系的體系結(jié)構(gòu)(architectural)設(shè)計(jì);還包括變換結(jié)構(gòu)構(gòu)件為軟件的過(guò)程描述的過(guò)程(procedural)設(shè)計(jì)。源代碼生成并通過(guò)測(cè)試之后,進(jìn)行軟件的組裝(integrate)和確認(rèn)(validate)。在設(shè)計(jì)中所作的決策將最終影響軟件實(shí)現(xiàn)的成功與否,也影響軟件維護(hù)的難易程度。所以,在軟件設(shè)計(jì)過(guò)程中的這些決策是開(kāi)發(fā)階段非常關(guān)鍵的一步。第6章軟件總體設(shè)計(jì)軟件設(shè)計(jì)的重要性還反映在質(zhì)量(quality)上。在開(kāi)發(fā)過(guò)程中,設(shè)計(jì)是對(duì)軟件最本質(zhì)的部分進(jìn)行構(gòu)造,構(gòu)造的水平?jīng)Q定軟件質(zhì)量。同時(shí),設(shè)計(jì)也提供了可以進(jìn)行質(zhì)量評(píng)價(jià)的軟件表達(dá)式。只有通過(guò)設(shè)計(jì),才能把用戶的需求精確地轉(zhuǎn)換為完美的軟件系統(tǒng)。軟件設(shè)計(jì)是軟件工程和軟件維護(hù)的基礎(chǔ),有無(wú)軟件設(shè)計(jì)相差很大,如圖6.2所示。第6章軟件總體設(shè)計(jì)圖6.2有無(wú)軟件設(shè)計(jì)的對(duì)比第6章軟件總體設(shè)計(jì)6.2

設(shè)計(jì)過(guò)程軟件設(shè)計(jì)是一個(gè)把需求轉(zhuǎn)換為軟件表達(dá)式的過(guò)程。這個(gè)轉(zhuǎn)換過(guò)程一般情況下分為兩步走。首先,用表達(dá)式描繪一個(gè)軟件的概貌,然后將其細(xì)化為一個(gè)非常接近于源代碼的設(shè)計(jì)表達(dá)式。從軟件工程的角度講是分為總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)??傮w設(shè)計(jì)主要是把需求轉(zhuǎn)換為數(shù)據(jù)結(jié)構(gòu)和軟件體系結(jié)構(gòu),而詳細(xì)設(shè)計(jì)主要集中在體系結(jié)構(gòu)表達(dá)式的細(xì)化上,進(jìn)而產(chǎn)生詳細(xì)的數(shù)據(jù)結(jié)構(gòu)和軟件的算法表達(dá)式。第6章軟件總體設(shè)計(jì)在早期的設(shè)計(jì)工作中,軟件設(shè)計(jì)著重在開(kāi)發(fā)模塊化程序模塊所需要的準(zhǔn)則以及按照自頂向下(top-down)的方式逐步細(xì)化軟件體系結(jié)構(gòu)上。設(shè)計(jì)定義的過(guò)程方面逐漸發(fā)展成為一種叫做結(jié)構(gòu)化編程(structured

programming)的原則。之后,提出了把數(shù)據(jù)流和數(shù)據(jù)結(jié)構(gòu)翻譯成設(shè)計(jì)定義的方法。近年來(lái),則建議采用OO(Object-Oriented)的設(shè)計(jì)方法??偨Y(jié)過(guò)去軟件設(shè)計(jì)的發(fā)展,可以歸納為是一個(gè)持續(xù)發(fā)展的過(guò)程。第6章軟件總體設(shè)計(jì)在比較小的軟件設(shè)計(jì)中,可以把總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)作為一個(gè)過(guò)程階段去完成。但是有一定規(guī)模的系統(tǒng)中,總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)是兩個(gè)明確的階段。所以它們中的許多設(shè)計(jì)活動(dòng)是不同的。除了數(shù)據(jù)、體系結(jié)構(gòu)和過(guò)程設(shè)計(jì)之外,在現(xiàn)代的許多應(yīng)用中還包括界面設(shè)計(jì)活動(dòng)。界面設(shè)計(jì)主要是建立人—機(jī)之間界面的布局和交互的機(jī)制??傮w設(shè)計(jì)和詳細(xì)設(shè)計(jì)除了必須有先進(jìn)的設(shè)計(jì)技術(shù)外,還要有同步的管理技術(shù)支持。圖6.3所示的形式表明了總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)與管理技術(shù)之間的關(guān)系。第6章軟件總體設(shè)計(jì)圖6.3總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)與管理技術(shù)之間的關(guān)系第6章軟件總體設(shè)計(jì)從圖6.3中可以看出,由技術(shù)支持的總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)都伴隨著管理技術(shù)。前面已經(jīng)提到,軟件設(shè)計(jì)的重要性之一就是軟件的質(zhì)量。在整個(gè)設(shè)計(jì)過(guò)程中,對(duì)設(shè)計(jì)每一步的質(zhì)量都要進(jìn)行正式的技

術(shù)評(píng)審(formal

technical

reviews)。對(duì)于設(shè)計(jì)表達(dá)式的質(zhì)量的評(píng)價(jià)要按照設(shè)計(jì)準(zhǔn)則,這里給出下列軟件設(shè)計(jì)準(zhǔn)則:設(shè)計(jì)應(yīng)當(dāng)模塊化(modular),也就是說(shuō),軟件應(yīng)被邏輯地劃分為能完成特定功能和子功能的構(gòu)件。設(shè)計(jì)應(yīng)形成具有獨(dú)立功能特征的模塊(如子程序或過(guò)程)。設(shè)計(jì)應(yīng)使模塊之間和與外部環(huán)境之間接口的復(fù)雜度盡量地降低。第6章軟件總體設(shè)計(jì)設(shè)計(jì)應(yīng)該有一個(gè)分層的組織結(jié)構(gòu),這樣人們可對(duì)軟件的各個(gè)構(gòu)件進(jìn)行理性的控制。設(shè)計(jì)應(yīng)有性質(zhì)不同的可區(qū)分的數(shù)據(jù)和過(guò)程表達(dá)式。設(shè)計(jì)應(yīng)利用軟件需求分析中得到的信息和可重復(fù)的方法。人們都希望設(shè)計(jì)一個(gè)良好的系統(tǒng)。然而,任何一個(gè)良好的系統(tǒng)設(shè)計(jì),都不是偶然能輕易得到的,它是需要通過(guò)基本設(shè)計(jì)原理、系統(tǒng)化的方法和評(píng)審的各項(xiàng)技術(shù)的應(yīng)用共同促成的。第6章軟件總體設(shè)計(jì)6.3

軟件總體設(shè)計(jì)需求分析階段所形成的數(shù)據(jù)流圖是軟件總體設(shè)計(jì)的基礎(chǔ)。要為可供選擇的每一個(gè)方案準(zhǔn)備一份系統(tǒng)流程圖,列出系統(tǒng)組成的物理元素,進(jìn)行效益分析,制定實(shí)現(xiàn)方案的進(jìn)度。從合理的方案中選擇一個(gè)最佳的方案向用戶推薦,當(dāng)用戶接受方案后,就要為這個(gè)最佳的方案設(shè)計(jì)軟件結(jié)構(gòu)。一般情況下,這個(gè)軟件結(jié)構(gòu)要通過(guò)反復(fù)修改使之合理,同時(shí)還要進(jìn)行必要的數(shù)據(jù)庫(kù)設(shè)計(jì)。在分布式系統(tǒng)中還要進(jìn)行網(wǎng)絡(luò)設(shè)計(jì)。另外,還要制定測(cè)試計(jì)劃和確定測(cè)試要求。在詳細(xì)設(shè)計(jì)前一定要進(jìn)行軟件總體設(shè)計(jì)。軟件總體設(shè)計(jì)階段的任務(wù)是概要地回答系統(tǒng)應(yīng)該如何實(shí)現(xiàn),因此要把握與詳細(xì)設(shè)計(jì)的區(qū)別,并完成如下任務(wù)。第6章軟件總體設(shè)計(jì)1.軟件系統(tǒng)結(jié)構(gòu)設(shè)計(jì)按照結(jié)構(gòu)化理論,實(shí)現(xiàn)一個(gè)系統(tǒng)目標(biāo)需要程序和數(shù)據(jù)。所以,必須設(shè)計(jì)出組成這個(gè)系統(tǒng)的所有程序結(jié)構(gòu)和數(shù)據(jù)庫(kù)文件。具體方法如下:采用某種設(shè)計(jì)方法,將一個(gè)復(fù)雜的系統(tǒng)按功能劃分成模塊。確定每個(gè)模塊的功能。確定模塊之間的調(diào)用關(guān)系。確定模塊之間的接口,即模塊之間傳遞的信息。評(píng)價(jià)模塊結(jié)構(gòu)的質(zhì)量。第6章軟件總體設(shè)計(jì)基于結(jié)構(gòu)化理論的軟件結(jié)構(gòu)設(shè)計(jì)是以模塊為基礎(chǔ)的。在需求分析階段,通過(guò)某種分析方法已經(jīng)把系統(tǒng)分解成層次結(jié)構(gòu)。在設(shè)計(jì)階段,以需求分析的結(jié)果為依據(jù),從實(shí)現(xiàn)的角度將需求分析的結(jié)果映射為模塊,并組成模塊的層次結(jié)構(gòu)??傮w設(shè)計(jì)的關(guān)鍵是軟件結(jié)構(gòu)的設(shè)計(jì),它直接影響到詳細(xì)設(shè)計(jì)與編碼的工作。軟件結(jié)構(gòu)設(shè)計(jì)中要決定軟件系統(tǒng)的質(zhì)量及一些整體特性。因此,軟件結(jié)構(gòu)的設(shè)計(jì)應(yīng)由經(jīng)驗(yàn)豐富的人員采用一定的設(shè)計(jì)方法,選取合理的設(shè)計(jì)方案來(lái)完成。第6章軟件總體設(shè)計(jì)2.?dāng)?shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)設(shè)計(jì)在結(jié)構(gòu)化理論下的軟件系統(tǒng)中,數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫(kù)設(shè)計(jì)是非常重要的。數(shù)據(jù)庫(kù)技術(shù)是一項(xiàng)專門(mén)的技術(shù),不是本書(shū)討

論的范圍。但是作為軟件開(kāi)發(fā)人員要知道,在大型數(shù)據(jù)處理

系統(tǒng)的功能分析與設(shè)計(jì)中,是要進(jìn)行數(shù)據(jù)分析與數(shù)據(jù)設(shè)計(jì)的。1)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)根據(jù)需求分析階段對(duì)系統(tǒng)數(shù)據(jù)的組成、操作約束和數(shù)據(jù)之間的關(guān)系的描述,確定數(shù)據(jù)結(jié)構(gòu)特性??傮w設(shè)計(jì)階段利用逐步細(xì)化的方法對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行深入的設(shè)計(jì),但是也不是像詳細(xì)設(shè)計(jì)那樣規(guī)定具體的實(shí)現(xiàn)細(xì)節(jié)。在總體設(shè)計(jì)階段,比較適宜使用抽象的數(shù)據(jù)類型,這些抽象的數(shù)據(jù)類型到詳細(xì)設(shè)計(jì)階段再用具體的數(shù)據(jù)結(jié)構(gòu)描述其實(shí)現(xiàn)。如“?!笔菙?shù)據(jù)結(jié)構(gòu)的第6章軟件總體設(shè)計(jì)概念模型,在詳細(xì)設(shè)計(jì)中可用線性表和鏈表來(lái)實(shí)現(xiàn)。設(shè)計(jì)有效的數(shù)據(jù)結(jié)構(gòu),將大大簡(jiǎn)化軟件模塊處理過(guò)程的設(shè)計(jì)。2)數(shù)據(jù)庫(kù)的設(shè)計(jì)一般的軟件系統(tǒng)都有數(shù)據(jù)的存儲(chǔ),存儲(chǔ)要借助數(shù)據(jù)庫(kù)技術(shù)。數(shù)據(jù)庫(kù)的設(shè)計(jì)是指數(shù)據(jù)存儲(chǔ)文件的設(shè)計(jì)。設(shè)計(jì)包括以下三個(gè)方面:(1)概念設(shè)計(jì)。在數(shù)據(jù)分析的基礎(chǔ)上,從用戶角度采用自底向上的方法進(jìn)行視圖設(shè)計(jì)。一般用E-R模型來(lái)表示數(shù)據(jù)

模型,這是一個(gè)概念模型。E-R模型既是設(shè)計(jì)數(shù)據(jù)庫(kù)的基礎(chǔ),也是設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。IDEF

lx技術(shù)也支持概念模式,

用IDEF

lx方法建立系統(tǒng)的信息模型,使其具有一致性、可

擴(kuò)展性和可變性等特性,該模型可作為數(shù)據(jù)庫(kù)設(shè)計(jì)的主要依據(jù)。第6章軟件總體設(shè)計(jì)邏輯設(shè)計(jì)。E-R模型或IDEF

lx模型是獨(dú)立于數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)的,要結(jié)合具體的DBMS特征來(lái)建立數(shù)據(jù)

庫(kù)的邏輯結(jié)構(gòu)。對(duì)于關(guān)系型的DBMS來(lái)說(shuō),將概念結(jié)構(gòu)轉(zhuǎn)換為數(shù)據(jù)模式、子模式并進(jìn)行規(guī)范,要給出數(shù)據(jù)結(jié)構(gòu)的定義,即定義所含的數(shù)據(jù)項(xiàng)、類型、長(zhǎng)度及它們之間的層次或相互關(guān)系的表格等。物理設(shè)計(jì)。對(duì)于不同的DBMS,物理環(huán)境不同,提

供的存儲(chǔ)結(jié)構(gòu)與存取方法也各不相同。物理設(shè)計(jì)就是設(shè)計(jì)數(shù)據(jù)模式的一些物理細(xì)節(jié),如數(shù)據(jù)項(xiàng)存儲(chǔ)要求、存取方式和索引的建立等。第6章軟件總體設(shè)計(jì)網(wǎng)絡(luò)系統(tǒng)設(shè)計(jì)如果采用的是網(wǎng)絡(luò)環(huán)境,則要進(jìn)行網(wǎng)絡(luò)系統(tǒng)的設(shè)計(jì)。要分析網(wǎng)絡(luò)負(fù)荷與容量,遵照網(wǎng)絡(luò)系統(tǒng)設(shè)計(jì)原則,確定網(wǎng)絡(luò)系統(tǒng)的需求。要進(jìn)行網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì),選擇好網(wǎng)絡(luò)操作系統(tǒng),確定網(wǎng)絡(luò)系統(tǒng)配置,制定網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。軟件總體設(shè)計(jì)文檔總體設(shè)計(jì)說(shuō)明書(shū)是總體設(shè)計(jì)階段結(jié)束時(shí)提交的技術(shù)文檔。按國(guó)標(biāo)GB8576—88的《計(jì)算機(jī)軟件產(chǎn)品開(kāi)發(fā)文件編制指南》規(guī)定,軟件設(shè)計(jì)文檔可分為“總體設(shè)計(jì)說(shuō)明書(shū)”、“詳細(xì)設(shè)計(jì)說(shuō)明書(shū)”和“數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū)”。這些文檔的內(nèi)容與格式請(qǐng)參考有關(guān)資料。第6章軟件總體設(shè)計(jì)5.評(píng)審在該階段,對(duì)設(shè)計(jì)部分是否完整地實(shí)現(xiàn)了需求中規(guī)定的功能、性能等要求,設(shè)計(jì)方案的可行性、關(guān)鍵的處理及內(nèi)外部接口定義正確性、有效性以及各部分之間的一致性等,都需要進(jìn)行一一評(píng)審。第6章軟件總體設(shè)計(jì)6.4

設(shè)計(jì)基本原理軟件設(shè)計(jì)要回答下列問(wèn)題:使用什么樣的準(zhǔn)則才能把軟件劃分成為各個(gè)單獨(dú)的構(gòu)件?怎樣把功能或數(shù)據(jù)結(jié)構(gòu)的細(xì)節(jié)從軟件概念表達(dá)式中分離出來(lái)?定義軟件設(shè)計(jì)的技術(shù)質(zhì)量有統(tǒng)一的準(zhǔn)則嗎?軟件設(shè)計(jì)中最重要的一個(gè)問(wèn)題就是軟件質(zhì)量問(wèn)題,用什么標(biāo)準(zhǔn)對(duì)軟件設(shè)計(jì)的技術(shù)質(zhì)量進(jìn)行衡量呢?本節(jié)將介紹軟件發(fā)展中應(yīng)用過(guò)并經(jīng)過(guò)時(shí)間考驗(yàn)的軟件設(shè)計(jì)的一些基本原理。第6章軟件總體設(shè)計(jì)6.4.1抽象抽象是認(rèn)識(shí)復(fù)雜現(xiàn)象過(guò)程中使用的思維工具,即抽出事物本質(zhì)的共同特性而暫不考慮它的細(xì)節(jié)及其他因素。當(dāng)考慮用模塊化的方法解決問(wèn)題時(shí),可以提出不同層次的抽象(Levels

of

Abstraction)。在抽象的最高層,可以使用問(wèn)題環(huán)境的語(yǔ)言,以概括的方式敘述問(wèn)題的解。在抽象的較低層,則采用更過(guò)程化的方法,在描述問(wèn)題解時(shí)將面向問(wèn)題的術(shù)語(yǔ)與面向?qū)崿F(xiàn)的術(shù)語(yǔ)結(jié)合使用。最終,在抽象的最底層,可以用直接實(shí)現(xiàn)的方式來(lái)說(shuō)明。軟件工程實(shí)施中的每一步都可以看做是對(duì)軟件抽象層次的一次細(xì)化。第6章軟件總體設(shè)計(jì)隨著對(duì)抽象不同層次的展開(kāi),過(guò)程抽象(ProceduralAbstraction)和數(shù)據(jù)抽象(Data

Abstraction)就建立了。所謂過(guò)程抽象,是指一個(gè)命名的指令序列,它具有一個(gè)特定的和受限的功能。例如有一個(gè)進(jìn)入某場(chǎng)合的詞“入口”,對(duì)于這個(gè)詞進(jìn)行分析,會(huì)發(fā)現(xiàn)其隱含了走到門(mén)口、伸出手、握住門(mén)把、旋轉(zhuǎn)門(mén)把和推門(mén)、走進(jìn)門(mén)的一系列的過(guò)程序列。數(shù)據(jù)抽象則是一個(gè)已命名的說(shuō)明數(shù)據(jù)對(duì)象的數(shù)據(jù)集合。例如一個(gè)部門(mén)員工的“工資單”這個(gè)數(shù)據(jù)對(duì)象,實(shí)際上是許多不同方面的信息,如單位、姓名、工資總額、扣除房租、水電費(fèi)、煤氣費(fèi)、電話費(fèi)、電視費(fèi)、實(shí)得金額等的集合。在說(shuō)明這個(gè)數(shù)據(jù)抽象名時(shí),指的是所有數(shù)據(jù)??刂瞥橄?Control

Abstraction)是軟件設(shè)計(jì)中的第三種抽象形式。像過(guò)程抽象和數(shù)據(jù)抽象一樣,。第6章軟件總體設(shè)計(jì)控制抽象隱含了程序控制機(jī)制,不必說(shuō)明它的內(nèi)部細(xì)節(jié)??刂瞥橄蟮睦邮遣僮飨到y(tǒng)中用于進(jìn)程協(xié)調(diào)活動(dòng)的同步信號(hào)標(biāo)。許多編程語(yǔ)言(如Ada、MODULA、CLU)都給出了建立抽象數(shù)據(jù)類型的機(jī)制(mechanisms)。例如,Ada的包(package)就是一種支持?jǐn)?shù)據(jù)抽象和過(guò)程的編程語(yǔ)言機(jī)制。這種最初的

抽象數(shù)據(jù)類型可以用作模板(template)或類屬(generic)數(shù)據(jù)結(jié)構(gòu),由此導(dǎo)出的其他數(shù)據(jù)結(jié)構(gòu)可以是它們的實(shí)例。第6章軟件總體設(shè)計(jì)6.4.2細(xì)化逐步細(xì)化是一種自頂向下的設(shè)計(jì)策略。程序的體系結(jié)構(gòu)開(kāi)發(fā)是由過(guò)程細(xì)節(jié)層次不斷地細(xì)化而成的。分層的開(kāi)發(fā)則是以逐步的方式由分解一個(gè)宏功能直到獲得編程語(yǔ)言語(yǔ)句。在細(xì)化的每一步,已給定的程序的一條或幾條指令被分解為更多細(xì)節(jié)的指令。當(dāng)所有指令按計(jì)算機(jī)或編程語(yǔ)言寫(xiě)成時(shí),這樣不斷的分解或規(guī)格說(shuō)明的細(xì)化也將終止。隨著任務(wù)的細(xì)化,數(shù)據(jù)也要細(xì)化、分解或結(jié)構(gòu)化。程序的細(xì)化和數(shù)據(jù)的說(shuō)明一并進(jìn)行。每一步細(xì)化都隱含著一定的設(shè)計(jì)決策。重要的是程序員應(yīng)當(dāng)通曉一些最基本的準(zhǔn)則和存在的可選方案。第6章軟件總體設(shè)計(jì)細(xì)化實(shí)際上是一個(gè)詳細(xì)描述(elaboration)的過(guò)程。在高層抽象定義時(shí),從功能說(shuō)明或信息描述開(kāi)始,就是說(shuō)明功能或信息的概念,而不給出功能內(nèi)部的工作細(xì)節(jié)或信息的內(nèi)部結(jié)構(gòu)。細(xì)化則是設(shè)計(jì)者在原始說(shuō)明的基礎(chǔ)上進(jìn)行詳細(xì)說(shuō)明,隨著不斷的細(xì)化(詳細(xì)說(shuō)明)給出更多的細(xì)節(jié)。6.4.3模塊化在計(jì)算機(jī)軟件中,幾乎所有的軟件體系結(jié)構(gòu)都要體現(xiàn)模塊(module)化。也就是說(shuō),所有的軟件結(jié)構(gòu)設(shè)計(jì)技術(shù)都是以模塊化為基礎(chǔ)的。模塊以單獨(dú)命名和可編址的構(gòu)件被集成,以滿足問(wèn)題的需求。第6章軟件總體設(shè)計(jì)模塊化的概念在程序設(shè)計(jì)技術(shù)中就出現(xiàn)了。何為模塊?模塊在程序中是數(shù)據(jù)說(shuō)明、可執(zhí)行語(yǔ)句等程序?qū)ο蟮募?,或者是單?dú)命名和編址的元素,如高級(jí)語(yǔ)言中的過(guò)程、函數(shù)和子程序等。在軟件體系結(jié)構(gòu)中,模塊是可組合、分解和更換的單元。模塊具有以下幾種基本屬性:接口:模塊的輸入與輸出。功能:模塊實(shí)現(xiàn)什么功能。邏輯:描述內(nèi)部如何實(shí)現(xiàn)要求的功能及所需的數(shù)據(jù)。狀態(tài):該模塊的運(yùn)行環(huán)境,即模塊的調(diào)用與被調(diào)用關(guān)系。功能、狀態(tài)與接口反映模塊的外部特性,邏輯反映它的內(nèi)部特性。第6章軟件總體設(shè)計(jì)模塊化是指解決一個(gè)復(fù)雜問(wèn)題時(shí)自頂向下逐層把軟件系統(tǒng)劃分成若干模塊的過(guò)程。每個(gè)模塊完成一個(gè)特定的子功能,所有的模塊按某種方法組裝起來(lái),成為一個(gè)整體,完成整個(gè)系統(tǒng)所要求的功能。在面向?qū)ο笤O(shè)計(jì)中,模塊和模塊化的概念將進(jìn)一步擴(kuò)充。模塊化是軟件解決復(fù)雜問(wèn)題所具備的手段,也是軟件的一個(gè)重要屬性,它使得一個(gè)程序易于被人們所理解、設(shè)計(jì)、測(cè)試和維護(hù)。如果一個(gè)軟件就是一個(gè)模塊,是很難讓人理解的。因?yàn)?,?duì)這么多的控制路徑、這么廣的涉及范圍、這么大量的變量、這么復(fù)雜的軟件進(jìn)行了解、處理和管理幾乎是不可能的。為了說(shuō)明這一點(diǎn),請(qǐng)看下面的論據(jù)。第6章軟件總體設(shè)計(jì)設(shè)問(wèn)題x的復(fù)雜性函數(shù)為C(x),解決它所需的工作量函數(shù)為E(x)。對(duì)于問(wèn)題P1和P2,如果有C(P1)

>

C(P2)即P1比P2復(fù)雜,那么E(P1)

>

E(P2)即問(wèn)題越復(fù)雜,所需要的工作量越大。根據(jù)解決一般問(wèn)題的經(jīng)驗(yàn),規(guī)律為:C(P1

+

P2)

>

C(P1)

+

C(P2)即一個(gè)問(wèn)題同問(wèn)題組合而成的復(fù)雜度大于分別考慮每個(gè)問(wèn)題的復(fù)雜度之和。這樣,可以推出:E(P1

+

P2)

>

E(P1)

+

E(P2)第6章軟件總體設(shè)計(jì)所得結(jié)果對(duì)于模塊化和軟件具有重要的意義。那么,從上面所得的不等式是否可以得出這樣的結(jié)論:如果把軟件無(wú)限細(xì)分,那么最后開(kāi)發(fā)軟件所需要的工作量就小得可以忽略了。但是,事實(shí)上,影響軟件開(kāi)發(fā)工作量的因素還有許多,例如模塊接口費(fèi)用等,所以上述結(jié)論不能成立。因?yàn)?,隨著模塊數(shù)目的增加,模塊之間的接口的復(fù)雜程度和接口所需的工作量也在隨之增加。上述不等式只能說(shuō)明:當(dāng)模塊總數(shù)增加時(shí),單獨(dú)開(kāi)發(fā)各個(gè)子模塊的工作量之和會(huì)有所減少。根據(jù)這兩個(gè)因素之間的關(guān)系,可以畫(huà)出工作量或成本曲線圖,如圖5.2所示,從圖中所示的曲線看,存在著一個(gè)工作量最小或開(kāi)發(fā)成本最小的模塊數(shù)目M區(qū)。第6章軟件總體設(shè)計(jì)雖然現(xiàn)在還沒(méi)有辦法算出M的準(zhǔn)確數(shù)值,但在考慮模塊時(shí),軟件總成本曲線確實(shí)提供了非常有用的指導(dǎo)。這就是在模塊化的過(guò)程中,必須減少接口的復(fù)雜性。應(yīng)當(dāng)指出,一個(gè)系統(tǒng)按模塊化的概念來(lái)設(shè)計(jì)非常重要,即使它的實(shí)現(xiàn)必須是整體結(jié)構(gòu)(monolithic)。有這樣的情況(如實(shí)時(shí)軟件/微處理器軟件):由于子程序(如子例程、過(guò)程)的引入,而使極低的速度和過(guò)大的內(nèi)存開(kāi)銷(xiāo)變得不可接受。在這種情況下,也應(yīng)當(dāng)把軟件的模塊化設(shè)計(jì)作為最基本的準(zhǔn)則。代碼可以逐行編寫(xiě),縱然程序的源代碼初看起來(lái)不是模塊,但模塊化的準(zhǔn)則應(yīng)當(dāng)保持,這樣的程序?qū)?huì)有模塊系統(tǒng)的所有好處。第6章軟件總體設(shè)計(jì)圖5.2是軟件模塊數(shù)量、模塊集成成本、模塊成本總和及軟件總成本的關(guān)系。從圖中可以看出,隨著模塊數(shù)量的增加,模塊開(kāi)發(fā)成本之和是減少了,但是模塊集成成本之和卻增加了,所以,模塊數(shù)量必須適中。圖中M區(qū)是一個(gè)使軟件開(kāi)發(fā)總工作量最小的曲線區(qū)。事實(shí)上,圖5.2中所謂的軟件總成本也只考慮模塊集成成本和子模塊開(kāi)發(fā)成本。模塊的劃分、設(shè)計(jì)還需要遵循其他設(shè)計(jì)原則。下面將介紹模塊設(shè)計(jì)的基本方法和優(yōu)化原則。第6章軟件總體設(shè)計(jì)6.4.4軟件體系結(jié)構(gòu)軟件總體設(shè)計(jì)的主要任務(wù)就是軟件結(jié)構(gòu)的設(shè)計(jì)。軟件體系結(jié)構(gòu)(software

architecture)包含了計(jì)算機(jī)程序的兩個(gè)重要特性:過(guò)程構(gòu)件(模塊)的層次結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)。軟件體系結(jié)構(gòu)通過(guò)過(guò)程的劃分來(lái)導(dǎo)出,而這個(gè)過(guò)程與需求分析時(shí)定義的真實(shí)世界問(wèn)題各部分的軟件解有關(guān)。軟件結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的演化(evolution)從問(wèn)題定義開(kāi)始。當(dāng)問(wèn)題的各部分分別由一個(gè)或多個(gè)軟件元素求解時(shí),問(wèn)題解也就有了。圖6.4給出了象征性的表示,它表示了軟件需求分析到設(shè)計(jì)

的轉(zhuǎn)換。第6章軟件總體設(shè)計(jì)圖6.4結(jié)構(gòu)化演化第6章軟件總體設(shè)計(jì)從圖6.5可以看出,一個(gè)問(wèn)題可以有多種可供選擇的結(jié)構(gòu),而選擇某種結(jié)構(gòu)又由軟件設(shè)計(jì)方法來(lái)確定。圖6.5不同結(jié)構(gòu)第6章軟件總體設(shè)計(jì)由此可以看出,由于各種設(shè)計(jì)方法的原理不同,同一個(gè)軟件需求也會(huì)導(dǎo)出不同的軟件結(jié)構(gòu)。那么,當(dāng)一個(gè)問(wèn)題的軟件結(jié)構(gòu)導(dǎo)出后,如何評(píng)價(jià)其不同結(jié)構(gòu)的優(yōu)劣?沒(méi)有一個(gè)形式化的準(zhǔn)則,就很難回答這個(gè)問(wèn)題。目前還不能對(duì)導(dǎo)出的軟件結(jié)構(gòu)做出準(zhǔn)確的定量評(píng)價(jià),但是在稍后部分討論體系結(jié)構(gòu)設(shè)計(jì)的結(jié)構(gòu)特征時(shí),可以通過(guò)分析的方法來(lái)確定它們的整體質(zhì)量。第6章軟件總體設(shè)計(jì)6.4.5程序結(jié)構(gòu)程序結(jié)構(gòu)(program

structure)給出了程序構(gòu)件(模塊)的組織(通常叫分層),這種組織包含了控制的層次。但是,它們不給出軟件的過(guò)程方面,如過(guò)程的序列、決策的出現(xiàn)或次序、操作的重復(fù)等。程序結(jié)構(gòu)可以用許多不同的符號(hào)來(lái)表示,最常用的是如圖6.6所示的樹(shù)形結(jié)構(gòu)圖。其他符號(hào),如具有相同作用的Warnier-Orr圖和Jackson圖也可以使用。為了討論結(jié)構(gòu)的方便,定義了一些簡(jiǎn)單的度量和術(shù)語(yǔ),如圖6.6所示。從圖6.6可以看出,深度(depth)表示控制的層次,寬度(width)表示同一層次上控制的最大數(shù),扇出(fan-out)是對(duì)一個(gè)模塊直接控制其他模塊數(shù)目的度量,扇入(fan-in)則是對(duì)一個(gè)給定模塊被多少個(gè)模塊直接控制的度量。第6章軟件總體設(shè)計(jì)圖6.6結(jié)構(gòu)專用名詞第6章軟件總體設(shè)計(jì)模塊之間的控制關(guān)系可用下面的方法表示:控制另一模塊的模塊叫做上級(jí)模塊(superordinate)。反過(guò)來(lái),被另一模塊控制的模塊叫做從屬模塊(subordinate)。例如圖6.6中,模塊m是模塊n、o、p、q的上級(jí)模塊,模塊f、g既是模塊d的從屬模塊,同時(shí)也是模塊M的從屬模塊。寬度方向上的關(guān)系(如模塊d與e)雖然也可以表示,但無(wú)需用明確的專門(mén)名詞來(lái)定義。根據(jù)圖6.6,可以給出軟件體系結(jié)構(gòu)特征:可見(jiàn)性(visibility)和連接性(connectivity)??梢?jiàn)性表明該程序構(gòu)件合可以引用或使用一個(gè)給定構(gòu)件作為數(shù)據(jù),即使是間接完成時(shí)也是如此。而連接性表明該構(gòu)件集合直接引用或使用一個(gè)給定構(gòu)件作為數(shù)據(jù)。這兩種特征是難以分辨的。第6章軟件總體設(shè)計(jì)6.4.6數(shù)據(jù)結(jié)構(gòu)在軟件體系結(jié)構(gòu)的表達(dá)式中,數(shù)據(jù)結(jié)構(gòu)與程序結(jié)構(gòu)同樣重要。數(shù)據(jù)結(jié)構(gòu)決定信息的組織、存取方法、結(jié)合的程度以

及可選的處理方法。這里只給出一些概念,因?yàn)楦玫乩斫?/p>

這些傳統(tǒng)的組織信息的方法,以及怎樣從基層支持信息層次

的概念都是重要的。對(duì)此不深入討論,僅給出數(shù)據(jù)結(jié)構(gòu)(data

structure)的定義,它是一種數(shù)據(jù)各元素之間邏輯關(guān)系的表達(dá)式。一個(gè)數(shù)據(jù)結(jié)構(gòu)的組織和復(fù)雜性只受設(shè)計(jì)者創(chuàng)造性的限制。但是典型的數(shù)據(jù)結(jié)構(gòu)可以組成更復(fù)雜的結(jié)構(gòu)模塊。這些典型的數(shù)據(jù)結(jié)構(gòu)如圖6.7所示。第6章軟件總體設(shè)計(jì)圖6.7典型的數(shù)據(jù)結(jié)構(gòu)第6章軟件總體設(shè)計(jì)標(biāo)量項(xiàng)(scalar

item)表示一個(gè)用標(biāo)識(shí)符標(biāo)識(shí)的單元信息元素。也就是說(shuō),它在存儲(chǔ)器中用一個(gè)確定的單一地址就可得到。一個(gè)標(biāo)量項(xiàng)是所有數(shù)據(jù)結(jié)構(gòu)中最簡(jiǎn)單的一種。標(biāo)量項(xiàng)的規(guī)模和格式在一種編程語(yǔ)言中所確定的邊界內(nèi)可以有變化。例如,標(biāo)量項(xiàng)可以是一個(gè)長(zhǎng)度為1位的邏輯實(shí)體,或者是一個(gè)長(zhǎng)度為8位到64位的整型數(shù)或浮點(diǎn)數(shù),甚至是一個(gè)長(zhǎng)度為幾百或幾千字節(jié)的字符串。當(dāng)組織標(biāo)量項(xiàng)作為一列或連接的組時(shí),就形成一個(gè)順序向量(sequential

vector)。向量是數(shù)據(jù)結(jié)構(gòu)中最常用的。例如下面這個(gè)C語(yǔ)言程序段的例子:第6章軟件總體設(shè)計(jì)第6章軟件總體設(shè)計(jì)例子中定義aa為100個(gè)標(biāo)量整數(shù)項(xiàng)的順序向量。在過(guò)程ps中標(biāo)引aa的每個(gè)元素的存儲(chǔ),這樣數(shù)據(jù)結(jié)構(gòu)的每個(gè)元素都可按定義的順序引用。如果把順序向量擴(kuò)展為多維,就構(gòu)成了一個(gè)n維的空間(n-dimensional

space)。在大多數(shù)編程語(yǔ)言中,把n維空間叫做數(shù)組(array)。標(biāo)量、向量和空間可以用不同的格式組織。鏈表(1inked

list)就是一種非鄰接的標(biāo)量的組織。向量或空間用一定的方式能使它們作為一個(gè)表來(lái)處理。每個(gè)結(jié)點(diǎn)具有適當(dāng)?shù)慕M織、一個(gè)或多個(gè)指針,這個(gè)指針表明表中下一個(gè)結(jié)點(diǎn)在結(jié)點(diǎn)存儲(chǔ)器中的地址。在鏈表的結(jié)構(gòu)中,為了適應(yīng)新表入口的需要,可以在表中的任意點(diǎn)上增加重新定義的指針。第6章軟件總體設(shè)計(jì)利用上述的基本數(shù)據(jù)結(jié)構(gòu)可以構(gòu)造出其他的數(shù)據(jù)結(jié)構(gòu)。例如,使用包含標(biāo)量項(xiàng)、向量和可能的n維空間的多鏈表可以實(shí)現(xiàn)層次的數(shù)據(jù)結(jié)構(gòu)(hierarchical

data

structure)。層次型的結(jié)構(gòu)通常在要求信息分類和組合性中應(yīng)用。信息分類包含了一些類屬分類;組合性包含從不同的類組合信息的能力。例如,在微處理器中找出所有價(jià)格低于1000美元,主頻1GHz和銷(xiāo)售商的條目種類就是組合性要求。數(shù)據(jù)結(jié)構(gòu)可以給出不同層次的抽象。例如,棧(stack)是數(shù)據(jù)結(jié)構(gòu)的一個(gè)概念模型,它可以由向量或鏈表來(lái)實(shí)現(xiàn)。棧內(nèi)部的工作情況決定于設(shè)計(jì)細(xì)節(jié)的層次,可以說(shuō)明,也可以不說(shuō)明。第6章軟件總體設(shè)計(jì)6.4.7軟件過(guò)程在討論軟件結(jié)構(gòu)時(shí)不考慮處理和決策,以及順序定義的控制層次。而軟件過(guò)程(software

procedure)(如圖6.8所示)則側(cè)重于每一個(gè)單獨(dú)模塊的處理細(xì)節(jié)研究。過(guò)程必須提供精確的事件的順序、確切的抉擇點(diǎn)、重復(fù)的操作以及數(shù)據(jù)的組織與結(jié)構(gòu)處理規(guī)格說(shuō)明。第6章軟件總體設(shè)計(jì)圖6.8一個(gè)模塊內(nèi)的過(guò)程第6章軟件總體設(shè)計(jì)當(dāng)然,結(jié)構(gòu)與過(guò)程是相互關(guān)聯(lián)的。對(duì)每個(gè)模塊所規(guī)定的處理必須包括說(shuō)明該模塊的所有從屬模塊。軟件過(guò)程的表示也是分層的,如圖6.9所示。第6章軟件總體設(shè)計(jì)圖6.9過(guò)程的分層第6章軟件總體設(shè)計(jì)過(guò)程設(shè)計(jì)中要用到模塊。規(guī)定和設(shè)計(jì)模塊應(yīng)當(dāng)包含模塊內(nèi)的過(guò)程和數(shù)據(jù)的信息,對(duì)于其他不需要這些信息的模塊是不可訪問(wèn)的。有效的模塊化可以通過(guò)定義的一組獨(dú)立的模塊來(lái)達(dá)到。獨(dú)立的模塊彼此之間僅僅交換那些為了完成系統(tǒng)功能所必需的信息。因?yàn)榻^大多數(shù)的數(shù)據(jù)和過(guò)程是軟件其他部分不可訪問(wèn)的,這樣規(guī)定和設(shè)計(jì)的模塊會(huì)帶來(lái)極大的好處。第6章軟件總體設(shè)計(jì)6.5

體系結(jié)構(gòu)設(shè)計(jì)6.5.1軟件結(jié)構(gòu)圖軟件結(jié)構(gòu)圖是軟件系統(tǒng)的模塊層次結(jié)構(gòu),反映了整個(gè)系統(tǒng)的功能實(shí)現(xiàn),即將來(lái)程序的控制層次體系。對(duì)于一個(gè)“問(wèn)題”,可用不同的軟件結(jié)構(gòu)來(lái)解決。使用不同的設(shè)計(jì)方法、不同的劃分和組織,可得出不同的軟件結(jié)構(gòu)。軟件結(jié)構(gòu)往往用樹(shù)狀或網(wǎng)狀結(jié)構(gòu)的圖形來(lái)表示。軟件工程中,一般采用20世紀(jì)70年代中期美國(guó)Yourdon等提出的稱為結(jié)構(gòu)圖(Structure

Chart,SC)的工具來(lái)表示軟件結(jié)構(gòu)。結(jié)構(gòu)圖的主要內(nèi)容有以下幾種。第6章軟件總體設(shè)計(jì)模塊模塊用方框表示,并用名字標(biāo)識(shí)該模塊,名字應(yīng)體現(xiàn)該模塊的功能。模塊的控制關(guān)系兩個(gè)模塊間用單向箭頭或直線連接起來(lái)表示它們的控制關(guān)系,如圖6.10所示。按照慣例,總是位于圖中上方的模塊調(diào)用下方的模塊,所以不用箭頭也不會(huì)產(chǎn)生二義性。調(diào)用模塊和被調(diào)用模塊的關(guān)系稱為上屬與下屬的關(guān)系,或者稱為“統(tǒng)率”與“從屬”的關(guān)系。在圖6.6中,模塊M統(tǒng)率模塊a、b、c,模塊d從屬于模塊a,也從屬于M。第6章軟件總體設(shè)計(jì)圖6.10模塊間的控制關(guān)系及信息傳遞第6章軟件總體設(shè)計(jì)模塊間的信息傳遞模塊間還經(jīng)常用帶注釋的短箭頭表示模塊調(diào)用過(guò)程中來(lái)回傳遞的信息,如圖6.10所示。兩個(gè)附加符號(hào)用兩個(gè)附加符號(hào)表示模塊有選擇調(diào)用或循環(huán)調(diào)用,如圖6.11所示。第6章軟件總體設(shè)計(jì)圖6.11選擇調(diào)用和循環(huán)調(diào)用的表示(a)選擇調(diào)用;(b)循環(huán)調(diào)用第6章軟件總體設(shè)計(jì)圖6.11(a)的A模塊下方有一個(gè)菱形符號(hào),表示A中有判斷處理功能,它有條件地調(diào)用B或C;圖6.11(b)中M模塊下方有一個(gè)弧形箭頭,表示M循環(huán)調(diào)用T1、T2和T3模塊。5.結(jié)構(gòu)圖的形態(tài)特征為了討論結(jié)構(gòu)圖的特征,將如圖6.6所示的樹(shù)形結(jié)構(gòu)圖重畫(huà),如圖6.12所示。第6章軟件總體設(shè)計(jì)圖6.12結(jié)構(gòu)圖示例第6章軟件總體設(shè)計(jì)結(jié)構(gòu)圖的形態(tài)特征包括:深度:指結(jié)構(gòu)圖控制的層次,即模塊的層數(shù)。如圖

6.12所示,結(jié)構(gòu)圖的深度為5。寬度:指一層中最大的模塊個(gè)數(shù)。如圖6.12所示,寬度為8。扇出:指一個(gè)模塊直接下屬模塊的個(gè)數(shù)。如圖6.12所示,模塊M的扇出為3。扇入:指一個(gè)模塊直接上屬模塊的個(gè)數(shù)。如圖6.12所示,模塊T的扇入為4。第6章軟件總體設(shè)計(jì)6.畫(huà)結(jié)構(gòu)圖應(yīng)注意的事項(xiàng)同一名字的模塊在結(jié)構(gòu)圖中僅出現(xiàn)一次。調(diào)用關(guān)系只能從上到下。不嚴(yán)格表示模塊的調(diào)用次序,習(xí)慣上從左到右。有

時(shí)為了減少連線的交叉,適當(dāng)?shù)卣{(diào)整同一層模塊的左右位置,以保持結(jié)構(gòu)圖的清晰性。第6章軟件總體設(shè)計(jì)6.5.2模塊的大小前面在討論模塊設(shè)計(jì)的原理時(shí),已經(jīng)知道一個(gè)系統(tǒng)應(yīng)當(dāng)由若干個(gè)模塊構(gòu)成,其目的是為了降低系統(tǒng)的復(fù)雜度。但是并沒(méi)有一個(gè)明確的準(zhǔn)則說(shuō)明模塊應(yīng)當(dāng)多大才合適。有些教材上說(shuō)明一個(gè)模塊最好只包含50~60條語(yǔ)句(即可打印在一頁(yè)打印紙上),這是考慮到開(kāi)發(fā)人員能方便地對(duì)設(shè)計(jì)的模塊進(jìn)行閱讀和研究。如果模塊的規(guī)模增大為100條語(yǔ)句,甚至達(dá)到幾百條語(yǔ)句,那么閱讀和研究就比較困難了。目前,國(guó)內(nèi)外關(guān)于模塊大小的規(guī)定也不一樣,最多允許一個(gè)模塊含有500條語(yǔ)句。但是過(guò)小的模塊也不一定好,因?yàn)檎{(diào)用子程序入口和出口需要做附加操作。如果接口復(fù)雜,這種附加操作可能比子程序本身的操作還要多,這樣就不合適。第6章軟件總體設(shè)計(jì)模塊設(shè)計(jì)的準(zhǔn)則不應(yīng)該看語(yǔ)句的多少,而應(yīng)當(dāng)看模塊是否是一個(gè)獨(dú)立的功能。如果多個(gè)上級(jí)模塊需要調(diào)用一個(gè)模塊,若不將該模塊設(shè)計(jì)為單獨(dú)模塊,就要重復(fù)多次,這樣不僅使程序增大,測(cè)試和維護(hù)也不方便。在這種情況下,防止影響運(yùn)行速度的方法可以用類似于C語(yǔ)言的include語(yǔ)句或匯編語(yǔ)言中的宏功能來(lái)解決。第6章軟件總體設(shè)計(jì)6.5.3扇出和扇入與深度和寬度由結(jié)構(gòu)圖的形態(tài)特征可以知道,一個(gè)系統(tǒng)的大小和系統(tǒng)的復(fù)雜度在一定程度上可以用深度和寬度表示。因此可以推

理,系統(tǒng)越大越復(fù)雜,其深度和寬度也就越大。而深度與程

序的語(yǔ)句效率和模塊大小的劃分有關(guān)。設(shè)計(jì)者在結(jié)構(gòu)設(shè)計(jì)過(guò)

程中主要關(guān)心的是模塊的高聚合和低耦合,以及模塊的規(guī)模。所以,實(shí)際上,深度只是對(duì)結(jié)構(gòu)設(shè)計(jì)好壞的一種測(cè)度。例如

一個(gè)程序有100條語(yǔ)句,如果將其劃分為20個(gè)模塊并用20層來(lái)調(diào)用,則肯定分解過(guò)多。第6章軟件總體設(shè)計(jì)在討論寬度時(shí),注意到與其相關(guān)的最大因素是模塊的扇出。從圖6.6中了解到,如果扇出過(guò)大,則上級(jí)模塊需要過(guò)多地控制這些從屬模塊,反而會(huì)增加復(fù)雜性,而且也增加了設(shè)計(jì)人員在設(shè)計(jì)過(guò)程中的難度。根據(jù)歷史的經(jīng)驗(yàn),扇出一般最好控制在3~4個(gè),最高也不要超過(guò)6~7個(gè)。從討論深度的過(guò)程可以知道,扇出過(guò)小,會(huì)增加結(jié)構(gòu)的深度。扇出實(shí)際上是對(duì)問(wèn)題解的分解。分解過(guò)程中需要考慮的問(wèn)題就是,前面是否已經(jīng)有一個(gè)模塊與當(dāng)前所需要的模塊功能相同或相似。若完全相同,則可以共享;若功能類似,則應(yīng)區(qū)分哪些部分相同,這樣可以把相同的部分分離出來(lái)成為單獨(dú)的模塊,如圖6.13至圖6.15所示。第6章軟件總體設(shè)計(jì)圖6.13分解模塊一第6章軟件總體設(shè)計(jì)圖6.14分解模塊二第6章軟件總體設(shè)計(jì)圖6.15分解模塊三第6章軟件總體設(shè)計(jì)如圖6.13所示,Q2與已有的Q1相似;圖6.14把Q中相同

的部分分離出來(lái);圖6.15(a)中,如果Q很小,可并入X、Q2";圖6.15(b)中,如果Q也很小,則可以并入Y、X。大量的系統(tǒng)研究表明,高層模塊應(yīng)有較高的扇出,低層模塊特別是底層模塊應(yīng)有高的扇入。扇入越高,表示該模塊被更多的上級(jí)模塊共享。多個(gè)扇入口相同,這就避免了程序的重復(fù),因此希望扇入高一點(diǎn)。但扇入過(guò)高又可能是把許多不相關(guān)的功能硬湊在一起,形成通用模塊,這樣的模塊必然是低聚合的。第6章軟件總體設(shè)計(jì)6.5.4模塊的耦合耦合(Coupling)表示軟件結(jié)構(gòu)內(nèi)不同模塊彼此之間相互依賴(連接)的緊密程度,是衡量軟件模塊結(jié)構(gòu)質(zhì)量好壞的度量,是對(duì)模塊獨(dú)立性的直接衡量指標(biāo)。軟件設(shè)計(jì)應(yīng)追求松散耦合,避免強(qiáng)耦合。模塊的耦合越松散,模塊間的聯(lián)系就越小,模塊的獨(dú)立性就越強(qiáng)。這樣,對(duì)模塊測(cè)試、維護(hù)就越容易,錯(cuò)誤傳播的可能性也就越小。第6章軟件總體設(shè)計(jì)耦合強(qiáng)弱取決于模塊間接口的復(fù)雜程度,進(jìn)入或訪問(wèn)一個(gè)模塊的點(diǎn)以及通過(guò)接口的數(shù)據(jù)。如果兩個(gè)模塊中每個(gè)模塊都能獨(dú)立地工作,而不需要另一個(gè)模塊的存在,那么它們彼此之間完全獨(dú)立,即沒(méi)有任何聯(lián)系,也無(wú)所謂耦合可言。但是,在一個(gè)軟件系統(tǒng)內(nèi)不可能所有模塊之間都沒(méi)有任何連接。一般地,可以將模塊的耦合分成四類:數(shù)據(jù)耦合、控制耦合、公共環(huán)境耦合和內(nèi)容耦合。第6章軟件總體設(shè)計(jì)1.?dāng)?shù)據(jù)耦合如果兩個(gè)模塊彼此間通過(guò)參數(shù)交換信息,而且交換的信息僅僅是數(shù)據(jù),那么這種耦合稱為數(shù)據(jù)耦合。數(shù)據(jù)耦合是低耦合。系統(tǒng)中必須存在這種耦合,因?yàn)橹挥挟?dāng)某些模塊的輸出數(shù)據(jù)作為另一些模塊的輸入數(shù)據(jù)時(shí),系統(tǒng)才能完成有價(jià)值的功能。一般來(lái)說(shuō),一個(gè)系統(tǒng)內(nèi)可以只包含數(shù)據(jù)耦合。圖6.16說(shuō)明了模塊B與C的調(diào)用關(guān)系是數(shù)據(jù)耦合。第6章軟件總體設(shè)計(jì)圖6.16數(shù)據(jù)耦合第6章軟件總體設(shè)計(jì)2.控制耦合如果傳遞的信息中有控制信息,則這種耦合稱為控制耦合,如圖6.17所示。控制耦合是中等程度的耦合,它增加了系統(tǒng)的復(fù)雜程度??刂岂詈贤嵌嘤嗟?,在把模塊適當(dāng)分解之后通??梢杂脭?shù)據(jù)耦合代替它。例如,圖6.17中模塊B的內(nèi)部處理邏輯判斷是決定執(zhí)行F1、F2還是執(zhí)行Fn,這要取決于模塊A傳來(lái)的信息“標(biāo)志”Flag。第6章軟件總體設(shè)計(jì)圖6.17控制耦合第6章軟件總體設(shè)計(jì)3.公共環(huán)境耦合當(dāng)兩個(gè)或多個(gè)模塊通過(guò)一個(gè)公共數(shù)據(jù)環(huán)境相互作用時(shí),它們之間的耦合稱為公共環(huán)境耦合(即公用耦合)。公共環(huán)境可以是全局變量、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)、任何存儲(chǔ)介質(zhì)上的文件、物理設(shè)備等。公共環(huán)境耦合的復(fù)雜程度隨耦合的模塊個(gè)數(shù)而變化,當(dāng)耦合的模塊個(gè)數(shù)增加時(shí),復(fù)雜程度顯著增加。如果只有兩個(gè)模塊有公共環(huán)境,那么這種耦合有下述兩種可能,如圖6.18所示。第6章軟件總體設(shè)計(jì)圖6.18公用耦合(a)松散的公用耦合;(b)緊密的公用耦合第6章軟件總體設(shè)計(jì)一個(gè)模塊往公共環(huán)境送數(shù)據(jù),另一個(gè)模塊從公共環(huán)境取數(shù)據(jù),這是數(shù)據(jù)耦合的一種形式,是比較松散的耦合。兩個(gè)模塊都既往公共環(huán)境送數(shù)據(jù)又從里面取數(shù)據(jù),這種耦合比較緊密,介于數(shù)據(jù)耦合和控制耦合之間。如果兩個(gè)模塊共享的數(shù)據(jù)很多,都通過(guò)參數(shù)傳遞可能很不方便,這時(shí)可以利用公共環(huán)境耦合。4.內(nèi)容耦合最高程度的耦合是內(nèi)容耦合。如圖6.19所示,兩個(gè)模塊間就發(fā)生了內(nèi)容耦合。第6章軟件總體設(shè)計(jì)圖6.19內(nèi)容耦合(a)進(jìn)入另一塊內(nèi)部;(b)代碼重復(fù);(c)多入口第6章軟件總體設(shè)計(jì)一個(gè)模塊訪問(wèn)另一個(gè)模塊的內(nèi)部數(shù)據(jù);一個(gè)模塊不通過(guò)正常入口而轉(zhuǎn)到另一個(gè)模塊的內(nèi)部;兩個(gè)模塊有一部分代碼重疊(只可能出現(xiàn)在匯編程序中);一個(gè)模塊有多個(gè)入口(這表明一個(gè)模塊有幾種功能)。應(yīng)該堅(jiān)決避免使用內(nèi)容耦合。事實(shí)上許多高級(jí)程序設(shè)計(jì)語(yǔ)言已經(jīng)設(shè)計(jì)成不允許在程序中出現(xiàn)任何形式的內(nèi)容耦合??傊?,耦合是影響模塊結(jié)構(gòu)和軟件復(fù)雜程度的一個(gè)重要因素,應(yīng)該采用如下設(shè)計(jì)原則:盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共環(huán)境耦合,完全不用內(nèi)容耦合。第6章軟件總體設(shè)計(jì)6.5.5模塊的內(nèi)聚內(nèi)聚標(biāo)志一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,它是信息隱蔽和局部化概念的自然擴(kuò)展。簡(jiǎn)單地說(shuō),理想內(nèi)聚的模塊只做一件事情。設(shè)計(jì)時(shí)應(yīng)該力求做到高內(nèi)聚,通常中等程度的內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差不多,但是,低內(nèi)聚不要使用。內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往往意味著模塊間的耦合。內(nèi)聚和耦合都是進(jìn)行模塊化設(shè)計(jì)的有力工具,但是實(shí)踐表明內(nèi)聚更重要,應(yīng)該把更多注意力集中到提高模塊的內(nèi)聚程度上。第6章軟件總體設(shè)計(jì)根據(jù)模塊內(nèi)部的構(gòu)成情況,模塊的內(nèi)聚可以劃分成高、中、低三大類。常見(jiàn)的內(nèi)聚可分成功能內(nèi)聚、順序內(nèi)聚、通信內(nèi)聚、過(guò)程內(nèi)聚、時(shí)間內(nèi)聚、邏輯內(nèi)聚、偶然內(nèi)聚七類。它們的內(nèi)聚程度依次從高到低,一般認(rèn)為功能內(nèi)聚和順序內(nèi)聚是高內(nèi)聚,通信內(nèi)聚、過(guò)程內(nèi)聚是中內(nèi)聚,時(shí)間內(nèi)聚、邏輯內(nèi)聚和偶然內(nèi)聚是低內(nèi)聚。第6章軟件總體設(shè)計(jì)功能內(nèi)聚如果模塊內(nèi)所有的處理元素屬于一個(gè)整體,完成一個(gè)單一的功能,則稱模塊為功能內(nèi)聚。功能內(nèi)聚是最高程度的內(nèi)聚。信息內(nèi)聚信息內(nèi)聚模塊能完成多種功能,各個(gè)功能都在同一數(shù)據(jù)結(jié)構(gòu)上操作,每一項(xiàng)功能有一個(gè)唯一的入口點(diǎn)。例如圖6.20所示有四個(gè)功能,即這個(gè)模塊將根據(jù)不同的要求,確定該執(zhí)行哪一功能。第6章軟件總體設(shè)計(jì)圖6.20信息內(nèi)聚第6章軟件總體設(shè)計(jì)3.通信內(nèi)聚如果一個(gè)模塊中所有處理元素都使用同一個(gè)輸入數(shù)據(jù)和(或)產(chǎn)生同一個(gè)輸出數(shù)據(jù),則稱模塊為通信內(nèi)聚(Communicational

Cohesion)。例如圖6.21所示的模塊A的處理單元是由同一數(shù)據(jù)文件FILE的數(shù)據(jù)產(chǎn)生不同的表格。通信內(nèi)聚有時(shí)也稱數(shù)據(jù)內(nèi)聚。圖6.21通信內(nèi)聚第6章軟件總體設(shè)計(jì)4.過(guò)程內(nèi)聚如果一個(gè)模塊內(nèi)部的處理元素是相關(guān)的,而且必須以特定次序執(zhí)行,則稱模塊為過(guò)程內(nèi)聚。使用程序流程圖作為工具設(shè)計(jì)軟件時(shí),常常通過(guò)研究流程圖確定模塊的劃分,這樣得到的往往是過(guò)程內(nèi)聚的模塊。過(guò)程內(nèi)聚與順序內(nèi)聚的區(qū)別主要在于:順序內(nèi)聚中是數(shù)據(jù)流從一個(gè)處理元流到另一個(gè)處理元,而過(guò)程內(nèi)聚中是控制流從一個(gè)動(dòng)作流向另一個(gè)動(dòng)作。第6章軟件總體設(shè)計(jì)5.邏輯內(nèi)聚如果一個(gè)模塊完成的任務(wù)在邏輯上屬于相同或相似的一類,則稱模塊為邏輯內(nèi)聚(Logical

Cohesion)。對(duì)邏輯內(nèi)聚模塊的調(diào)用,常常需要有一個(gè)功能開(kāi)關(guān),由上層調(diào)用模塊向它發(fā)出一個(gè)控制信號(hào),在多個(gè)關(guān)聯(lián)性功能中選擇執(zhí)行某一個(gè)功能。這種內(nèi)聚較差,增加了模塊之間的聯(lián)系,不易修改。將圖6.22(a)中模塊A、B合并成圖6.22(b)中的模塊AB,那么AB就是一個(gè)邏輯內(nèi)聚模塊。在此結(jié)構(gòu)中必須增加一個(gè)開(kāi)關(guān)量傳遞,使這些模塊之間的聯(lián)系程度增加;此外還將增加修改難度,例如如果模塊X需要修改AB中的某共用段,而模塊Y卻不希望修改。第6章軟件總體設(shè)計(jì)圖6.22邏輯內(nèi)聚第6章軟件總體設(shè)計(jì)6.時(shí)間內(nèi)聚如果一個(gè)模塊包含的任務(wù)必須在同一段時(shí)間內(nèi)執(zhí)行,則稱模塊為時(shí)間內(nèi)聚。如圖6.23所示,緊急故障處理模塊中的

關(guān)閉文件、報(bào)警、保留現(xiàn)場(chǎng)等任務(wù)都必須無(wú)中斷地同時(shí)處理,這就是時(shí)間內(nèi)聚。在邏輯內(nèi)聚的模塊中,不同功能混在一起,合用部分程序代碼,即使局部功能的修改有時(shí)也會(huì)影響全局。因此,這類模塊的修改也比較困難。而時(shí)間關(guān)系在一定程度上反映了程序的某些實(shí)質(zhì),所以時(shí)間內(nèi)聚比邏輯內(nèi)聚好一些。第6章軟件總體設(shè)計(jì)圖6.23時(shí)間內(nèi)聚第6章軟件總體設(shè)計(jì)7.偶然內(nèi)聚如果一個(gè)模塊完成一組任務(wù),這些任務(wù)彼此間即使有關(guān)系,關(guān)系也是很松散的,則稱模塊為偶然內(nèi)聚。有時(shí)在編寫(xiě)完程序后,發(fā)現(xiàn)一組語(yǔ)句在多處出現(xiàn),于是為了節(jié)省空間而將這些語(yǔ)句作為一個(gè)模塊設(shè)計(jì),這就出現(xiàn)了偶然內(nèi)聚。例如,在圖6.24中,模塊A、B、C中出現(xiàn)公共代碼段W,于是將W獨(dú)立成一個(gè)模塊,而W中這些語(yǔ)句并沒(méi)有

任何聯(lián)系。如果在測(cè)試中發(fā)現(xiàn)模塊A不需要做“X=Y+Z”,而應(yīng)做“X=Y*Z”,此時(shí)對(duì)W的維護(hù)就很困難了。第6章軟件總體設(shè)計(jì)圖6.24偶然內(nèi)聚第6章軟件總體設(shè)計(jì)模塊功能劃分的粗細(xì)是相對(duì)的,所以模塊的內(nèi)聚程度也是相對(duì)概念。實(shí)際上,很難精確確定內(nèi)聚的級(jí)別,重要的是在軟件設(shè)計(jì)中應(yīng)力求做到高內(nèi)聚,盡量少用中內(nèi)聚,不用低內(nèi)聚。一般來(lái)說(shuō),在系統(tǒng)較高層次上的模塊功能較復(fù)雜,內(nèi)聚要低一些,而較低層次上的模塊內(nèi)聚程度較高,達(dá)到功能內(nèi)聚的可能性比較大。第6章軟件總體設(shè)計(jì)6.5.6結(jié)構(gòu)設(shè)計(jì)的一般準(zhǔn)則1.模塊獨(dú)立性準(zhǔn)則劃分模塊時(shí),盡量做到高內(nèi)聚、低耦合,保持模塊的相對(duì)獨(dú)立性,并以此原則優(yōu)化初始的軟件結(jié)構(gòu)。如果若干模塊之間耦合度過(guò)高,每個(gè)模塊內(nèi)功能不復(fù)雜,可將它們合并,以減少信息的傳遞和公共區(qū)的引用。若有多個(gè)相關(guān)模塊,應(yīng)對(duì)它們的功能進(jìn)行分析,消去重復(fù)功能。第6章軟件總體設(shè)計(jì)評(píng)價(jià)軟件的初始結(jié)構(gòu),通過(guò)模塊的分解和合并減小模塊間的聯(lián)系(耦合),增大模塊內(nèi)的聯(lián)系(內(nèi)聚)。例如多個(gè)模塊共有一個(gè)子功能,可以將其獨(dú)立成一個(gè)模塊,對(duì)于這樣的模塊有時(shí)可以通過(guò)分解或合并,來(lái)減少控制信息的傳遞及對(duì)全程數(shù)據(jù)的引用,并且降低接口的復(fù)雜程度,如圖6.25和圖

6.26所示。第6章軟件總體設(shè)計(jì)圖6.25模塊的分解第6章軟件總體設(shè)計(jì)圖6.26模塊的合并第6章軟件總體設(shè)計(jì)2.軟件結(jié)構(gòu)的形態(tài)特征準(zhǔn)則軟件結(jié)構(gòu)的深度、寬度、扇入及扇出應(yīng)適當(dāng)。深度是軟件結(jié)構(gòu)設(shè)計(jì)完成后觀察到的情況,能粗略地反映系統(tǒng)的規(guī)模和復(fù)雜程度,寬度也能反映系統(tǒng)的復(fù)雜情況。寬度與模塊的扇出有關(guān),一個(gè)模塊的扇出太多,說(shuō)明本模塊過(guò)分復(fù)雜,缺少中間層。單一功能模塊的扇入數(shù)大比較好,說(shuō)明本模塊為上層幾個(gè)模塊共享的公用模塊的重用率高。但是不能把彼此無(wú)關(guān)的功能湊在一起形成一個(gè)通用的超級(jí)模塊,雖然它扇入高,但內(nèi)聚低。因此非單一功能的模塊扇入高時(shí)應(yīng)重新分解,以消除控制耦合的情況。軟件結(jié)構(gòu)從形態(tài)上看,應(yīng)是頂層扇出數(shù)較高一些,中間層扇出數(shù)較低一些,底層扇入數(shù)較高一些。第6章軟件總體設(shè)計(jì)3.模塊的大小準(zhǔn)則在考慮模塊獨(dú)立性的同時(shí),為了增加可理解性,模塊最好有50~150條語(yǔ)句,可以用1~2頁(yè)打印紙打印,便于人們閱讀與研究。但是,在進(jìn)行模塊設(shè)計(jì)時(shí),首先應(yīng)按模塊的獨(dú)立性來(lái)選取模塊的規(guī)模。例如,如果某個(gè)模塊功能是一個(gè)獨(dú)立的少于50行的程序段,則不要嫌小而去與其他內(nèi)容拼湊成50行的模塊;如果一個(gè)具有獨(dú)立功能的程序段占用一頁(yè)半,也不要嫌大而將它劃分成兩個(gè)模塊。應(yīng)該注意的是,這種用代碼行數(shù)來(lái)衡量模塊大小的方法只適合于傳統(tǒng)的程序,現(xiàn)代程序的概念已經(jīng)有了較大的變化,特別是第四代語(yǔ)言(4GL)已不能再用代碼的長(zhǎng)度來(lái)說(shuō)明一個(gè)

模塊的規(guī)模大小和復(fù)雜程度了。所以,模塊的規(guī)模大小還是要根據(jù)其功能來(lái)判斷。第6章軟件總體設(shè)計(jì)4.模塊的接口準(zhǔn)則模塊的接口要簡(jiǎn)單、清晰及含義明確,便于理解,易于實(shí)現(xiàn)、測(cè)試與維護(hù)。模塊接口的復(fù)雜性是軟件發(fā)生錯(cuò)誤的一個(gè)重要原因。因此,設(shè)計(jì)模塊接口時(shí),應(yīng)盡量使傳遞的信息簡(jiǎn)單并與模塊的功能一致。下面用一個(gè)簡(jiǎn)單例子來(lái)說(shuō)明接口復(fù)雜性問(wèn)題。下面是兩個(gè)求一元二次方程根的程序模塊:程序模塊1:QUAD-ROOT(TBL,X)這里使用數(shù)組TBL帶入方程的系數(shù):TBL(1)=A、TBL(2)=B、TBL(3)=C;數(shù)組X回送方程的根。第6章軟件總體設(shè)計(jì)程序模塊2:QUAD-ROOT(A,B,C,ROOT1,ROOT2)對(duì)模塊1而言,接口TBL和X的意義不明確,而模塊2的接口簡(jiǎn)單明了,又與模塊功能一致,所以模塊2比模塊1的接口復(fù)雜度要低。6.5.7模塊的作用域與控制域一個(gè)模塊的作用范圍應(yīng)在其控制范疇之內(nèi),且條件判定所在的模塊應(yīng)與受影響的模塊在層次上盡量靠近。第6章軟件總體設(shè)計(jì)在軟件結(jié)構(gòu)中,由于存在著不同事務(wù)處理的需要,某一層上的模塊會(huì)存在著判斷處理,這樣可能影響其他層的模塊處理。為了保證含有判定功能模塊的軟件設(shè)計(jì)的質(zhì)量,引入了模塊的作用范圍(或稱影響范圍)與控制范圍的概念。圖6.27~圖6.29給出了三種模塊結(jié)構(gòu)圖,圖中陰影框表示判斷影響到的模塊。它們的作用域都沒(méi)有超出控制域。但是僅從作用域與判斷點(diǎn)位置來(lái)看,圖6.27的判斷點(diǎn)在層次結(jié)構(gòu)中位置太高,不太理想。其判斷點(diǎn)的作用范圍超過(guò)了控制范圍,這種結(jié)構(gòu)最差。該結(jié)構(gòu)增加了數(shù)據(jù)的傳遞量和模塊間的耦合度,會(huì)影響到不受它控制的其他模塊,這樣的結(jié)構(gòu)不易理解與維護(hù)。第6章軟件總體設(shè)計(jì)圖6.27模塊示意圖1第6章軟件總體設(shè)計(jì)圖6.28模塊示意圖2第6章軟件總體設(shè)計(jì)圖6.29模塊示意圖3第6章軟件總體設(shè)計(jì)圖6.28中的判斷模塊較適中。判斷模塊的作用范圍在控制范圍內(nèi),但是判定所在模塊與受判定影響的模塊位置太遠(yuǎn),也存在著額外的數(shù)據(jù)傳遞,增加了接口的復(fù)雜度和耦合度。這種結(jié)構(gòu)雖符合設(shè)計(jì)原則,但不理想。圖6.29中的作用域是其直接下層模塊,消除了額外的數(shù)據(jù)傳遞,是最理想的結(jié)構(gòu)圖。如果在設(shè)計(jì)過(guò)程中發(fā)現(xiàn)模塊的作用范圍不在其控制范圍之內(nèi),可用以下方法加以改進(jìn):上移判斷點(diǎn)。使該判斷的層次升高,以擴(kuò)大它的控制范圍。下移受判斷影響的模塊。將受判斷影響的模塊下移到判斷所在模塊的控制范圍內(nèi)。第6章軟件總體設(shè)計(jì)前面所討論的原則與功能設(shè)計(jì)是有關(guān)系的。模塊的功能應(yīng)該能夠預(yù)測(cè),也要防止模塊功能的過(guò)分局限。當(dāng)一個(gè)模塊輸入的數(shù)據(jù)相同時(shí)就產(chǎn)生同樣的輸出,那么這個(gè)功能模塊就是可以預(yù)測(cè)的。但是要注意,帶有內(nèi)存儲(chǔ)功能的模塊可能是不可預(yù)測(cè)的,因?yàn)樗妮敵隹赡苋Q于內(nèi)存儲(chǔ)器的狀態(tài)。由于內(nèi)存儲(chǔ)器對(duì)于上級(jí)模塊而言是不可見(jiàn)的,所以這樣的模塊難于測(cè)試與維護(hù)。當(dāng)一個(gè)模塊僅完成一項(xiàng)功能時(shí),則表現(xiàn)為高內(nèi)聚。如果一個(gè)模塊限制局部數(shù)據(jù)結(jié)構(gòu)的大小,過(guò)度限制在控制流中可以做出的選擇或外部接口模式,那么,這種模塊的功能就過(guò)于局限。第6章軟件總體設(shè)計(jì)6.6

結(jié)構(gòu)化設(shè)計(jì)結(jié)構(gòu)化設(shè)計(jì)以結(jié)構(gòu)化分析產(chǎn)生的數(shù)據(jù)流圖為基礎(chǔ),將數(shù)據(jù)流圖按一定的步驟映射成軟件結(jié)構(gòu)。L.Constantine和E.Yourdon等人提出的結(jié)構(gòu)圖是進(jìn)行軟件設(shè)計(jì)的有力工具。

它與結(jié)構(gòu)化分析銜接,構(gòu)成了完整的結(jié)構(gòu)化分析與設(shè)計(jì)技術(shù),是目前使用最廣泛的軟件設(shè)計(jì)方法之一。在需求分析階段,信息流是考慮的關(guān)鍵問(wèn)題。用數(shù)據(jù)流圖來(lái)描述信息在系統(tǒng)中的流動(dòng)情況。因?yàn)槿魏蜗到y(tǒng)都可以用數(shù)據(jù)流圖表示,所以結(jié)構(gòu)化設(shè)計(jì)方法理論可以設(shè)計(jì)任何軟件結(jié)構(gòu)。通常所說(shuō)的結(jié)構(gòu)化方法也就是基于數(shù)據(jù)流的設(shè)計(jì)方法。第6章軟件總體設(shè)計(jì)6.6.1數(shù)據(jù)流的類型結(jié)構(gòu)化設(shè)計(jì)的目的是要把數(shù)據(jù)流圖映射成軟件結(jié)構(gòu),而數(shù)據(jù)流圖的類型又確定了映射方法,因此必須研究數(shù)據(jù)流圖

的類型。在各種軟件系統(tǒng)中,不論數(shù)據(jù)流圖如何龐大與復(fù)雜,根據(jù)數(shù)據(jù)流的特性,一般可分為變換型數(shù)據(jù)流圖和事務(wù)型數(shù)

據(jù)流圖兩類。下面分別介紹這兩類數(shù)據(jù)流圖。1.變換型數(shù)據(jù)流圖根據(jù)信息系統(tǒng)的模型,信息一般從外部進(jìn)入系統(tǒng),通過(guò)系統(tǒng)處理后,離開(kāi)系統(tǒng)。從其過(guò)程可以得出,變換型數(shù)據(jù)流圖是一個(gè)線性結(jié)構(gòu),是由輸入、變換(或稱處理)和輸出三部分組成的,如圖6.30所示(虛線為標(biāo)出的流界)。第6章軟件總體設(shè)計(jì)圖6.30變換型數(shù)據(jù)流圖第6章軟件總體設(shè)計(jì)變換型數(shù)據(jù)處理的工作過(guò)程一般分為取得數(shù)據(jù)、變換數(shù)據(jù)和給出數(shù)據(jù)。這三步體現(xiàn)了變換型數(shù)據(jù)流圖的基本思想。變換是系統(tǒng)的主加工,是系統(tǒng)的變換中心。變換輸入端的數(shù)據(jù)流為系統(tǒng)的邏輯輸入,輸出端為邏輯輸出。而直接從外部設(shè)備輸入的數(shù)據(jù)稱為物理輸入,反之稱為物理輸出。外部的輸入數(shù)據(jù)一般要經(jīng)過(guò)輸入正確性和合理性檢查、編輯及格式轉(zhuǎn)換等預(yù)處理,這部分工作都由邏輯輸入部分完成,它將外部形式的數(shù)據(jù)變成內(nèi)部形式,送給變換中心。同理,邏輯輸出部分把變換中心產(chǎn)生的數(shù)據(jù)的內(nèi)部形式轉(zhuǎn)換成外部形式,然后進(jìn)行物理輸出。當(dāng)數(shù)據(jù)流圖具有這些特征時(shí),這種信息流就稱為變換流。第6章軟件總體設(shè)計(jì)2.事務(wù)型數(shù)據(jù)流圖基本系統(tǒng)模型意味著變換流。因此,原則上可以講所有的信息流都可以歸結(jié)為這一類。然而,若某個(gè)加工將它的輸入流分離成許多發(fā)散的數(shù)據(jù)流,形成許多平行的加工路徑,并根據(jù)輸入的值選擇其中一個(gè)路徑來(lái)執(zhí)行,這種特征的數(shù)據(jù)流圖稱為事務(wù)型數(shù)據(jù)流圖。這個(gè)加工稱為事務(wù)處理中心,如圖6.31所示。圖6.31中的處理T稱為事務(wù)中心,它完成了下述任務(wù):接收輸入數(shù)據(jù)。分析每個(gè)事務(wù),確定其類型。根據(jù)事務(wù)選擇一條活動(dòng)通路。第6章軟件總體設(shè)計(jì)并不是說(shuō)一個(gè)數(shù)據(jù)流圖就只屬于這兩種數(shù)據(jù)流圖中的一種。一個(gè)大型的軟件系統(tǒng)的數(shù)據(jù)流圖,可能既具有變換型的特征,又具有事務(wù)型的特征。例如,事務(wù)型數(shù)據(jù)流圖中的某個(gè)加工路徑可能是變換型的。第6章軟件總體設(shè)計(jì)圖6.31事務(wù)型數(shù)據(jù)流圖第6章軟件總體設(shè)計(jì)6.6.2過(guò)程步驟對(duì)需求分析階段的結(jié)果進(jìn)行分析的目的是為了方便地從數(shù)據(jù)流圖轉(zhuǎn)換到程序結(jié)構(gòu)圖。在轉(zhuǎn)換前,先介紹有關(guān)結(jié)構(gòu)化設(shè)計(jì)方法轉(zhuǎn)換的步驟。研究數(shù)據(jù)流圖。把數(shù)據(jù)流圖轉(zhuǎn)換成軟件結(jié)構(gòu)圖前,設(shè)計(jì)人員要參照規(guī)范說(shuō)明書(shū),仔細(xì)地研究分析數(shù)據(jù)流圖,并參照數(shù)據(jù)字典認(rèn)真理解其中的有關(guān)元素,檢查有無(wú)遺漏或不合理之處,進(jìn)行必要的修改。確定數(shù)據(jù)流圖類型。通常將系統(tǒng)的數(shù)據(jù)流圖視為變換流。但是,當(dāng)系統(tǒng)有明顯的事務(wù)流時(shí),就要按照事務(wù)流來(lái)處理。要分析系統(tǒng)數(shù)據(jù)流中的主要數(shù)據(jù)流,以此來(lái)確定其類型。如果是變換型,確定變換中心和邏輯輸入、邏輯輸出的第6章軟件總體設(shè)計(jì)界線,將其映射為變換結(jié)構(gòu)的頂層和第一層;如果是事務(wù)型,確定事務(wù)中心和加工路徑,將其映射為事務(wù)結(jié)構(gòu)的頂層和第一層。另外,當(dāng)一個(gè)類型系統(tǒng)的數(shù)據(jù)流中有另外類型的數(shù)據(jù)流時(shí),可以將其分離出去,作為子系統(tǒng)來(lái)處理。(3)找出變換中心。輸入流是一條路徑,數(shù)據(jù)經(jīng)過(guò)這條路徑從外部形式轉(zhuǎn)換為內(nèi)部形式。輸出流則相反,從內(nèi)部形式轉(zhuǎn)換為外部形式。但是輸入/輸出流的邊界并不明確。因此不同的設(shè)計(jì)人員可能會(huì)選擇不同的邊界點(diǎn),而從不同的邊界點(diǎn)就會(huì)得到不同的結(jié)構(gòu)解。盡管如此,數(shù)據(jù)流圖中一個(gè)處理點(diǎn)的變動(dòng)對(duì)軟件的結(jié)構(gòu)不會(huì)產(chǎn)生很大的影響。如果是事務(wù)流,則這一步是確定事務(wù)中心和每條處理路徑的特征。事務(wù)中心的位置在數(shù)據(jù)流圖中是容易看出的。第6章軟件總體設(shè)計(jì)(4)第一層分解。如果是變換流,要把數(shù)據(jù)流圖映射為一種輸入、變換、輸出的特殊結(jié)構(gòu)。在它的頂層是一個(gè)主控制器,下面是輸入控制器、變換控制器、輸出控制器。主控制器協(xié)調(diào)下屬控制功能。輸入控制器協(xié)調(diào)輸入數(shù)據(jù)的接收。變換控制器規(guī)范所有內(nèi)部形式的數(shù)據(jù)操作。輸出控制器協(xié)調(diào)輸出數(shù)據(jù)的生成。如果是事務(wù)流,則要把數(shù)據(jù)流圖映射為事務(wù)處理的程序結(jié)構(gòu)。這種結(jié)構(gòu)包含一個(gè)接收分支和一個(gè)發(fā)送分支。發(fā)送分支的結(jié)構(gòu)包括一個(gè)模塊,它管理所有下屬的模塊。第6章軟件總體設(shè)計(jì)第二層分解。這一步的任務(wù)是把數(shù)據(jù)流圖中的各個(gè)變換映射成相應(yīng)的模塊。從變換中心的邊界起,沿輸入路徑向前移動(dòng),將處理映射成一個(gè)一個(gè)模塊;然后,從變換中心的邊界起,再沿輸出路徑向前移動(dòng),將處理映射成一個(gè)一個(gè)模塊。把變換映射成下一層的結(jié)構(gòu)。在映射中,可以將一個(gè)處理映射成幾個(gè)模塊,也可將幾個(gè)處理映射成一個(gè)模塊。如果是事務(wù)流圖,就表示把各個(gè)變換映射成程序結(jié)構(gòu)的模塊,而將事務(wù)處理結(jié)構(gòu)的分支進(jìn)行分解和細(xì)化。根據(jù)優(yōu)化準(zhǔn)則對(duì)軟件結(jié)構(gòu)求精。描述模塊功能、接口及全局?jǐn)?shù)據(jù)結(jié)構(gòu)。復(fù)查,如果有錯(cuò),轉(zhuǎn)步驟(2)修改完善,否則進(jìn)入詳細(xì)設(shè)計(jì)。第6章軟件總體設(shè)計(jì)6.6.3變換分析設(shè)計(jì)1)確定數(shù)據(jù)流圖中的變換中心、邏輯輸入和邏輯輸出如果設(shè)計(jì)人員經(jīng)驗(yàn)豐富,則容易確定系統(tǒng)的變換中心,即主加工。如幾股數(shù)據(jù)流的匯合處往往是系統(tǒng)的主加工。若一下不能確定,則要從物理輸入端開(kāi)始,一步一步沿著數(shù)據(jù)流方向向系統(tǒng)中心尋找,直到有這樣的數(shù)據(jù)流,它不能再被看做是系統(tǒng)的輸入,則它的前一個(gè)數(shù)據(jù)流就是系統(tǒng)的邏輯輸入。位于邏輯輸入與邏輯輸出之間的就是變換中心。同理,從物理輸出端開(kāi)始,逆數(shù)據(jù)流方向向中間移動(dòng),可以確定系統(tǒng)的邏輯輸出。介于邏輯輸入和邏輯輸出之間的加工就是變換中心,用虛線劃分出邊界,數(shù)據(jù)流圖的三部分就被確定了。第6章軟件總體設(shè)計(jì)2)設(shè)計(jì)軟件結(jié)構(gòu)的頂層和第一層變換中心確定以后,就相當(dāng)于決定了主模塊的位置,這就是軟件結(jié)構(gòu)的頂層,如圖6.32所示。其功能主要是完成所有模塊的控制,它的名稱是系統(tǒng)名稱,以體現(xiàn)完成整個(gè)系統(tǒng)的功能。主模塊確定之后,設(shè)計(jì)軟件結(jié)構(gòu)的第一層。第一層至少要有輸入、輸出和變換三種功能的模塊,它們可能有多個(gè)。為每個(gè)邏輯輸入設(shè)計(jì)一個(gè)輸入模塊,其功能是為頂層模塊提供信息,如圖6.32中的f3。為每個(gè)邏輯輸出設(shè)計(jì)一個(gè)輸出模塊,其功能是為頂層模塊提供相應(yīng)的數(shù)據(jù),如圖6.32中的f7、f8。同時(shí),也為變換中心設(shè)計(jì)一個(gè)變換模塊,其功能是將邏輯輸入進(jìn)行變換加工,然后邏輯輸出,如圖6.32中將

f3變換成f7和f8。這些模塊之間的數(shù)據(jù)傳送應(yīng)該與數(shù)據(jù)流圖第6章軟件總體設(shè)計(jì)相對(duì)應(yīng),這樣就得到了軟件結(jié)構(gòu)的頂層模塊。這里的主模塊是總的控制模塊,主模塊中的控制邏輯決定著對(duì)其他模塊的調(diào)用。3)設(shè)計(jì)中、下層模塊對(duì)第一層的輸入、變換及輸出模塊自頂向下、逐層分解,為各類模塊設(shè)計(jì)出其下屬模塊。(1)輸入模塊的下屬模塊的設(shè)計(jì)。一般情況下,輸入模

塊的功能是向調(diào)用它的模塊提供數(shù)據(jù),所以必須有數(shù)據(jù)來(lái)源。因此,輸入模塊應(yīng)由接收輸入數(shù)據(jù)和將數(shù)據(jù)轉(zhuǎn)換成調(diào)用模塊

所需的信息兩部分組成。第6章軟件總體設(shè)計(jì)因此,每個(gè)輸入模塊可以設(shè)計(jì)成兩個(gè)下屬模塊:一個(gè)接收,一個(gè)轉(zhuǎn)換,用類似的方法一直分解到物理輸入端。如圖6.32中模塊“get

f3”和“get

f2”的分解。模塊“get

f1”為物理輸入模塊。(2)輸出模塊的下屬模塊的設(shè)計(jì)。輸出模塊的功能是將它的調(diào)用模塊產(chǎn)生的結(jié)果送出,它由將數(shù)據(jù)轉(zhuǎn)換成下屬模塊所需的形式和發(fā)送數(shù)據(jù)兩部分組成。這樣每個(gè)輸出模塊可以設(shè)計(jì)成兩個(gè)下屬模塊:一個(gè)轉(zhuǎn)換,一個(gè)發(fā)送,一直到物理輸出端。如圖6.32中,模塊“put

f7”、

“put

f8”和“put

f10”的分解。模塊“put

f9”和“put

f11”為物理輸出模塊。第6章軟件總體設(shè)計(jì)(3)變換模塊的下屬模塊的設(shè)計(jì)。設(shè)計(jì)完輸入、輸出后,就要為變換模塊設(shè)計(jì)其下屬模塊。要根據(jù)數(shù)據(jù)流圖中變換中心的組成情況,研究數(shù)據(jù)流圖的變換情況,并按照模塊獨(dú)立性的原則來(lái)組織其結(jié)構(gòu)。一般對(duì)數(shù)據(jù)流圖中每個(gè)基本加工都建立一個(gè)功能模塊,如圖6.32中模塊“C”、“D”和“E”。第6章軟件總體設(shè)計(jì)圖6.32變換分析設(shè)計(jì)舉例第6章軟件總體設(shè)計(jì)4)設(shè)計(jì)的優(yōu)化經(jīng)以上步驟設(shè)計(jì)出的軟件結(jié)構(gòu)僅僅是初始結(jié)構(gòu),還必須根據(jù)設(shè)計(jì)準(zhǔn)則對(duì)初始結(jié)構(gòu)精細(xì)和改進(jìn),以下為提供的求精辦法:輸入部分的求精。在上述初步結(jié)構(gòu)中,對(duì)每個(gè)物理

輸入模塊輸入,以體現(xiàn)系統(tǒng)的外部接口。對(duì)結(jié)構(gòu)圖中的其他

輸入模塊并非真正輸入,當(dāng)它與轉(zhuǎn)換數(shù)據(jù)的模塊都很簡(jiǎn)單時(shí),可將它們合并成一個(gè)模塊。當(dāng)轉(zhuǎn)換模塊較復(fù)雜時(shí),可以作為

單獨(dú)的接口模塊處理。輸出部分的求精。與輸入部分相似,為每個(gè)物理輸出設(shè)置專門(mén)模塊,同時(shí)注意把相同或類似的物理輸出模塊合并在一起,以減低耦合度。第6章軟件總體設(shè)計(jì)(3)變換部分的求精。根據(jù)設(shè)計(jì)準(zhǔn)則,對(duì)模塊進(jìn)行合并或調(diào)整。總之,軟件結(jié)構(gòu)的求精帶有很大的經(jīng)驗(yàn)性。往往數(shù)據(jù)流圖中的加工與SC中的模塊之間是一對(duì)一的映射關(guān)系,然后再修改。但對(duì)于一個(gè)實(shí)際問(wèn)題,可能把數(shù)據(jù)流圖中的兩個(gè)甚至多個(gè)加工組成一個(gè)模塊,也可能把數(shù)據(jù)流圖中的一個(gè)加工擴(kuò)展為兩個(gè)或更多個(gè)模塊,根據(jù)具體情況要靈活掌握設(shè)計(jì)方法,以求設(shè)計(jì)出由高內(nèi)聚和低耦合的模塊所組成的、具有良好特性的軟件結(jié)構(gòu)。第6章軟件總體設(shè)計(jì)6.6.4事務(wù)分析設(shè)計(jì)事務(wù)流的設(shè)計(jì)是從事務(wù)數(shù)據(jù)流圖到程序結(jié)構(gòu)的變換。對(duì)于具有事務(wù)型特征的數(shù)據(jù)流圖,則采用事務(wù)分析的設(shè)計(jì)方法。設(shè)計(jì)的方法也是自頂向下,逐步細(xì)化。先設(shè)計(jì)主模塊,再為

每一種類型的事務(wù)設(shè)計(jì)事務(wù)處理模塊,然后為每個(gè)處理設(shè)計(jì)

其下屬的事務(wù)處理細(xì)節(jié)。事務(wù)處理模塊可以被調(diào)用它的模塊公用,與變換處理不同的是,其事務(wù)中心容易確定?,F(xiàn)在,結(jié)合圖6.33說(shuō)明該方法的設(shè)計(jì)過(guò)程。第6章軟件總體設(shè)計(jì)圖6.33事務(wù)分析設(shè)計(jì)舉例第6章軟件總體設(shè)計(jì)確定數(shù)據(jù)流圖中的事務(wù)中心和加工路徑。當(dāng)數(shù)據(jù)流圖中的某個(gè)加工具有明顯地將一個(gè)輸入數(shù)據(jù)流分解成多個(gè)發(fā)散的輸出數(shù)據(jù)流時(shí),該加工就是事務(wù)中心。從事務(wù)中心輻射出去的數(shù)據(jù)流為各個(gè)加工路徑。設(shè)計(jì)軟件結(jié)構(gòu)的頂層和第一層。事務(wù)處理中心和事務(wù)處理路徑確定后,就可以確定它們的軟件結(jié)構(gòu)。其結(jié)構(gòu)一般為一個(gè)接收分支和一個(gè)發(fā)送分支。從事務(wù)處理中心的邊界開(kāi)始向前移動(dòng),一個(gè)個(gè)地將變換轉(zhuǎn)換為模塊。發(fā)送分支也有一個(gè)模塊,它管理所有的下屬處理模塊。每一個(gè)事務(wù)處理的路徑設(shè)計(jì)為相應(yīng)的結(jié)構(gòu),最后將其轉(zhuǎn)換成一個(gè)頂層模塊。該模塊是一個(gè)主模塊,有兩個(gè)功能,一是接收數(shù)據(jù),二是根據(jù)事務(wù)類型調(diào)度相應(yīng)的處理模塊。事務(wù)型軟件結(jié)構(gòu)應(yīng)包括接收第6章軟件總體設(shè)計(jì)分支和發(fā)送分支兩個(gè)部分。接收分支:負(fù)責(zé)接收數(shù)據(jù),它的設(shè)計(jì)與變換型數(shù)據(jù)流圖的輸入部分的設(shè)計(jì)方法相同。發(fā)送分支:通常包含一個(gè)調(diào)度模塊,它控制管理所有的下層事務(wù)處理模塊。當(dāng)事務(wù)類型不多時(shí),調(diào)度模塊可與主模塊合并。(3)進(jìn)行事務(wù)結(jié)構(gòu)中、下層模塊的設(shè)計(jì)、優(yōu)化等工作。第6章軟件總體設(shè)計(jì)6.6.5混合流設(shè)計(jì)1.混合數(shù)據(jù)流圖的映射一般中型以上的系統(tǒng)的數(shù)據(jù)流圖中都會(huì)既有變換流,又有事務(wù)流,這就是所謂的混合數(shù)據(jù)流圖,其軟件結(jié)構(gòu)設(shè)計(jì)方法一般采用以變換流為主,事務(wù)流為輔的方法。具體步驟如下:(1)確定數(shù)據(jù)流圖整體上的類型。事務(wù)型通常用于對(duì)高層數(shù)據(jù)流圖的變換,其優(yōu)點(diǎn)是可以把一個(gè)大而復(fù)雜的系統(tǒng)分解成若干較小的簡(jiǎn)單的子系統(tǒng)。變換型通常用于對(duì)較低層數(shù)據(jù)流圖的轉(zhuǎn)換。變換型具有順序處理的特點(diǎn),而事務(wù)型具有平行處理的特點(diǎn),所以由這兩種類型的數(shù)據(jù)流圖導(dǎo)出的軟件結(jié)構(gòu)有所不同。只要從數(shù)據(jù)流圖整體的、主要的功能處理分析其特點(diǎn),就可區(qū)分出該數(shù)據(jù)流圖的整體類型。第6章軟件總體設(shè)計(jì)(2)標(biāo)出局部的數(shù)據(jù)流圖范圍,確定其類型。(3)按整體和局部的數(shù)據(jù)流圖特征,設(shè)計(jì)出軟件結(jié)構(gòu)。

2.分層數(shù)據(jù)流圖的映射前面在進(jìn)行系統(tǒng)分析時(shí)曾經(jīng)講過(guò)分層數(shù)據(jù)流圖的方法。對(duì)于一個(gè)復(fù)雜問(wèn)題的數(shù)據(jù)流圖結(jié)果,往往是分層的。同理,對(duì)于分層的數(shù)據(jù)流圖映射成軟件結(jié)構(gòu)圖也應(yīng)該是分層的。這樣既便于設(shè)計(jì),也便于修改。由于數(shù)據(jù)流圖的頂層圖反映的是系統(tǒng)與外部環(huán)境的界面,所以系統(tǒng)的物理輸入與物理輸出都在交換中心的頂層。相應(yīng)的軟件結(jié)構(gòu)圖的物理輸入與輸出部分應(yīng)放在主圖中,便于同數(shù)據(jù)流圖的頂層圖對(duì)照檢查。分層數(shù)據(jù)流圖的映射方法是:(1)主圖是變換型,子圖是事務(wù)型,如圖6.34所示。第6章軟件總體設(shè)計(jì)圖6.34主圖是變換型,子圖是事務(wù)型第6章軟件總體設(shè)計(jì)(2)主圖是事務(wù)型,子圖是變換型,如圖6.35所示。圖6.35主圖是事務(wù)型,子圖是變換型第6章軟件總體設(shè)計(jì)6.6.6結(jié)構(gòu)化設(shè)計(jì)方法應(yīng)用示例將銷(xiāo)售管理系統(tǒng)的數(shù)據(jù)流圖轉(zhuǎn)換為軟件結(jié)構(gòu)圖。分析該系統(tǒng)的0層圖,它有4個(gè)主要功能,即訂貨處理、進(jìn)貨處理、缺貨處理和銷(xiāo)售處理。其中,訂貨處理包括訂單處理和備貨處理兩部分。這4個(gè)處理可平行工作,因此從整體上分析可按事務(wù)型數(shù)據(jù)流圖來(lái)設(shè)計(jì),根據(jù)功能鍵來(lái)選擇4個(gè)處理中的一個(gè)。設(shè)計(jì)出的軟件結(jié)構(gòu)如圖6.36所示。第6章軟件總體設(shè)計(jì)圖6.36銷(xiāo)售管理系統(tǒng)軟件結(jié)構(gòu)圖第6章軟件總體設(shè)計(jì)銷(xiāo)售管理系統(tǒng)的軟件結(jié)構(gòu)子圖1(訂貨處理),如圖6.37所示。圖6.37子圖l第6章軟件總體設(shè)計(jì)銷(xiāo)售管理系統(tǒng)的軟件結(jié)構(gòu)子圖2(進(jìn)貨處理),如圖6.38所示。圖6.38子圖2第6章軟件總體設(shè)計(jì)銷(xiāo)售管理系統(tǒng)的軟件結(jié)構(gòu)子圖3(缺貨處理),如圖6.39所示。圖6.39子圖3第6章軟件總體設(shè)計(jì)銷(xiāo)售管理系統(tǒng)的軟件結(jié)構(gòu)子圖4(銷(xiāo)售處理),如圖6.40所示。圖6.40子圖4第6章軟件總體設(shè)計(jì)6.6.7設(shè)計(jì)的后期處理由設(shè)計(jì)的工作流程可知,經(jīng)過(guò)變換分析或事務(wù)分析設(shè)計(jì)后形成軟件結(jié)構(gòu),對(duì)于這個(gè)結(jié)構(gòu)除了設(shè)計(jì)文檔作為系統(tǒng)設(shè)計(jì)

的補(bǔ)充外,還要對(duì)結(jié)構(gòu)進(jìn)行優(yōu)化和改進(jìn)。因此要做以下工作:為每個(gè)模塊提供一份接口說(shuō)明。此說(shuō)明包括通過(guò)參數(shù)表傳遞的數(shù)據(jù)、外部的輸入/輸出和訪問(wèn)全局?jǐn)?shù)據(jù)區(qū)的信息等,并指出它的下屬模塊與上屬模塊。為清晰易讀,對(duì)以上說(shuō)明可用設(shè)計(jì)階段常采用的圖形工具——IPO圖來(lái)表示。為每個(gè)模塊寫(xiě)一份處理說(shuō)明。從設(shè)計(jì)的角度描述模

塊的主要處理任務(wù)、條件抉擇等,以需求分析階段產(chǎn)生的加

工邏輯的描述為參考。這里的說(shuō)明應(yīng)該是清晰、無(wú)二義性的。第6章軟件總體設(shè)計(jì)給出設(shè)計(jì)約束或限制,如數(shù)據(jù)類型和格式的限制、內(nèi)存容量的限制、時(shí)間的限制、數(shù)據(jù)的邊界值、個(gè)

溫馨提示

  • 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)論