![軟件詳細設(shè)計第6章軟件總體設(shè)計_第1頁](http://file4.renrendoc.com/view/c4a9a3b88f025b5c0e4f2bd8757ee2b1/c4a9a3b88f025b5c0e4f2bd8757ee2b11.gif)
![軟件詳細設(shè)計第6章軟件總體設(shè)計_第2頁](http://file4.renrendoc.com/view/c4a9a3b88f025b5c0e4f2bd8757ee2b1/c4a9a3b88f025b5c0e4f2bd8757ee2b12.gif)
![軟件詳細設(shè)計第6章軟件總體設(shè)計_第3頁](http://file4.renrendoc.com/view/c4a9a3b88f025b5c0e4f2bd8757ee2b1/c4a9a3b88f025b5c0e4f2bd8757ee2b13.gif)
![軟件詳細設(shè)計第6章軟件總體設(shè)計_第4頁](http://file4.renrendoc.com/view/c4a9a3b88f025b5c0e4f2bd8757ee2b1/c4a9a3b88f025b5c0e4f2bd8757ee2b14.gif)
![軟件詳細設(shè)計第6章軟件總體設(shè)計_第5頁](http://file4.renrendoc.com/view/c4a9a3b88f025b5c0e4f2bd8757ee2b1/c4a9a3b88f025b5c0e4f2bd8757ee2b15.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章軟件總體設(shè)計第6章
軟件總體設(shè)計軟件設(shè)計的重要性設(shè)計過程軟件總體設(shè)計設(shè)計基本原理體系結(jié)構(gòu)設(shè)計結(jié)構(gòu)化設(shè)計軟件結(jié)構(gòu)優(yōu)化小結(jié)第6章軟件總體設(shè)計6.1
軟件設(shè)計的重要性軟件設(shè)計處于軟件工程過程的技術(shù)核心地位。軟件開發(fā)中不管應(yīng)用什么樣的開發(fā)模式(development
paradigm),都要進行軟件設(shè)計。當軟件需求分析和定義完成后,就進入設(shè)計階段,即在對系統(tǒng)的信息、功能、行為和各種要求理解的基礎(chǔ)上構(gòu)想未來的系統(tǒng)。這種構(gòu)想需要后面的編碼階段來構(gòu)造、測試階段來驗證。軟件設(shè)計、構(gòu)造與驗證這三項活動是必不可少的。每一項都是按一定形式變換信息,最終使之成為被確認的計算機軟件。在軟件工程過程中的這些技術(shù)階段的信息流如圖6.1所示。第6章軟件總體設(shè)計由圖6.1可以看出,在軟件需求提供的信息(information)、功能(functional)和行為(behavioral)模型上,設(shè)計階段可以使用任何一種設(shè)計方法。設(shè)計階段包括把分析階段所建立的信息域模型變換為數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)是軟件實現(xiàn)所需要
的;也包括定義程序結(jié)構(gòu)構(gòu)件(structural
components)之間的相互關(guān)系的體系結(jié)構(gòu)(architectural)設(shè)計;還包括變換結(jié)構(gòu)構(gòu)件為軟件的過程描述的過程(procedural)設(shè)計。源代碼生成并通過測試之后,進行軟件的組裝(integrate)和確認(validate)。在設(shè)計中所作的決策將最終影響軟件實現(xiàn)的成功與否,也影響軟件維護的難易程度。所以,在軟件設(shè)計過程中的這些決策是開發(fā)階段非常關(guān)鍵的一步。第6章軟件總體設(shè)計軟件設(shè)計的重要性還反映在質(zhì)量(quality)上。在開發(fā)過程中,設(shè)計是對軟件最本質(zhì)的部分進行構(gòu)造,構(gòu)造的水平?jīng)Q定軟件質(zhì)量。同時,設(shè)計也提供了可以進行質(zhì)量評價的軟件表達式。只有通過設(shè)計,才能把用戶的需求精確地轉(zhuǎn)換為完美的軟件系統(tǒng)。軟件設(shè)計是軟件工程和軟件維護的基礎(chǔ),有無軟件設(shè)計相差很大,如圖6.2所示。第6章軟件總體設(shè)計圖6.2有無軟件設(shè)計的對比第6章軟件總體設(shè)計6.2
設(shè)計過程軟件設(shè)計是一個把需求轉(zhuǎn)換為軟件表達式的過程。這個轉(zhuǎn)換過程一般情況下分為兩步走。首先,用表達式描繪一個軟件的概貌,然后將其細化為一個非常接近于源代碼的設(shè)計表達式。從軟件工程的角度講是分為總體設(shè)計和詳細設(shè)計??傮w設(shè)計主要是把需求轉(zhuǎn)換為數(shù)據(jù)結(jié)構(gòu)和軟件體系結(jié)構(gòu),而詳細設(shè)計主要集中在體系結(jié)構(gòu)表達式的細化上,進而產(chǎn)生詳細的數(shù)據(jù)結(jié)構(gòu)和軟件的算法表達式。第6章軟件總體設(shè)計在早期的設(shè)計工作中,軟件設(shè)計著重在開發(fā)模塊化程序模塊所需要的準則以及按照自頂向下(top-down)的方式逐步細化軟件體系結(jié)構(gòu)上。設(shè)計定義的過程方面逐漸發(fā)展成為一種叫做結(jié)構(gòu)化編程(structured
programming)的原則。之后,提出了把數(shù)據(jù)流和數(shù)據(jù)結(jié)構(gòu)翻譯成設(shè)計定義的方法。近年來,則建議采用OO(Object-Oriented)的設(shè)計方法??偨Y(jié)過去軟件設(shè)計的發(fā)展,可以歸納為是一個持續(xù)發(fā)展的過程。第6章軟件總體設(shè)計在比較小的軟件設(shè)計中,可以把總體設(shè)計和詳細設(shè)計作為一個過程階段去完成。但是有一定規(guī)模的系統(tǒng)中,總體設(shè)計和詳細設(shè)計是兩個明確的階段。所以它們中的許多設(shè)計活動是不同的。除了數(shù)據(jù)、體系結(jié)構(gòu)和過程設(shè)計之外,在現(xiàn)代的許多應(yīng)用中還包括界面設(shè)計活動。界面設(shè)計主要是建立人—機之間界面的布局和交互的機制。總體設(shè)計和詳細設(shè)計除了必須有先進的設(shè)計技術(shù)外,還要有同步的管理技術(shù)支持。圖6.3所示的形式表明了總體設(shè)計和詳細設(shè)計與管理技術(shù)之間的關(guān)系。第6章軟件總體設(shè)計圖6.3總體設(shè)計和詳細設(shè)計與管理技術(shù)之間的關(guān)系第6章軟件總體設(shè)計從圖6.3中可以看出,由技術(shù)支持的總體設(shè)計和詳細設(shè)計都伴隨著管理技術(shù)。前面已經(jīng)提到,軟件設(shè)計的重要性之一就是軟件的質(zhì)量。在整個設(shè)計過程中,對設(shè)計每一步的質(zhì)量都要進行正式的技
術(shù)評審(formal
technical
reviews)。對于設(shè)計表達式的質(zhì)量的評價要按照設(shè)計準則,這里給出下列軟件設(shè)計準則:設(shè)計應(yīng)當模塊化(modular),也就是說,軟件應(yīng)被邏輯地劃分為能完成特定功能和子功能的構(gòu)件。設(shè)計應(yīng)形成具有獨立功能特征的模塊(如子程序或過程)。設(shè)計應(yīng)使模塊之間和與外部環(huán)境之間接口的復(fù)雜度盡量地降低。第6章軟件總體設(shè)計設(shè)計應(yīng)該有一個分層的組織結(jié)構(gòu),這樣人們可對軟件的各個構(gòu)件進行理性的控制。設(shè)計應(yīng)有性質(zhì)不同的可區(qū)分的數(shù)據(jù)和過程表達式。設(shè)計應(yīng)利用軟件需求分析中得到的信息和可重復(fù)的方法。人們都希望設(shè)計一個良好的系統(tǒng)。然而,任何一個良好的系統(tǒng)設(shè)計,都不是偶然能輕易得到的,它是需要通過基本設(shè)計原理、系統(tǒng)化的方法和評審的各項技術(shù)的應(yīng)用共同促成的。第6章軟件總體設(shè)計6.3
軟件總體設(shè)計需求分析階段所形成的數(shù)據(jù)流圖是軟件總體設(shè)計的基礎(chǔ)。要為可供選擇的每一個方案準備一份系統(tǒng)流程圖,列出系統(tǒng)組成的物理元素,進行效益分析,制定實現(xiàn)方案的進度。從合理的方案中選擇一個最佳的方案向用戶推薦,當用戶接受方案后,就要為這個最佳的方案設(shè)計軟件結(jié)構(gòu)。一般情況下,這個軟件結(jié)構(gòu)要通過反復(fù)修改使之合理,同時還要進行必要的數(shù)據(jù)庫設(shè)計。在分布式系統(tǒng)中還要進行網(wǎng)絡(luò)設(shè)計。另外,還要制定測試計劃和確定測試要求。在詳細設(shè)計前一定要進行軟件總體設(shè)計。軟件總體設(shè)計階段的任務(wù)是概要地回答系統(tǒng)應(yīng)該如何實現(xiàn),因此要把握與詳細設(shè)計的區(qū)別,并完成如下任務(wù)。第6章軟件總體設(shè)計1.軟件系統(tǒng)結(jié)構(gòu)設(shè)計按照結(jié)構(gòu)化理論,實現(xiàn)一個系統(tǒng)目標需要程序和數(shù)據(jù)。所以,必須設(shè)計出組成這個系統(tǒng)的所有程序結(jié)構(gòu)和數(shù)據(jù)庫文件。具體方法如下:采用某種設(shè)計方法,將一個復(fù)雜的系統(tǒng)按功能劃分成模塊。確定每個模塊的功能。確定模塊之間的調(diào)用關(guān)系。確定模塊之間的接口,即模塊之間傳遞的信息。評價模塊結(jié)構(gòu)的質(zhì)量。第6章軟件總體設(shè)計基于結(jié)構(gòu)化理論的軟件結(jié)構(gòu)設(shè)計是以模塊為基礎(chǔ)的。在需求分析階段,通過某種分析方法已經(jīng)把系統(tǒng)分解成層次結(jié)構(gòu)。在設(shè)計階段,以需求分析的結(jié)果為依據(jù),從實現(xiàn)的角度將需求分析的結(jié)果映射為模塊,并組成模塊的層次結(jié)構(gòu)??傮w設(shè)計的關(guān)鍵是軟件結(jié)構(gòu)的設(shè)計,它直接影響到詳細設(shè)計與編碼的工作。軟件結(jié)構(gòu)設(shè)計中要決定軟件系統(tǒng)的質(zhì)量及一些整體特性。因此,軟件結(jié)構(gòu)的設(shè)計應(yīng)由經(jīng)驗豐富的人員采用一定的設(shè)計方法,選取合理的設(shè)計方案來完成。第6章軟件總體設(shè)計2.數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫設(shè)計在結(jié)構(gòu)化理論下的軟件系統(tǒng)中,數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫設(shè)計是非常重要的。數(shù)據(jù)庫技術(shù)是一項專門的技術(shù),不是本書討
論的范圍。但是作為軟件開發(fā)人員要知道,在大型數(shù)據(jù)處理
系統(tǒng)的功能分析與設(shè)計中,是要進行數(shù)據(jù)分析與數(shù)據(jù)設(shè)計的。1)數(shù)據(jù)結(jié)構(gòu)的設(shè)計根據(jù)需求分析階段對系統(tǒng)數(shù)據(jù)的組成、操作約束和數(shù)據(jù)之間的關(guān)系的描述,確定數(shù)據(jù)結(jié)構(gòu)特性。總體設(shè)計階段利用逐步細化的方法對數(shù)據(jù)結(jié)構(gòu)進行深入的設(shè)計,但是也不是像詳細設(shè)計那樣規(guī)定具體的實現(xiàn)細節(jié)。在總體設(shè)計階段,比較適宜使用抽象的數(shù)據(jù)類型,這些抽象的數(shù)據(jù)類型到詳細設(shè)計階段再用具體的數(shù)據(jù)結(jié)構(gòu)描述其實現(xiàn)。如“?!笔菙?shù)據(jù)結(jié)構(gòu)的第6章軟件總體設(shè)計概念模型,在詳細設(shè)計中可用線性表和鏈表來實現(xiàn)。設(shè)計有效的數(shù)據(jù)結(jié)構(gòu),將大大簡化軟件模塊處理過程的設(shè)計。2)數(shù)據(jù)庫的設(shè)計一般的軟件系統(tǒng)都有數(shù)據(jù)的存儲,存儲要借助數(shù)據(jù)庫技術(shù)。數(shù)據(jù)庫的設(shè)計是指數(shù)據(jù)存儲文件的設(shè)計。設(shè)計包括以下三個方面:(1)概念設(shè)計。在數(shù)據(jù)分析的基礎(chǔ)上,從用戶角度采用自底向上的方法進行視圖設(shè)計。一般用E-R模型來表示數(shù)據(jù)
模型,這是一個概念模型。E-R模型既是設(shè)計數(shù)據(jù)庫的基礎(chǔ),也是設(shè)計數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。IDEF
lx技術(shù)也支持概念模式,
用IDEF
lx方法建立系統(tǒng)的信息模型,使其具有一致性、可
擴展性和可變性等特性,該模型可作為數(shù)據(jù)庫設(shè)計的主要依據(jù)。第6章軟件總體設(shè)計邏輯設(shè)計。E-R模型或IDEF
lx模型是獨立于數(shù)據(jù)庫管理系統(tǒng)(DBMS)的,要結(jié)合具體的DBMS特征來建立數(shù)據(jù)
庫的邏輯結(jié)構(gòu)。對于關(guān)系型的DBMS來說,將概念結(jié)構(gòu)轉(zhuǎn)換為數(shù)據(jù)模式、子模式并進行規(guī)范,要給出數(shù)據(jù)結(jié)構(gòu)的定義,即定義所含的數(shù)據(jù)項、類型、長度及它們之間的層次或相互關(guān)系的表格等。物理設(shè)計。對于不同的DBMS,物理環(huán)境不同,提
供的存儲結(jié)構(gòu)與存取方法也各不相同。物理設(shè)計就是設(shè)計數(shù)據(jù)模式的一些物理細節(jié),如數(shù)據(jù)項存儲要求、存取方式和索引的建立等。第6章軟件總體設(shè)計網(wǎng)絡(luò)系統(tǒng)設(shè)計如果采用的是網(wǎng)絡(luò)環(huán)境,則要進行網(wǎng)絡(luò)系統(tǒng)的設(shè)計。要分析網(wǎng)絡(luò)負荷與容量,遵照網(wǎng)絡(luò)系統(tǒng)設(shè)計原則,確定網(wǎng)絡(luò)系統(tǒng)的需求。要進行網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計,選擇好網(wǎng)絡(luò)操作系統(tǒng),確定網(wǎng)絡(luò)系統(tǒng)配置,制定網(wǎng)絡(luò)拓撲結(jié)構(gòu)。軟件總體設(shè)計文檔總體設(shè)計說明書是總體設(shè)計階段結(jié)束時提交的技術(shù)文檔。按國標GB8576—88的《計算機軟件產(chǎn)品開發(fā)文件編制指南》規(guī)定,軟件設(shè)計文檔可分為“總體設(shè)計說明書”、“詳細設(shè)計說明書”和“數(shù)據(jù)庫設(shè)計說明書”。這些文檔的內(nèi)容與格式請參考有關(guān)資料。第6章軟件總體設(shè)計5.評審在該階段,對設(shè)計部分是否完整地實現(xiàn)了需求中規(guī)定的功能、性能等要求,設(shè)計方案的可行性、關(guān)鍵的處理及內(nèi)外部接口定義正確性、有效性以及各部分之間的一致性等,都需要進行一一評審。第6章軟件總體設(shè)計6.4
設(shè)計基本原理軟件設(shè)計要回答下列問題:使用什么樣的準則才能把軟件劃分成為各個單獨的構(gòu)件?怎樣把功能或數(shù)據(jù)結(jié)構(gòu)的細節(jié)從軟件概念表達式中分離出來?定義軟件設(shè)計的技術(shù)質(zhì)量有統(tǒng)一的準則嗎?軟件設(shè)計中最重要的一個問題就是軟件質(zhì)量問題,用什么標準對軟件設(shè)計的技術(shù)質(zhì)量進行衡量呢?本節(jié)將介紹軟件發(fā)展中應(yīng)用過并經(jīng)過時間考驗的軟件設(shè)計的一些基本原理。第6章軟件總體設(shè)計6.4.1抽象抽象是認識復(fù)雜現(xiàn)象過程中使用的思維工具,即抽出事物本質(zhì)的共同特性而暫不考慮它的細節(jié)及其他因素。當考慮用模塊化的方法解決問題時,可以提出不同層次的抽象(Levels
of
Abstraction)。在抽象的最高層,可以使用問題環(huán)境的語言,以概括的方式敘述問題的解。在抽象的較低層,則采用更過程化的方法,在描述問題解時將面向問題的術(shù)語與面向?qū)崿F(xiàn)的術(shù)語結(jié)合使用。最終,在抽象的最底層,可以用直接實現(xiàn)的方式來說明。軟件工程實施中的每一步都可以看做是對軟件抽象層次的一次細化。第6章軟件總體設(shè)計隨著對抽象不同層次的展開,過程抽象(ProceduralAbstraction)和數(shù)據(jù)抽象(Data
Abstraction)就建立了。所謂過程抽象,是指一個命名的指令序列,它具有一個特定的和受限的功能。例如有一個進入某場合的詞“入口”,對于這個詞進行分析,會發(fā)現(xiàn)其隱含了走到門口、伸出手、握住門把、旋轉(zhuǎn)門把和推門、走進門的一系列的過程序列。數(shù)據(jù)抽象則是一個已命名的說明數(shù)據(jù)對象的數(shù)據(jù)集合。例如一個部門員工的“工資單”這個數(shù)據(jù)對象,實際上是許多不同方面的信息,如單位、姓名、工資總額、扣除房租、水電費、煤氣費、電話費、電視費、實得金額等的集合。在說明這個數(shù)據(jù)抽象名時,指的是所有數(shù)據(jù)。控制抽象(Control
Abstraction)是軟件設(shè)計中的第三種抽象形式。像過程抽象和數(shù)據(jù)抽象一樣,。第6章軟件總體設(shè)計控制抽象隱含了程序控制機制,不必說明它的內(nèi)部細節(jié)??刂瞥橄蟮睦邮遣僮飨到y(tǒng)中用于進程協(xié)調(diào)活動的同步信號標。許多編程語言(如Ada、MODULA、CLU)都給出了建立抽象數(shù)據(jù)類型的機制(mechanisms)。例如,Ada的包(package)就是一種支持數(shù)據(jù)抽象和過程的編程語言機制。這種最初的
抽象數(shù)據(jù)類型可以用作模板(template)或類屬(generic)數(shù)據(jù)結(jié)構(gòu),由此導(dǎo)出的其他數(shù)據(jù)結(jié)構(gòu)可以是它們的實例。第6章軟件總體設(shè)計6.4.2細化逐步細化是一種自頂向下的設(shè)計策略。程序的體系結(jié)構(gòu)開發(fā)是由過程細節(jié)層次不斷地細化而成的。分層的開發(fā)則是以逐步的方式由分解一個宏功能直到獲得編程語言語句。在細化的每一步,已給定的程序的一條或幾條指令被分解為更多細節(jié)的指令。當所有指令按計算機或編程語言寫成時,這樣不斷的分解或規(guī)格說明的細化也將終止。隨著任務(wù)的細化,數(shù)據(jù)也要細化、分解或結(jié)構(gòu)化。程序的細化和數(shù)據(jù)的說明一并進行。每一步細化都隱含著一定的設(shè)計決策。重要的是程序員應(yīng)當通曉一些最基本的準則和存在的可選方案。第6章軟件總體設(shè)計細化實際上是一個詳細描述(elaboration)的過程。在高層抽象定義時,從功能說明或信息描述開始,就是說明功能或信息的概念,而不給出功能內(nèi)部的工作細節(jié)或信息的內(nèi)部結(jié)構(gòu)。細化則是設(shè)計者在原始說明的基礎(chǔ)上進行詳細說明,隨著不斷的細化(詳細說明)給出更多的細節(jié)。6.4.3模塊化在計算機軟件中,幾乎所有的軟件體系結(jié)構(gòu)都要體現(xiàn)模塊(module)化。也就是說,所有的軟件結(jié)構(gòu)設(shè)計技術(shù)都是以模塊化為基礎(chǔ)的。模塊以單獨命名和可編址的構(gòu)件被集成,以滿足問題的需求。第6章軟件總體設(shè)計模塊化的概念在程序設(shè)計技術(shù)中就出現(xiàn)了。何為模塊?模塊在程序中是數(shù)據(jù)說明、可執(zhí)行語句等程序?qū)ο蟮募希蛘呤菃为毭途幹返脑?,如高級語言中的過程、函數(shù)和子程序等。在軟件體系結(jié)構(gòu)中,模塊是可組合、分解和更換的單元。模塊具有以下幾種基本屬性:接口:模塊的輸入與輸出。功能:模塊實現(xiàn)什么功能。邏輯:描述內(nèi)部如何實現(xiàn)要求的功能及所需的數(shù)據(jù)。狀態(tài):該模塊的運行環(huán)境,即模塊的調(diào)用與被調(diào)用關(guān)系。功能、狀態(tài)與接口反映模塊的外部特性,邏輯反映它的內(nèi)部特性。第6章軟件總體設(shè)計模塊化是指解決一個復(fù)雜問題時自頂向下逐層把軟件系統(tǒng)劃分成若干模塊的過程。每個模塊完成一個特定的子功能,所有的模塊按某種方法組裝起來,成為一個整體,完成整個系統(tǒng)所要求的功能。在面向?qū)ο笤O(shè)計中,模塊和模塊化的概念將進一步擴充。模塊化是軟件解決復(fù)雜問題所具備的手段,也是軟件的一個重要屬性,它使得一個程序易于被人們所理解、設(shè)計、測試和維護。如果一個軟件就是一個模塊,是很難讓人理解的。因為,對這么多的控制路徑、這么廣的涉及范圍、這么大量的變量、這么復(fù)雜的軟件進行了解、處理和管理幾乎是不可能的。為了說明這一點,請看下面的論據(jù)。第6章軟件總體設(shè)計設(shè)問題x的復(fù)雜性函數(shù)為C(x),解決它所需的工作量函數(shù)為E(x)。對于問題P1和P2,如果有C(P1)
>
C(P2)即P1比P2復(fù)雜,那么E(P1)
>
E(P2)即問題越復(fù)雜,所需要的工作量越大。根據(jù)解決一般問題的經(jīng)驗,規(guī)律為:C(P1
+
P2)
>
C(P1)
+
C(P2)即一個問題同問題組合而成的復(fù)雜度大于分別考慮每個問題的復(fù)雜度之和。這樣,可以推出:E(P1
+
P2)
>
E(P1)
+
E(P2)第6章軟件總體設(shè)計所得結(jié)果對于模塊化和軟件具有重要的意義。那么,從上面所得的不等式是否可以得出這樣的結(jié)論:如果把軟件無限細分,那么最后開發(fā)軟件所需要的工作量就小得可以忽略了。但是,事實上,影響軟件開發(fā)工作量的因素還有許多,例如模塊接口費用等,所以上述結(jié)論不能成立。因為,隨著模塊數(shù)目的增加,模塊之間的接口的復(fù)雜程度和接口所需的工作量也在隨之增加。上述不等式只能說明:當模塊總數(shù)增加時,單獨開發(fā)各個子模塊的工作量之和會有所減少。根據(jù)這兩個因素之間的關(guān)系,可以畫出工作量或成本曲線圖,如圖5.2所示,從圖中所示的曲線看,存在著一個工作量最小或開發(fā)成本最小的模塊數(shù)目M區(qū)。第6章軟件總體設(shè)計雖然現(xiàn)在還沒有辦法算出M的準確數(shù)值,但在考慮模塊時,軟件總成本曲線確實提供了非常有用的指導(dǎo)。這就是在模塊化的過程中,必須減少接口的復(fù)雜性。應(yīng)當指出,一個系統(tǒng)按模塊化的概念來設(shè)計非常重要,即使它的實現(xiàn)必須是整體結(jié)構(gòu)(monolithic)。有這樣的情況(如實時軟件/微處理器軟件):由于子程序(如子例程、過程)的引入,而使極低的速度和過大的內(nèi)存開銷變得不可接受。在這種情況下,也應(yīng)當把軟件的模塊化設(shè)計作為最基本的準則。代碼可以逐行編寫,縱然程序的源代碼初看起來不是模塊,但模塊化的準則應(yīng)當保持,這樣的程序?qū)心K系統(tǒng)的所有好處。第6章軟件總體設(shè)計圖5.2是軟件模塊數(shù)量、模塊集成成本、模塊成本總和及軟件總成本的關(guān)系。從圖中可以看出,隨著模塊數(shù)量的增加,模塊開發(fā)成本之和是減少了,但是模塊集成成本之和卻增加了,所以,模塊數(shù)量必須適中。圖中M區(qū)是一個使軟件開發(fā)總工作量最小的曲線區(qū)。事實上,圖5.2中所謂的軟件總成本也只考慮模塊集成成本和子模塊開發(fā)成本。模塊的劃分、設(shè)計還需要遵循其他設(shè)計原則。下面將介紹模塊設(shè)計的基本方法和優(yōu)化原則。第6章軟件總體設(shè)計6.4.4軟件體系結(jié)構(gòu)軟件總體設(shè)計的主要任務(wù)就是軟件結(jié)構(gòu)的設(shè)計。軟件體系結(jié)構(gòu)(software
architecture)包含了計算機程序的兩個重要特性:過程構(gòu)件(模塊)的層次結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)。軟件體系結(jié)構(gòu)通過過程的劃分來導(dǎo)出,而這個過程與需求分析時定義的真實世界問題各部分的軟件解有關(guān)。軟件結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的演化(evolution)從問題定義開始。當問題的各部分分別由一個或多個軟件元素求解時,問題解也就有了。圖6.4給出了象征性的表示,它表示了軟件需求分析到設(shè)計
的轉(zhuǎn)換。第6章軟件總體設(shè)計圖6.4結(jié)構(gòu)化演化第6章軟件總體設(shè)計從圖6.5可以看出,一個問題可以有多種可供選擇的結(jié)構(gòu),而選擇某種結(jié)構(gòu)又由軟件設(shè)計方法來確定。圖6.5不同結(jié)構(gòu)第6章軟件總體設(shè)計由此可以看出,由于各種設(shè)計方法的原理不同,同一個軟件需求也會導(dǎo)出不同的軟件結(jié)構(gòu)。那么,當一個問題的軟件結(jié)構(gòu)導(dǎo)出后,如何評價其不同結(jié)構(gòu)的優(yōu)劣?沒有一個形式化的準則,就很難回答這個問題。目前還不能對導(dǎo)出的軟件結(jié)構(gòu)做出準確的定量評價,但是在稍后部分討論體系結(jié)構(gòu)設(shè)計的結(jié)構(gòu)特征時,可以通過分析的方法來確定它們的整體質(zhì)量。第6章軟件總體設(shè)計6.4.5程序結(jié)構(gòu)程序結(jié)構(gòu)(program
structure)給出了程序構(gòu)件(模塊)的組織(通常叫分層),這種組織包含了控制的層次。但是,它們不給出軟件的過程方面,如過程的序列、決策的出現(xiàn)或次序、操作的重復(fù)等。程序結(jié)構(gòu)可以用許多不同的符號來表示,最常用的是如圖6.6所示的樹形結(jié)構(gòu)圖。其他符號,如具有相同作用的Warnier-Orr圖和Jackson圖也可以使用。為了討論結(jié)構(gòu)的方便,定義了一些簡單的度量和術(shù)語,如圖6.6所示。從圖6.6可以看出,深度(depth)表示控制的層次,寬度(width)表示同一層次上控制的最大數(shù),扇出(fan-out)是對一個模塊直接控制其他模塊數(shù)目的度量,扇入(fan-in)則是對一個給定模塊被多少個模塊直接控制的度量。第6章軟件總體設(shè)計圖6.6結(jié)構(gòu)專用名詞第6章軟件總體設(shè)計模塊之間的控制關(guān)系可用下面的方法表示:控制另一模塊的模塊叫做上級模塊(superordinate)。反過來,被另一模塊控制的模塊叫做從屬模塊(subordinate)。例如圖6.6中,模塊m是模塊n、o、p、q的上級模塊,模塊f、g既是模塊d的從屬模塊,同時也是模塊M的從屬模塊。寬度方向上的關(guān)系(如模塊d與e)雖然也可以表示,但無需用明確的專門名詞來定義。根據(jù)圖6.6,可以給出軟件體系結(jié)構(gòu)特征:可見性(visibility)和連接性(connectivity)??梢娦员砻髟摮绦驑?gòu)件合可以引用或使用一個給定構(gòu)件作為數(shù)據(jù),即使是間接完成時也是如此。而連接性表明該構(gòu)件集合直接引用或使用一個給定構(gòu)件作為數(shù)據(jù)。這兩種特征是難以分辨的。第6章軟件總體設(shè)計6.4.6數(shù)據(jù)結(jié)構(gòu)在軟件體系結(jié)構(gòu)的表達式中,數(shù)據(jù)結(jié)構(gòu)與程序結(jié)構(gòu)同樣重要。數(shù)據(jù)結(jié)構(gòu)決定信息的組織、存取方法、結(jié)合的程度以
及可選的處理方法。這里只給出一些概念,因為更好地理解
這些傳統(tǒng)的組織信息的方法,以及怎樣從基層支持信息層次
的概念都是重要的。對此不深入討論,僅給出數(shù)據(jù)結(jié)構(gòu)(data
structure)的定義,它是一種數(shù)據(jù)各元素之間邏輯關(guān)系的表達式。一個數(shù)據(jù)結(jié)構(gòu)的組織和復(fù)雜性只受設(shè)計者創(chuàng)造性的限制。但是典型的數(shù)據(jù)結(jié)構(gòu)可以組成更復(fù)雜的結(jié)構(gòu)模塊。這些典型的數(shù)據(jù)結(jié)構(gòu)如圖6.7所示。第6章軟件總體設(shè)計圖6.7典型的數(shù)據(jù)結(jié)構(gòu)第6章軟件總體設(shè)計標量項(scalar
item)表示一個用標識符標識的單元信息元素。也就是說,它在存儲器中用一個確定的單一地址就可得到。一個標量項是所有數(shù)據(jù)結(jié)構(gòu)中最簡單的一種。標量項的規(guī)模和格式在一種編程語言中所確定的邊界內(nèi)可以有變化。例如,標量項可以是一個長度為1位的邏輯實體,或者是一個長度為8位到64位的整型數(shù)或浮點數(shù),甚至是一個長度為幾百或幾千字節(jié)的字符串。當組織標量項作為一列或連接的組時,就形成一個順序向量(sequential
vector)。向量是數(shù)據(jù)結(jié)構(gòu)中最常用的。例如下面這個C語言程序段的例子:第6章軟件總體設(shè)計第6章軟件總體設(shè)計例子中定義aa為100個標量整數(shù)項的順序向量。在過程ps中標引aa的每個元素的存儲,這樣數(shù)據(jù)結(jié)構(gòu)的每個元素都可按定義的順序引用。如果把順序向量擴展為多維,就構(gòu)成了一個n維的空間(n-dimensional
space)。在大多數(shù)編程語言中,把n維空間叫做數(shù)組(array)。標量、向量和空間可以用不同的格式組織。鏈表(1inked
list)就是一種非鄰接的標量的組織。向量或空間用一定的方式能使它們作為一個表來處理。每個結(jié)點具有適當?shù)慕M織、一個或多個指針,這個指針表明表中下一個結(jié)點在結(jié)點存儲器中的地址。在鏈表的結(jié)構(gòu)中,為了適應(yīng)新表入口的需要,可以在表中的任意點上增加重新定義的指針。第6章軟件總體設(shè)計利用上述的基本數(shù)據(jù)結(jié)構(gòu)可以構(gòu)造出其他的數(shù)據(jù)結(jié)構(gòu)。例如,使用包含標量項、向量和可能的n維空間的多鏈表可以實現(xiàn)層次的數(shù)據(jù)結(jié)構(gòu)(hierarchical
data
structure)。層次型的結(jié)構(gòu)通常在要求信息分類和組合性中應(yīng)用。信息分類包含了一些類屬分類;組合性包含從不同的類組合信息的能力。例如,在微處理器中找出所有價格低于1000美元,主頻1GHz和銷售商的條目種類就是組合性要求。數(shù)據(jù)結(jié)構(gòu)可以給出不同層次的抽象。例如,棧(stack)是數(shù)據(jù)結(jié)構(gòu)的一個概念模型,它可以由向量或鏈表來實現(xiàn)。棧內(nèi)部的工作情況決定于設(shè)計細節(jié)的層次,可以說明,也可以不說明。第6章軟件總體設(shè)計6.4.7軟件過程在討論軟件結(jié)構(gòu)時不考慮處理和決策,以及順序定義的控制層次。而軟件過程(software
procedure)(如圖6.8所示)則側(cè)重于每一個單獨模塊的處理細節(jié)研究。過程必須提供精確的事件的順序、確切的抉擇點、重復(fù)的操作以及數(shù)據(jù)的組織與結(jié)構(gòu)處理規(guī)格說明。第6章軟件總體設(shè)計圖6.8一個模塊內(nèi)的過程第6章軟件總體設(shè)計當然,結(jié)構(gòu)與過程是相互關(guān)聯(lián)的。對每個模塊所規(guī)定的處理必須包括說明該模塊的所有從屬模塊。軟件過程的表示也是分層的,如圖6.9所示。第6章軟件總體設(shè)計圖6.9過程的分層第6章軟件總體設(shè)計過程設(shè)計中要用到模塊。規(guī)定和設(shè)計模塊應(yīng)當包含模塊內(nèi)的過程和數(shù)據(jù)的信息,對于其他不需要這些信息的模塊是不可訪問的。有效的模塊化可以通過定義的一組獨立的模塊來達到。獨立的模塊彼此之間僅僅交換那些為了完成系統(tǒng)功能所必需的信息。因為絕大多數(shù)的數(shù)據(jù)和過程是軟件其他部分不可訪問的,這樣規(guī)定和設(shè)計的模塊會帶來極大的好處。第6章軟件總體設(shè)計6.5
體系結(jié)構(gòu)設(shè)計6.5.1軟件結(jié)構(gòu)圖軟件結(jié)構(gòu)圖是軟件系統(tǒng)的模塊層次結(jié)構(gòu),反映了整個系統(tǒng)的功能實現(xiàn),即將來程序的控制層次體系。對于一個“問題”,可用不同的軟件結(jié)構(gòu)來解決。使用不同的設(shè)計方法、不同的劃分和組織,可得出不同的軟件結(jié)構(gòu)。軟件結(jié)構(gòu)往往用樹狀或網(wǎng)狀結(jié)構(gòu)的圖形來表示。軟件工程中,一般采用20世紀70年代中期美國Yourdon等提出的稱為結(jié)構(gòu)圖(Structure
Chart,SC)的工具來表示軟件結(jié)構(gòu)。結(jié)構(gòu)圖的主要內(nèi)容有以下幾種。第6章軟件總體設(shè)計模塊模塊用方框表示,并用名字標識該模塊,名字應(yīng)體現(xiàn)該模塊的功能。模塊的控制關(guān)系兩個模塊間用單向箭頭或直線連接起來表示它們的控制關(guān)系,如圖6.10所示。按照慣例,總是位于圖中上方的模塊調(diào)用下方的模塊,所以不用箭頭也不會產(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è)計圖6.10模塊間的控制關(guān)系及信息傳遞第6章軟件總體設(shè)計模塊間的信息傳遞模塊間還經(jīng)常用帶注釋的短箭頭表示模塊調(diào)用過程中來回傳遞的信息,如圖6.10所示。兩個附加符號用兩個附加符號表示模塊有選擇調(diào)用或循環(huán)調(diào)用,如圖6.11所示。第6章軟件總體設(shè)計圖6.11選擇調(diào)用和循環(huán)調(diào)用的表示(a)選擇調(diào)用;(b)循環(huán)調(diào)用第6章軟件總體設(shè)計圖6.11(a)的A模塊下方有一個菱形符號,表示A中有判斷處理功能,它有條件地調(diào)用B或C;圖6.11(b)中M模塊下方有一個弧形箭頭,表示M循環(huán)調(diào)用T1、T2和T3模塊。5.結(jié)構(gòu)圖的形態(tài)特征為了討論結(jié)構(gòu)圖的特征,將如圖6.6所示的樹形結(jié)構(gòu)圖重畫,如圖6.12所示。第6章軟件總體設(shè)計圖6.12結(jié)構(gòu)圖示例第6章軟件總體設(shè)計結(jié)構(gòu)圖的形態(tài)特征包括:深度:指結(jié)構(gòu)圖控制的層次,即模塊的層數(shù)。如圖
6.12所示,結(jié)構(gòu)圖的深度為5。寬度:指一層中最大的模塊個數(shù)。如圖6.12所示,寬度為8。扇出:指一個模塊直接下屬模塊的個數(shù)。如圖6.12所示,模塊M的扇出為3。扇入:指一個模塊直接上屬模塊的個數(shù)。如圖6.12所示,模塊T的扇入為4。第6章軟件總體設(shè)計6.畫結(jié)構(gòu)圖應(yīng)注意的事項同一名字的模塊在結(jié)構(gòu)圖中僅出現(xiàn)一次。調(diào)用關(guān)系只能從上到下。不嚴格表示模塊的調(diào)用次序,習(xí)慣上從左到右。有
時為了減少連線的交叉,適當?shù)卣{(diào)整同一層模塊的左右位置,以保持結(jié)構(gòu)圖的清晰性。第6章軟件總體設(shè)計6.5.2模塊的大小前面在討論模塊設(shè)計的原理時,已經(jīng)知道一個系統(tǒng)應(yīng)當由若干個模塊構(gòu)成,其目的是為了降低系統(tǒng)的復(fù)雜度。但是并沒有一個明確的準則說明模塊應(yīng)當多大才合適。有些教材上說明一個模塊最好只包含50~60條語句(即可打印在一頁打印紙上),這是考慮到開發(fā)人員能方便地對設(shè)計的模塊進行閱讀和研究。如果模塊的規(guī)模增大為100條語句,甚至達到幾百條語句,那么閱讀和研究就比較困難了。目前,國內(nèi)外關(guān)于模塊大小的規(guī)定也不一樣,最多允許一個模塊含有500條語句。但是過小的模塊也不一定好,因為調(diào)用子程序入口和出口需要做附加操作。如果接口復(fù)雜,這種附加操作可能比子程序本身的操作還要多,這樣就不合適。第6章軟件總體設(shè)計模塊設(shè)計的準則不應(yīng)該看語句的多少,而應(yīng)當看模塊是否是一個獨立的功能。如果多個上級模塊需要調(diào)用一個模塊,若不將該模塊設(shè)計為單獨模塊,就要重復(fù)多次,這樣不僅使程序增大,測試和維護也不方便。在這種情況下,防止影響運行速度的方法可以用類似于C語言的include語句或匯編語言中的宏功能來解決。第6章軟件總體設(shè)計6.5.3扇出和扇入與深度和寬度由結(jié)構(gòu)圖的形態(tài)特征可以知道,一個系統(tǒng)的大小和系統(tǒng)的復(fù)雜度在一定程度上可以用深度和寬度表示。因此可以推
理,系統(tǒng)越大越復(fù)雜,其深度和寬度也就越大。而深度與程
序的語句效率和模塊大小的劃分有關(guān)。設(shè)計者在結(jié)構(gòu)設(shè)計過
程中主要關(guān)心的是模塊的高聚合和低耦合,以及模塊的規(guī)模。所以,實際上,深度只是對結(jié)構(gòu)設(shè)計好壞的一種測度。例如
一個程序有100條語句,如果將其劃分為20個模塊并用20層來調(diào)用,則肯定分解過多。第6章軟件總體設(shè)計在討論寬度時,注意到與其相關(guān)的最大因素是模塊的扇出。從圖6.6中了解到,如果扇出過大,則上級模塊需要過多地控制這些從屬模塊,反而會增加復(fù)雜性,而且也增加了設(shè)計人員在設(shè)計過程中的難度。根據(jù)歷史的經(jīng)驗,扇出一般最好控制在3~4個,最高也不要超過6~7個。從討論深度的過程可以知道,扇出過小,會增加結(jié)構(gòu)的深度。扇出實際上是對問題解的分解。分解過程中需要考慮的問題就是,前面是否已經(jīng)有一個模塊與當前所需要的模塊功能相同或相似。若完全相同,則可以共享;若功能類似,則應(yīng)區(qū)分哪些部分相同,這樣可以把相同的部分分離出來成為單獨的模塊,如圖6.13至圖6.15所示。第6章軟件總體設(shè)計圖6.13分解模塊一第6章軟件總體設(shè)計圖6.14分解模塊二第6章軟件總體設(shè)計圖6.15分解模塊三第6章軟件總體設(shè)計如圖6.13所示,Q2與已有的Q1相似;圖6.14把Q中相同
的部分分離出來;圖6.15(a)中,如果Q很小,可并入X、Q2";圖6.15(b)中,如果Q也很小,則可以并入Y、X。大量的系統(tǒng)研究表明,高層模塊應(yīng)有較高的扇出,低層模塊特別是底層模塊應(yīng)有高的扇入。扇入越高,表示該模塊被更多的上級模塊共享。多個扇入口相同,這就避免了程序的重復(fù),因此希望扇入高一點。但扇入過高又可能是把許多不相關(guān)的功能硬湊在一起,形成通用模塊,這樣的模塊必然是低聚合的。第6章軟件總體設(shè)計6.5.4模塊的耦合耦合(Coupling)表示軟件結(jié)構(gòu)內(nèi)不同模塊彼此之間相互依賴(連接)的緊密程度,是衡量軟件模塊結(jié)構(gòu)質(zhì)量好壞的度量,是對模塊獨立性的直接衡量指標。軟件設(shè)計應(yīng)追求松散耦合,避免強耦合。模塊的耦合越松散,模塊間的聯(lián)系就越小,模塊的獨立性就越強。這樣,對模塊測試、維護就越容易,錯誤傳播的可能性也就越小。第6章軟件總體設(shè)計耦合強弱取決于模塊間接口的復(fù)雜程度,進入或訪問一個模塊的點以及通過接口的數(shù)據(jù)。如果兩個模塊中每個模塊都能獨立地工作,而不需要另一個模塊的存在,那么它們彼此之間完全獨立,即沒有任何聯(lián)系,也無所謂耦合可言。但是,在一個軟件系統(tǒng)內(nèi)不可能所有模塊之間都沒有任何連接。一般地,可以將模塊的耦合分成四類:數(shù)據(jù)耦合、控制耦合、公共環(huán)境耦合和內(nèi)容耦合。第6章軟件總體設(shè)計1.數(shù)據(jù)耦合如果兩個模塊彼此間通過參數(shù)交換信息,而且交換的信息僅僅是數(shù)據(jù),那么這種耦合稱為數(shù)據(jù)耦合。數(shù)據(jù)耦合是低耦合。系統(tǒng)中必須存在這種耦合,因為只有當某些模塊的輸出數(shù)據(jù)作為另一些模塊的輸入數(shù)據(jù)時,系統(tǒng)才能完成有價值的功能。一般來說,一個系統(tǒng)內(nèi)可以只包含數(shù)據(jù)耦合。圖6.16說明了模塊B與C的調(diào)用關(guān)系是數(shù)據(jù)耦合。第6章軟件總體設(shè)計圖6.16數(shù)據(jù)耦合第6章軟件總體設(shè)計2.控制耦合如果傳遞的信息中有控制信息,則這種耦合稱為控制耦合,如圖6.17所示??刂岂詈鲜侵械瘸潭鹊鸟詈?,它增加了系統(tǒng)的復(fù)雜程度??刂岂詈贤嵌嘤嗟模诎涯K適當分解之后通??梢杂脭?shù)據(jù)耦合代替它。例如,圖6.17中模塊B的內(nèi)部處理邏輯判斷是決定執(zhí)行F1、F2還是執(zhí)行Fn,這要取決于模塊A傳來的信息“標志”Flag。第6章軟件總體設(shè)計圖6.17控制耦合第6章軟件總體設(shè)計3.公共環(huán)境耦合當兩個或多個模塊通過一個公共數(shù)據(jù)環(huán)境相互作用時,它們之間的耦合稱為公共環(huán)境耦合(即公用耦合)。公共環(huán)境可以是全局變量、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)、任何存儲介質(zhì)上的文件、物理設(shè)備等。公共環(huán)境耦合的復(fù)雜程度隨耦合的模塊個數(shù)而變化,當耦合的模塊個數(shù)增加時,復(fù)雜程度顯著增加。如果只有兩個模塊有公共環(huán)境,那么這種耦合有下述兩種可能,如圖6.18所示。第6章軟件總體設(shè)計圖6.18公用耦合(a)松散的公用耦合;(b)緊密的公用耦合第6章軟件總體設(shè)計一個模塊往公共環(huán)境送數(shù)據(jù),另一個模塊從公共環(huán)境取數(shù)據(jù),這是數(shù)據(jù)耦合的一種形式,是比較松散的耦合。兩個模塊都既往公共環(huán)境送數(shù)據(jù)又從里面取數(shù)據(jù),這種耦合比較緊密,介于數(shù)據(jù)耦合和控制耦合之間。如果兩個模塊共享的數(shù)據(jù)很多,都通過參數(shù)傳遞可能很不方便,這時可以利用公共環(huán)境耦合。4.內(nèi)容耦合最高程度的耦合是內(nèi)容耦合。如圖6.19所示,兩個模塊間就發(fā)生了內(nèi)容耦合。第6章軟件總體設(shè)計圖6.19內(nèi)容耦合(a)進入另一塊內(nèi)部;(b)代碼重復(fù);(c)多入口第6章軟件總體設(shè)計一個模塊訪問另一個模塊的內(nèi)部數(shù)據(jù);一個模塊不通過正常入口而轉(zhuǎn)到另一個模塊的內(nèi)部;兩個模塊有一部分代碼重疊(只可能出現(xiàn)在匯編程序中);一個模塊有多個入口(這表明一個模塊有幾種功能)。應(yīng)該堅決避免使用內(nèi)容耦合。事實上許多高級程序設(shè)計語言已經(jīng)設(shè)計成不允許在程序中出現(xiàn)任何形式的內(nèi)容耦合??傊詈鲜怯绊懩K結(jié)構(gòu)和軟件復(fù)雜程度的一個重要因素,應(yīng)該采用如下設(shè)計原則:盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共環(huán)境耦合,完全不用內(nèi)容耦合。第6章軟件總體設(shè)計6.5.5模塊的內(nèi)聚內(nèi)聚標志一個模塊內(nèi)各個元素彼此結(jié)合的緊密程度,它是信息隱蔽和局部化概念的自然擴展。簡單地說,理想內(nèi)聚的模塊只做一件事情。設(shè)計時應(yīng)該力求做到高內(nèi)聚,通常中等程度的內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差不多,但是,低內(nèi)聚不要使用。內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往往意味著模塊間的耦合。內(nèi)聚和耦合都是進行模塊化設(shè)計的有力工具,但是實踐表明內(nèi)聚更重要,應(yīng)該把更多注意力集中到提高模塊的內(nèi)聚程度上。第6章軟件總體設(shè)計根據(jù)模塊內(nèi)部的構(gòu)成情況,模塊的內(nèi)聚可以劃分成高、中、低三大類。常見的內(nèi)聚可分成功能內(nèi)聚、順序內(nèi)聚、通信內(nèi)聚、過程內(nèi)聚、時間內(nèi)聚、邏輯內(nèi)聚、偶然內(nèi)聚七類。它們的內(nèi)聚程度依次從高到低,一般認為功能內(nèi)聚和順序內(nèi)聚是高內(nèi)聚,通信內(nèi)聚、過程內(nèi)聚是中內(nèi)聚,時間內(nèi)聚、邏輯內(nèi)聚和偶然內(nèi)聚是低內(nèi)聚。第6章軟件總體設(shè)計功能內(nèi)聚如果模塊內(nèi)所有的處理元素屬于一個整體,完成一個單一的功能,則稱模塊為功能內(nèi)聚。功能內(nèi)聚是最高程度的內(nèi)聚。信息內(nèi)聚信息內(nèi)聚模塊能完成多種功能,各個功能都在同一數(shù)據(jù)結(jié)構(gòu)上操作,每一項功能有一個唯一的入口點。例如圖6.20所示有四個功能,即這個模塊將根據(jù)不同的要求,確定該執(zhí)行哪一功能。第6章軟件總體設(shè)計圖6.20信息內(nèi)聚第6章軟件總體設(shè)計3.通信內(nèi)聚如果一個模塊中所有處理元素都使用同一個輸入數(shù)據(jù)和(或)產(chǎn)生同一個輸出數(shù)據(jù),則稱模塊為通信內(nèi)聚(Communicational
Cohesion)。例如圖6.21所示的模塊A的處理單元是由同一數(shù)據(jù)文件FILE的數(shù)據(jù)產(chǎn)生不同的表格。通信內(nèi)聚有時也稱數(shù)據(jù)內(nèi)聚。圖6.21通信內(nèi)聚第6章軟件總體設(shè)計4.過程內(nèi)聚如果一個模塊內(nèi)部的處理元素是相關(guān)的,而且必須以特定次序執(zhí)行,則稱模塊為過程內(nèi)聚。使用程序流程圖作為工具設(shè)計軟件時,常常通過研究流程圖確定模塊的劃分,這樣得到的往往是過程內(nèi)聚的模塊。過程內(nèi)聚與順序內(nèi)聚的區(qū)別主要在于:順序內(nèi)聚中是數(shù)據(jù)流從一個處理元流到另一個處理元,而過程內(nèi)聚中是控制流從一個動作流向另一個動作。第6章軟件總體設(shè)計5.邏輯內(nèi)聚如果一個模塊完成的任務(wù)在邏輯上屬于相同或相似的一類,則稱模塊為邏輯內(nèi)聚(Logical
Cohesion)。對邏輯內(nèi)聚模塊的調(diào)用,常常需要有一個功能開關(guān),由上層調(diào)用模塊向它發(fā)出一個控制信號,在多個關(guān)聯(lián)性功能中選擇執(zhí)行某一個功能。這種內(nèi)聚較差,增加了模塊之間的聯(lián)系,不易修改。將圖6.22(a)中模塊A、B合并成圖6.22(b)中的模塊AB,那么AB就是一個邏輯內(nèi)聚模塊。在此結(jié)構(gòu)中必須增加一個開關(guān)量傳遞,使這些模塊之間的聯(lián)系程度增加;此外還將增加修改難度,例如如果模塊X需要修改AB中的某共用段,而模塊Y卻不希望修改。第6章軟件總體設(shè)計圖6.22邏輯內(nèi)聚第6章軟件總體設(shè)計6.時間內(nèi)聚如果一個模塊包含的任務(wù)必須在同一段時間內(nèi)執(zhí)行,則稱模塊為時間內(nèi)聚。如圖6.23所示,緊急故障處理模塊中的
關(guān)閉文件、報警、保留現(xiàn)場等任務(wù)都必須無中斷地同時處理,這就是時間內(nèi)聚。在邏輯內(nèi)聚的模塊中,不同功能混在一起,合用部分程序代碼,即使局部功能的修改有時也會影響全局。因此,這類模塊的修改也比較困難。而時間關(guān)系在一定程度上反映了程序的某些實質(zhì),所以時間內(nèi)聚比邏輯內(nèi)聚好一些。第6章軟件總體設(shè)計圖6.23時間內(nèi)聚第6章軟件總體設(shè)計7.偶然內(nèi)聚如果一個模塊完成一組任務(wù),這些任務(wù)彼此間即使有關(guān)系,關(guān)系也是很松散的,則稱模塊為偶然內(nèi)聚。有時在編寫完程序后,發(fā)現(xiàn)一組語句在多處出現(xiàn),于是為了節(jié)省空間而將這些語句作為一個模塊設(shè)計,這就出現(xiàn)了偶然內(nèi)聚。例如,在圖6.24中,模塊A、B、C中出現(xiàn)公共代碼段W,于是將W獨立成一個模塊,而W中這些語句并沒有
任何聯(lián)系。如果在測試中發(fā)現(xiàn)模塊A不需要做“X=Y+Z”,而應(yīng)做“X=Y*Z”,此時對W的維護就很困難了。第6章軟件總體設(shè)計圖6.24偶然內(nèi)聚第6章軟件總體設(shè)計模塊功能劃分的粗細是相對的,所以模塊的內(nèi)聚程度也是相對概念。實際上,很難精確確定內(nèi)聚的級別,重要的是在軟件設(shè)計中應(yīng)力求做到高內(nèi)聚,盡量少用中內(nèi)聚,不用低內(nèi)聚。一般來說,在系統(tǒng)較高層次上的模塊功能較復(fù)雜,內(nèi)聚要低一些,而較低層次上的模塊內(nèi)聚程度較高,達到功能內(nèi)聚的可能性比較大。第6章軟件總體設(shè)計6.5.6結(jié)構(gòu)設(shè)計的一般準則1.模塊獨立性準則劃分模塊時,盡量做到高內(nèi)聚、低耦合,保持模塊的相對獨立性,并以此原則優(yōu)化初始的軟件結(jié)構(gòu)。如果若干模塊之間耦合度過高,每個模塊內(nèi)功能不復(fù)雜,可將它們合并,以減少信息的傳遞和公共區(qū)的引用。若有多個相關(guān)模塊,應(yīng)對它們的功能進行分析,消去重復(fù)功能。第6章軟件總體設(shè)計評價軟件的初始結(jié)構(gòu),通過模塊的分解和合并減小模塊間的聯(lián)系(耦合),增大模塊內(nèi)的聯(lián)系(內(nèi)聚)。例如多個模塊共有一個子功能,可以將其獨立成一個模塊,對于這樣的模塊有時可以通過分解或合并,來減少控制信息的傳遞及對全程數(shù)據(jù)的引用,并且降低接口的復(fù)雜程度,如圖6.25和圖
6.26所示。第6章軟件總體設(shè)計圖6.25模塊的分解第6章軟件總體設(shè)計圖6.26模塊的合并第6章軟件總體設(shè)計2.軟件結(jié)構(gòu)的形態(tài)特征準則軟件結(jié)構(gòu)的深度、寬度、扇入及扇出應(yīng)適當。深度是軟件結(jié)構(gòu)設(shè)計完成后觀察到的情況,能粗略地反映系統(tǒng)的規(guī)模和復(fù)雜程度,寬度也能反映系統(tǒng)的復(fù)雜情況。寬度與模塊的扇出有關(guān),一個模塊的扇出太多,說明本模塊過分復(fù)雜,缺少中間層。單一功能模塊的扇入數(shù)大比較好,說明本模塊為上層幾個模塊共享的公用模塊的重用率高。但是不能把彼此無關(guān)的功能湊在一起形成一個通用的超級模塊,雖然它扇入高,但內(nèi)聚低。因此非單一功能的模塊扇入高時應(yīng)重新分解,以消除控制耦合的情況。軟件結(jié)構(gòu)從形態(tài)上看,應(yīng)是頂層扇出數(shù)較高一些,中間層扇出數(shù)較低一些,底層扇入數(shù)較高一些。第6章軟件總體設(shè)計3.模塊的大小準則在考慮模塊獨立性的同時,為了增加可理解性,模塊最好有50~150條語句,可以用1~2頁打印紙打印,便于人們閱讀與研究。但是,在進行模塊設(shè)計時,首先應(yīng)按模塊的獨立性來選取模塊的規(guī)模。例如,如果某個模塊功能是一個獨立的少于50行的程序段,則不要嫌小而去與其他內(nèi)容拼湊成50行的模塊;如果一個具有獨立功能的程序段占用一頁半,也不要嫌大而將它劃分成兩個模塊。應(yīng)該注意的是,這種用代碼行數(shù)來衡量模塊大小的方法只適合于傳統(tǒng)的程序,現(xiàn)代程序的概念已經(jīng)有了較大的變化,特別是第四代語言(4GL)已不能再用代碼的長度來說明一個
模塊的規(guī)模大小和復(fù)雜程度了。所以,模塊的規(guī)模大小還是要根據(jù)其功能來判斷。第6章軟件總體設(shè)計4.模塊的接口準則模塊的接口要簡單、清晰及含義明確,便于理解,易于實現(xiàn)、測試與維護。模塊接口的復(fù)雜性是軟件發(fā)生錯誤的一個重要原因。因此,設(shè)計模塊接口時,應(yīng)盡量使傳遞的信息簡單并與模塊的功能一致。下面用一個簡單例子來說明接口復(fù)雜性問題。下面是兩個求一元二次方程根的程序模塊:程序模塊1:QUAD-ROOT(TBL,X)這里使用數(shù)組TBL帶入方程的系數(shù):TBL(1)=A、TBL(2)=B、TBL(3)=C;數(shù)組X回送方程的根。第6章軟件總體設(shè)計程序模塊2:QUAD-ROOT(A,B,C,ROOT1,ROOT2)對模塊1而言,接口TBL和X的意義不明確,而模塊2的接口簡單明了,又與模塊功能一致,所以模塊2比模塊1的接口復(fù)雜度要低。6.5.7模塊的作用域與控制域一個模塊的作用范圍應(yīng)在其控制范疇之內(nèi),且條件判定所在的模塊應(yīng)與受影響的模塊在層次上盡量靠近。第6章軟件總體設(shè)計在軟件結(jié)構(gòu)中,由于存在著不同事務(wù)處理的需要,某一層上的模塊會存在著判斷處理,這樣可能影響其他層的模塊處理。為了保證含有判定功能模塊的軟件設(shè)計的質(zhì)量,引入了模塊的作用范圍(或稱影響范圍)與控制范圍的概念。圖6.27~圖6.29給出了三種模塊結(jié)構(gòu)圖,圖中陰影框表示判斷影響到的模塊。它們的作用域都沒有超出控制域。但是僅從作用域與判斷點位置來看,圖6.27的判斷點在層次結(jié)構(gòu)中位置太高,不太理想。其判斷點的作用范圍超過了控制范圍,這種結(jié)構(gòu)最差。該結(jié)構(gòu)增加了數(shù)據(jù)的傳遞量和模塊間的耦合度,會影響到不受它控制的其他模塊,這樣的結(jié)構(gòu)不易理解與維護。第6章軟件總體設(shè)計圖6.27模塊示意圖1第6章軟件總體設(shè)計圖6.28模塊示意圖2第6章軟件總體設(shè)計圖6.29模塊示意圖3第6章軟件總體設(shè)計圖6.28中的判斷模塊較適中。判斷模塊的作用范圍在控制范圍內(nèi),但是判定所在模塊與受判定影響的模塊位置太遠,也存在著額外的數(shù)據(jù)傳遞,增加了接口的復(fù)雜度和耦合度。這種結(jié)構(gòu)雖符合設(shè)計原則,但不理想。圖6.29中的作用域是其直接下層模塊,消除了額外的數(shù)據(jù)傳遞,是最理想的結(jié)構(gòu)圖。如果在設(shè)計過程中發(fā)現(xiàn)模塊的作用范圍不在其控制范圍之內(nèi),可用以下方法加以改進:上移判斷點。使該判斷的層次升高,以擴大它的控制范圍。下移受判斷影響的模塊。將受判斷影響的模塊下移到判斷所在模塊的控制范圍內(nèi)。第6章軟件總體設(shè)計前面所討論的原則與功能設(shè)計是有關(guān)系的。模塊的功能應(yīng)該能夠預(yù)測,也要防止模塊功能的過分局限。當一個模塊輸入的數(shù)據(jù)相同時就產(chǎn)生同樣的輸出,那么這個功能模塊就是可以預(yù)測的。但是要注意,帶有內(nèi)存儲功能的模塊可能是不可預(yù)測的,因為它的輸出可能取決于內(nèi)存儲器的狀態(tài)。由于內(nèi)存儲器對于上級模塊而言是不可見的,所以這樣的模塊難于測試與維護。當一個模塊僅完成一項功能時,則表現(xiàn)為高內(nèi)聚。如果一個模塊限制局部數(shù)據(jù)結(jié)構(gòu)的大小,過度限制在控制流中可以做出的選擇或外部接口模式,那么,這種模塊的功能就過于局限。第6章軟件總體設(shè)計6.6
結(jié)構(gòu)化設(shè)計結(jié)構(gòu)化設(shè)計以結(jié)構(gòu)化分析產(chǎn)生的數(shù)據(jù)流圖為基礎(chǔ),將數(shù)據(jù)流圖按一定的步驟映射成軟件結(jié)構(gòu)。L.Constantine和E.Yourdon等人提出的結(jié)構(gòu)圖是進行軟件設(shè)計的有力工具。
它與結(jié)構(gòu)化分析銜接,構(gòu)成了完整的結(jié)構(gòu)化分析與設(shè)計技術(shù),是目前使用最廣泛的軟件設(shè)計方法之一。在需求分析階段,信息流是考慮的關(guān)鍵問題。用數(shù)據(jù)流圖來描述信息在系統(tǒng)中的流動情況。因為任何系統(tǒng)都可以用數(shù)據(jù)流圖表示,所以結(jié)構(gòu)化設(shè)計方法理論可以設(shè)計任何軟件結(jié)構(gòu)。通常所說的結(jié)構(gòu)化方法也就是基于數(shù)據(jù)流的設(shè)計方法。第6章軟件總體設(shè)計6.6.1數(shù)據(jù)流的類型結(jié)構(gòu)化設(shè)計的目的是要把數(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)的模型,信息一般從外部進入系統(tǒng),通過系統(tǒng)處理后,離開系統(tǒng)。從其過程可以得出,變換型數(shù)據(jù)流圖是一個線性結(jié)構(gòu),是由輸入、變換(或稱處理)和輸出三部分組成的,如圖6.30所示(虛線為標出的流界)。第6章軟件總體設(shè)計圖6.30變換型數(shù)據(jù)流圖第6章軟件總體設(shè)計變換型數(shù)據(jù)處理的工作過程一般分為取得數(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)過輸入正確性和合理性檢查、編輯及格式轉(zhuǎn)換等預(yù)處理,這部分工作都由邏輯輸入部分完成,它將外部形式的數(shù)據(jù)變成內(nèi)部形式,送給變換中心。同理,邏輯輸出部分把變換中心產(chǎn)生的數(shù)據(jù)的內(nèi)部形式轉(zhuǎn)換成外部形式,然后進行物理輸出。當數(shù)據(jù)流圖具有這些特征時,這種信息流就稱為變換流。第6章軟件總體設(shè)計2.事務(wù)型數(shù)據(jù)流圖基本系統(tǒng)模型意味著變換流。因此,原則上可以講所有的信息流都可以歸結(jié)為這一類。然而,若某個加工將它的輸入流分離成許多發(fā)散的數(shù)據(jù)流,形成許多平行的加工路徑,并根據(jù)輸入的值選擇其中一個路徑來執(zhí)行,這種特征的數(shù)據(jù)流圖稱為事務(wù)型數(shù)據(jù)流圖。這個加工稱為事務(wù)處理中心,如圖6.31所示。圖6.31中的處理T稱為事務(wù)中心,它完成了下述任務(wù):接收輸入數(shù)據(jù)。分析每個事務(wù),確定其類型。根據(jù)事務(wù)選擇一條活動通路。第6章軟件總體設(shè)計并不是說一個數(shù)據(jù)流圖就只屬于這兩種數(shù)據(jù)流圖中的一種。一個大型的軟件系統(tǒng)的數(shù)據(jù)流圖,可能既具有變換型的特征,又具有事務(wù)型的特征。例如,事務(wù)型數(shù)據(jù)流圖中的某個加工路徑可能是變換型的。第6章軟件總體設(shè)計圖6.31事務(wù)型數(shù)據(jù)流圖第6章軟件總體設(shè)計6.6.2過程步驟對需求分析階段的結(jié)果進行分析的目的是為了方便地從數(shù)據(jù)流圖轉(zhuǎn)換到程序結(jié)構(gòu)圖。在轉(zhuǎn)換前,先介紹有關(guān)結(jié)構(gòu)化設(shè)計方法轉(zhuǎn)換的步驟。研究數(shù)據(jù)流圖。把數(shù)據(jù)流圖轉(zhuǎn)換成軟件結(jié)構(gòu)圖前,設(shè)計人員要參照規(guī)范說明書,仔細地研究分析數(shù)據(jù)流圖,并參照數(shù)據(jù)字典認真理解其中的有關(guān)元素,檢查有無遺漏或不合理之處,進行必要的修改。確定數(shù)據(jù)流圖類型。通常將系統(tǒng)的數(shù)據(jù)流圖視為變換流。但是,當系統(tǒng)有明顯的事務(wù)流時,就要按照事務(wù)流來處理。要分析系統(tǒng)數(shù)據(jù)流中的主要數(shù)據(jù)流,以此來確定其類型。如果是變換型,確定變換中心和邏輯輸入、邏輯輸出的第6章軟件總體設(shè)計界線,將其映射為變換結(jié)構(gòu)的頂層和第一層;如果是事務(wù)型,確定事務(wù)中心和加工路徑,將其映射為事務(wù)結(jié)構(gòu)的頂層和第一層。另外,當一個類型系統(tǒng)的數(shù)據(jù)流中有另外類型的數(shù)據(jù)流時,可以將其分離出去,作為子系統(tǒng)來處理。(3)找出變換中心。輸入流是一條路徑,數(shù)據(jù)經(jīng)過這條路徑從外部形式轉(zhuǎn)換為內(nèi)部形式。輸出流則相反,從內(nèi)部形式轉(zhuǎn)換為外部形式。但是輸入/輸出流的邊界并不明確。因此不同的設(shè)計人員可能會選擇不同的邊界點,而從不同的邊界點就會得到不同的結(jié)構(gòu)解。盡管如此,數(shù)據(jù)流圖中一個處理點的變動對軟件的結(jié)構(gòu)不會產(chǎn)生很大的影響。如果是事務(wù)流,則這一步是確定事務(wù)中心和每條處理路徑的特征。事務(wù)中心的位置在數(shù)據(jù)流圖中是容易看出的。第6章軟件總體設(shè)計(4)第一層分解。如果是變換流,要把數(shù)據(jù)流圖映射為一種輸入、變換、輸出的特殊結(jié)構(gòu)。在它的頂層是一個主控制器,下面是輸入控制器、變換控制器、輸出控制器。主控制器協(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)包含一個接收分支和一個發(fā)送分支。發(fā)送分支的結(jié)構(gòu)包括一個模塊,它管理所有下屬的模塊。第6章軟件總體設(shè)計第二層分解。這一步的任務(wù)是把數(shù)據(jù)流圖中的各個變換映射成相應(yīng)的模塊。從變換中心的邊界起,沿輸入路徑向前移動,將處理映射成一個一個模塊;然后,從變換中心的邊界起,再沿輸出路徑向前移動,將處理映射成一個一個模塊。把變換映射成下一層的結(jié)構(gòu)。在映射中,可以將一個處理映射成幾個模塊,也可將幾個處理映射成一個模塊。如果是事務(wù)流圖,就表示把各個變換映射成程序結(jié)構(gòu)的模塊,而將事務(wù)處理結(jié)構(gòu)的分支進行分解和細化。根據(jù)優(yōu)化準則對軟件結(jié)構(gòu)求精。描述模塊功能、接口及全局數(shù)據(jù)結(jié)構(gòu)。復(fù)查,如果有錯,轉(zhuǎn)步驟(2)修改完善,否則進入詳細設(shè)計。第6章軟件總體設(shè)計6.6.3變換分析設(shè)計1)確定數(shù)據(jù)流圖中的變換中心、邏輯輸入和邏輯輸出如果設(shè)計人員經(jīng)驗豐富,則容易確定系統(tǒng)的變換中心,即主加工。如幾股數(shù)據(jù)流的匯合處往往是系統(tǒng)的主加工。若一下不能確定,則要從物理輸入端開始,一步一步沿著數(shù)據(jù)流方向向系統(tǒng)中心尋找,直到有這樣的數(shù)據(jù)流,它不能再被看做是系統(tǒng)的輸入,則它的前一個數(shù)據(jù)流就是系統(tǒng)的邏輯輸入。位于邏輯輸入與邏輯輸出之間的就是變換中心。同理,從物理輸出端開始,逆數(shù)據(jù)流方向向中間移動,可以確定系統(tǒng)的邏輯輸出。介于邏輯輸入和邏輯輸出之間的加工就是變換中心,用虛線劃分出邊界,數(shù)據(jù)流圖的三部分就被確定了。第6章軟件總體設(shè)計2)設(shè)計軟件結(jié)構(gòu)的頂層和第一層變換中心確定以后,就相當于決定了主模塊的位置,這就是軟件結(jié)構(gòu)的頂層,如圖6.32所示。其功能主要是完成所有模塊的控制,它的名稱是系統(tǒng)名稱,以體現(xiàn)完成整個系統(tǒng)的功能。主模塊確定之后,設(shè)計軟件結(jié)構(gòu)的第一層。第一層至少要有輸入、輸出和變換三種功能的模塊,它們可能有多個。為每個邏輯輸入設(shè)計一個輸入模塊,其功能是為頂層模塊提供信息,如圖6.32中的f3。為每個邏輯輸出設(shè)計一個輸出模塊,其功能是為頂層模塊提供相應(yīng)的數(shù)據(jù),如圖6.32中的f7、f8。同時,也為變換中心設(shè)計一個變換模塊,其功能是將邏輯輸入進行變換加工,然后邏輯輸出,如圖6.32中將
f3變換成f7和f8。這些模塊之間的數(shù)據(jù)傳送應(yīng)該與數(shù)據(jù)流圖第6章軟件總體設(shè)計相對應(yīng),這樣就得到了軟件結(jié)構(gòu)的頂層模塊。這里的主模塊是總的控制模塊,主模塊中的控制邏輯決定著對其他模塊的調(diào)用。3)設(shè)計中、下層模塊對第一層的輸入、變換及輸出模塊自頂向下、逐層分解,為各類模塊設(shè)計出其下屬模塊。(1)輸入模塊的下屬模塊的設(shè)計。一般情況下,輸入模
塊的功能是向調(diào)用它的模塊提供數(shù)據(jù),所以必須有數(shù)據(jù)來源。因此,輸入模塊應(yīng)由接收輸入數(shù)據(jù)和將數(shù)據(jù)轉(zhuǎn)換成調(diào)用模塊
所需的信息兩部分組成。第6章軟件總體設(shè)計因此,每個輸入模塊可以設(shè)計成兩個下屬模塊:一個接收,一個轉(zhuǎn)換,用類似的方法一直分解到物理輸入端。如圖6.32中模塊“get
f3”和“get
f2”的分解。模塊“get
f1”為物理輸入模塊。(2)輸出模塊的下屬模塊的設(shè)計。輸出模塊的功能是將它的調(diào)用模塊產(chǎn)生的結(jié)果送出,它由將數(shù)據(jù)轉(zhuǎn)換成下屬模塊所需的形式和發(fā)送數(shù)據(jù)兩部分組成。這樣每個輸出模塊可以設(shè)計成兩個下屬模塊:一個轉(zhuǎn)換,一個發(fā)送,一直到物理輸出端。如圖6.32中,模塊“put
f7”、
“put
f8”和“put
f10”的分解。模塊“put
f9”和“put
f11”為物理輸出模塊。第6章軟件總體設(shè)計(3)變換模塊的下屬模塊的設(shè)計。設(shè)計完輸入、輸出后,就要為變換模塊設(shè)計其下屬模塊。要根據(jù)數(shù)據(jù)流圖中變換中心的組成情況,研究數(shù)據(jù)流圖的變換情況,并按照模塊獨立性的原則來組織其結(jié)構(gòu)。一般對數(shù)據(jù)流圖中每個基本加工都建立一個功能模塊,如圖6.32中模塊“C”、“D”和“E”。第6章軟件總體設(shè)計圖6.32變換分析設(shè)計舉例第6章軟件總體設(shè)計4)設(shè)計的優(yōu)化經(jīng)以上步驟設(shè)計出的軟件結(jié)構(gòu)僅僅是初始結(jié)構(gòu),還必須根據(jù)設(shè)計準則對初始結(jié)構(gòu)精細和改進,以下為提供的求精辦法:輸入部分的求精。在上述初步結(jié)構(gòu)中,對每個物理
輸入模塊輸入,以體現(xiàn)系統(tǒng)的外部接口。對結(jié)構(gòu)圖中的其他
輸入模塊并非真正輸入,當它與轉(zhuǎn)換數(shù)據(jù)的模塊都很簡單時,可將它們合并成一個模塊。當轉(zhuǎn)換模塊較復(fù)雜時,可以作為
單獨的接口模塊處理。輸出部分的求精。與輸入部分相似,為每個物理輸出設(shè)置專門模塊,同時注意把相同或類似的物理輸出模塊合并在一起,以減低耦合度。第6章軟件總體設(shè)計(3)變換部分的求精。根據(jù)設(shè)計準則,對模塊進行合并或調(diào)整??傊浖Y(jié)構(gòu)的求精帶有很大的經(jīng)驗性。往往數(shù)據(jù)流圖中的加工與SC中的模塊之間是一對一的映射關(guān)系,然后再修改。但對于一個實際問題,可能把數(shù)據(jù)流圖中的兩個甚至多個加工組成一個模塊,也可能把數(shù)據(jù)流圖中的一個加工擴展為兩個或更多個模塊,根據(jù)具體情況要靈活掌握設(shè)計方法,以求設(shè)計出由高內(nèi)聚和低耦合的模塊所組成的、具有良好特性的軟件結(jié)構(gòu)。第6章軟件總體設(shè)計6.6.4事務(wù)分析設(shè)計事務(wù)流的設(shè)計是從事務(wù)數(shù)據(jù)流圖到程序結(jié)構(gòu)的變換。對于具有事務(wù)型特征的數(shù)據(jù)流圖,則采用事務(wù)分析的設(shè)計方法。設(shè)計的方法也是自頂向下,逐步細化。先設(shè)計主模塊,再為
每一種類型的事務(wù)設(shè)計事務(wù)處理模塊,然后為每個處理設(shè)計
其下屬的事務(wù)處理細節(jié)。事務(wù)處理模塊可以被調(diào)用它的模塊公用,與變換處理不同的是,其事務(wù)中心容易確定?,F(xiàn)在,結(jié)合圖6.33說明該方法的設(shè)計過程。第6章軟件總體設(shè)計圖6.33事務(wù)分析設(shè)計舉例第6章軟件總體設(shè)計確定數(shù)據(jù)流圖中的事務(wù)中心和加工路徑。當數(shù)據(jù)流圖中的某個加工具有明顯地將一個輸入數(shù)據(jù)流分解成多個發(fā)散的輸出數(shù)據(jù)流時,該加工就是事務(wù)中心。從事務(wù)中心輻射出去的數(shù)據(jù)流為各個加工路徑。設(shè)計軟件結(jié)構(gòu)的頂層和第一層。事務(wù)處理中心和事務(wù)處理路徑確定后,就可以確定它們的軟件結(jié)構(gòu)。其結(jié)構(gòu)一般為一個接收分支和一個發(fā)送分支。從事務(wù)處理中心的邊界開始向前移動,一個個地將變換轉(zhuǎn)換為模塊。發(fā)送分支也有一個模塊,它管理所有的下屬處理模塊。每一個事務(wù)處理的路徑設(shè)計為相應(yīng)的結(jié)構(gòu),最后將其轉(zhuǎn)換成一個頂層模塊。該模塊是一個主模塊,有兩個功能,一是接收數(shù)據(jù),二是根據(jù)事務(wù)類型調(diào)度相應(yīng)的處理模塊。事務(wù)型軟件結(jié)構(gòu)應(yīng)包括接收第6章軟件總體設(shè)計分支和發(fā)送分支兩個部分。接收分支:負責(zé)接收數(shù)據(jù),它的設(shè)計與變換型數(shù)據(jù)流圖的輸入部分的設(shè)計方法相同。發(fā)送分支:通常包含一個調(diào)度模塊,它控制管理所有的下層事務(wù)處理模塊。當事務(wù)類型不多時,調(diào)度模塊可與主模塊合并。(3)進行事務(wù)結(jié)構(gòu)中、下層模塊的設(shè)計、優(yōu)化等工作。第6章軟件總體設(shè)計6.6.5混合流設(shè)計1.混合數(shù)據(jù)流圖的映射一般中型以上的系統(tǒng)的數(shù)據(jù)流圖中都會既有變換流,又有事務(wù)流,這就是所謂的混合數(shù)據(jù)流圖,其軟件結(jié)構(gòu)設(shè)計方法一般采用以變換流為主,事務(wù)流為輔的方法。具體步驟如下:(1)確定數(shù)據(jù)流圖整體上的類型。事務(wù)型通常用于對高層數(shù)據(jù)流圖的變換,其優(yōu)點是可以把一個大而復(fù)雜的系統(tǒng)分解成若干較小的簡單的子系統(tǒng)。變換型通常用于對較低層數(shù)據(jù)流圖的轉(zhuǎn)換。變換型具有順序處理的特點,而事務(wù)型具有平行處理的特點,所以由這兩種類型的數(shù)據(jù)流圖導(dǎo)出的軟件結(jié)構(gòu)有所不同。只要從數(shù)據(jù)流圖整體的、主要的功能處理分析其特點,就可區(qū)分出該數(shù)據(jù)流圖的整體類型。第6章軟件總體設(shè)計(2)標出局部的數(shù)據(jù)流圖范圍,確定其類型。(3)按整體和局部的數(shù)據(jù)流圖特征,設(shè)計出軟件結(jié)構(gòu)。
2.分層數(shù)據(jù)流圖的映射前面在進行系統(tǒng)分析時曾經(jīng)講過分層數(shù)據(jù)流圖的方法。對于一個復(fù)雜問題的數(shù)據(jù)流圖結(jié)果,往往是分層的。同理,對于分層的數(shù)據(jù)流圖映射成軟件結(jié)構(gòu)圖也應(yīng)該是分層的。這樣既便于設(shè)計,也便于修改。由于數(shù)據(jù)流圖的頂層圖反映的是系統(tǒng)與外部環(huán)境的界面,所以系統(tǒng)的物理輸入與物理輸出都在交換中心的頂層。相應(yīng)的軟件結(jié)構(gòu)圖的物理輸入與輸出部分應(yīng)放在主圖中,便于同數(shù)據(jù)流圖的頂層圖對照檢查。分層數(shù)據(jù)流圖的映射方法是:(1)主圖是變換型,子圖是事務(wù)型,如圖6.34所示。第6章軟件總體設(shè)計圖6.34主圖是變換型,子圖是事務(wù)型第6章軟件總體設(shè)計(2)主圖是事務(wù)型,子圖是變換型,如圖6.35所示。圖6.35主圖是事務(wù)型,子圖是變換型第6章軟件總體設(shè)計6.6.6結(jié)構(gòu)化設(shè)計方法應(yīng)用示例將銷售管理系統(tǒng)的數(shù)據(jù)流圖轉(zhuǎn)換為軟件結(jié)構(gòu)圖。分析該系統(tǒng)的0層圖,它有4個主要功能,即訂貨處理、進貨處理、缺貨處理和銷售處理。其中,訂貨處理包括訂單處理和備貨處理兩部分。這4個處理可平行工作,因此從整體上分析可按事務(wù)型數(shù)據(jù)流圖來設(shè)計,根據(jù)功能鍵來選擇4個處理中的一個。設(shè)計出的軟件結(jié)構(gòu)如圖6.36所示。第6章軟件總體設(shè)計圖6.36銷售管理系統(tǒng)軟件結(jié)構(gòu)圖第6章軟件總體設(shè)計銷售管理系統(tǒng)的軟件結(jié)構(gòu)子圖1(訂貨處理),如圖6.37所示。圖6.37子圖l第6章軟件總體設(shè)計銷售管理系統(tǒng)的軟件結(jié)構(gòu)子圖2(進貨處理),如圖6.38所示。圖6.38子圖2第6章軟件總體設(shè)計銷售管理系統(tǒng)的軟件結(jié)構(gòu)子圖3(缺貨處理),如圖6.39所示。圖6.39子圖3第6章軟件總體設(shè)計銷售管理系統(tǒng)的軟件結(jié)構(gòu)子圖4(銷售處理),如圖6.40所示。圖6.40子圖4第6章軟件總體設(shè)計6.6.7設(shè)計的后期處理由設(shè)計的工作流程可知,經(jīng)過變換分析或事務(wù)分析設(shè)計后形成軟件結(jié)構(gòu),對于這個結(jié)構(gòu)除了設(shè)計文檔作為系統(tǒng)設(shè)計
的補充外,還要對結(jié)構(gòu)進行優(yōu)化和改進。因此要做以下工作:為每個模塊提供一份接口說明。此說明包括通過參數(shù)表傳遞的數(shù)據(jù)、外部的輸入/輸出和訪問全局數(shù)據(jù)區(qū)的信息等,并指出它的下屬模塊與上屬模塊。為清晰易讀,對以上說明可用設(shè)計階段常采用的圖形工具——IPO圖來表示。為每個模塊寫一份處理說明。從設(shè)計的角度描述模
塊的主要處理任務(wù)、條件抉擇等,以需求分析階段產(chǎn)生的加
工邏輯的描述為參考。這里的說明應(yīng)該是清晰、無二義性的。第6章軟件總體設(shè)計給出設(shè)計約束或限制,如數(shù)據(jù)類型和格式的限制、內(nèi)存容量的限制、時間的限制、數(shù)據(jù)的邊界值、個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 8897.6-2024原電池第6部分:環(huán)境指南
- PTX-PEG-Cy3-生命科學(xué)試劑-MCE-5984
- Methyl-lucidenate-L-生命科學(xué)試劑-MCE-3864
- 19-R-Hydroxy-prostaglandin-F1α-生命科學(xué)試劑-MCE-5137
- 5-Fluoro-PB-22-5-hydroxyquinoline-isomer-生命科學(xué)試劑-MCE-6038
- 2-Chloromethyl-3-2-methylphenyl-quinazolin-4-3H-one-生命科學(xué)試劑-MCE-5287
- 二零二五年度汽車指標租賃與綠色出行獎勵計劃合同
- 二零二五年度特色門面租賃合同范本
- 2025年度住宅小區(qū)車位租賃及物業(yè)管理服務(wù)協(xié)議
- 2025年度試用期勞動合同范本-高科技研發(fā)團隊
- 教體局校車安全管理培訓(xùn)
- 湖北省十堰市城區(qū)2024-2025學(xué)年九年級上學(xué)期期末質(zhì)量檢測綜合物理試題(含答案)
- 導(dǎo)播理論知識培訓(xùn)班課件
- 空氣能安裝合同
- 電廠檢修安全培訓(xùn)課件
- 四大名繡課件-高一上學(xué)期中華傳統(tǒng)文化主題班會
- 起重機械生產(chǎn)單位題庫質(zhì)量安全員
- 高中生物選擇性必修1試題
- 電氣工程及其自動化專業(yè)《畢業(yè)設(shè)計(論文)及答辯》教學(xué)大綱
- 《客艙安全管理與應(yīng)急處置》課件-第14講 應(yīng)急撤離
- 危險化學(xué)品押運員培訓(xùn)
評論
0/150
提交評論