2011年軟件水平考試軟件設(shè)計(jì)師輔導(dǎo)資料(6)
第4章 軟件概要設(shè)計(jì)
學(xué)習(xí)本章,我們要考慮以下幾個(gè)問題:
軟件概要設(shè)計(jì)指的是什么?
軟件概要設(shè)計(jì)要做的事情是什么?
用什么來評(píng)價(jià)軟件設(shè)計(jì)的技術(shù)質(zhì)量?
軟件結(jié)構(gòu)優(yōu)化的準(zhǔn)則是什么?
如何進(jìn)行軟件概要設(shè)計(jì)?
以上問題就是本章所要討論的內(nèi)容。
一、軟件概要設(shè)計(jì)指的是什么?
我們知道,軟件設(shè)計(jì)是把一個(gè)軟件需求轉(zhuǎn)換為軟件表示的過程,而概要設(shè)計(jì)(又稱結(jié)構(gòu)設(shè)計(jì))就是軟件設(shè)計(jì)最初形成的一個(gè)表示(這里的表示是一個(gè)名詞),它描述了軟件的總的體系結(jié)構(gòu)。簡(jiǎn)單地說軟件概要設(shè)計(jì)就是設(shè)計(jì)出軟件的總體結(jié)構(gòu)框架。而后對(duì)結(jié)構(gòu)的進(jìn)一步細(xì)化的設(shè)計(jì)就是軟件的詳細(xì)設(shè)計(jì)或過程設(shè)計(jì)。本章所學(xué)內(nèi)容主要就是軟件的概要設(shè)計(jì)內(nèi)容。
二、軟件概要設(shè)計(jì)的基本任務(wù)
軟件概要設(shè)計(jì)階段要做的事情是什么呢? 總的來看有四個(gè)方面:它們是
1、設(shè)計(jì)軟件系統(tǒng)結(jié)構(gòu)(軟件結(jié)構(gòu))
2、數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)設(shè)計(jì)
3、編寫概要設(shè)計(jì)文檔
4、評(píng)審
在需求分析階段,已經(jīng)把系統(tǒng)分解成層次結(jié)構(gòu),而在概要設(shè)計(jì)階段,需要進(jìn)一步分解,劃分為模塊以及模塊的層次結(jié)構(gòu)。劃分的具體過程是:
(1)采用某種設(shè)計(jì)方法,將一個(gè)復(fù)雜的系統(tǒng)按功能劃分成模塊。
(2)確定每個(gè)模塊的功能。
(3)確定模塊之間的調(diào)用關(guān)系。
(4)確定模塊之間的接口,即模塊之間傳遞的信息。
(5)評(píng)價(jià)模塊結(jié)構(gòu)的質(zhì)量。
對(duì)于大型數(shù)據(jù)處理的軟件系統(tǒng),還要對(duì)數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì)。
在概要設(shè)計(jì)階段,還要編寫概要設(shè)計(jì)文檔,我們初學(xué)者有一個(gè)不是很好的做法,就是在編程序時(shí),往往不注意文檔的編寫,導(dǎo)致以后軟件修改和升級(jí)很不方便,用戶使用時(shí)也得不到幫助。所以應(yīng)該在軟件設(shè)計(jì)的每個(gè)階段編寫相應(yīng)文檔,在概要設(shè)計(jì)階段,主要有以下文檔需要編寫:
(1)概要設(shè)計(jì)說明書。
(2)數(shù)據(jù)庫(kù)設(shè)計(jì)說明書。
(3)用戶手冊(cè),
(4)修訂測(cè)試計(jì)劃。
最后一個(gè)任務(wù)就是評(píng)審,在概要設(shè)計(jì)中,對(duì)設(shè)計(jì)部分是否完整地實(shí)現(xiàn)了需求中規(guī)定的功能、性能等要求,設(shè)計(jì)方案的可行性,關(guān)鍵的處理及內(nèi)外部接口定義正確性、有效性,各部分之間的一致性等都要進(jìn)行評(píng)審,以免在以后的設(shè)計(jì)中發(fā)現(xiàn)大的問題而返工。
以上就是軟件概要設(shè)計(jì)的四個(gè)基本任務(wù),總結(jié)一下用八個(gè)字表示:兩類結(jié)構(gòu)文檔評(píng)審。(兩類結(jié)構(gòu)就是指軟件結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)設(shè)計(jì))
在了解了軟件概要設(shè)計(jì)的基本任務(wù)之后,我們來看看軟件設(shè)計(jì)的基本原理,也就是用于衡量軟件設(shè)計(jì)的技術(shù)質(zhì)量的一些標(biāo)準(zhǔn)。
三、軟件設(shè)計(jì)的基本原理
1、模塊化
模塊就是指在程序中的數(shù)據(jù)說明、可執(zhí)行語(yǔ)句等程序?qū)ο蟮募?或者是單獨(dú)命名和編址的元素。如高級(jí)語(yǔ)言中的過程,函數(shù)、子程序等。每個(gè)模塊可以完成一個(gè)特定的子功能,各個(gè)模塊可以按一定方法組裝起來成為一個(gè)整體。從而實(shí)現(xiàn)整個(gè)系統(tǒng)的功能。
模塊化就是指解決一個(gè)復(fù)雜問題時(shí)自頂向下逐層把軟件系統(tǒng)劃分成若干模塊的過程。
為了解決復(fù)雜的問題,在軟件設(shè)計(jì)中就必須把整個(gè)問題進(jìn)行分解來降低復(fù)雜性,這樣就可以減少開發(fā)工作量并降低開發(fā)成本和提高軟件生產(chǎn)率。但是劃分模塊并不是越多越好,因?yàn)檫@會(huì)增加模塊之間接口的工作量。所以劃分模塊的層次和數(shù)量應(yīng)該避免過多或過少。
2、抽象
抽象這個(gè)詞本身也比較抽象,(老師要小明用抽象和具體造一個(gè)句子,可是他不懂,就問媽媽,什么是抽象,什么是具體? 媽媽告訴他:抽象就是看不見摸不著的,具體就是看得見摸得著的。小明懂了,很快造好了一個(gè)句子,是這樣的:今天我很早起床,看見具體的媽媽在炒具體的菜,我打開窗戶,抽象的新鮮空氣呼地一下跑進(jìn)來,真舒服啊。)呵呵,事實(shí)上,抽象并不是這么簡(jiǎn)單的意思,它是一種思維工具,就是把事物本質(zhì)的共同特性抽出來而不考慮其他細(xì)節(jié),比如說我們可以把把男人女人老人小孩的共同本質(zhì)特性抽出來之后形成一個(gè)概念"人",這個(gè)概念就是抽象的結(jié)果。在軟件工程中就是這樣,在每個(gè)階段中,抽象的層次逐步降低,在軟件結(jié)構(gòu)設(shè)計(jì)中的模塊分層也是由抽象到具體的分析和構(gòu)造出來的。比如上一層的模塊所進(jìn)行的加工是一個(gè)抽象的操作"銷售統(tǒng)計(jì)",分解到最后一層,就可能是具體"打印報(bào)表"的操作了。
3、信息隱蔽
信息隱蔽的意思就是指,在設(shè)計(jì)和確定模塊時(shí),使得一個(gè)模塊內(nèi)包含的信息(過程或數(shù)據(jù)),對(duì)于不需要這些信息的其他模塊來說是不能訪問的。舉個(gè)例子吧,假設(shè)我是程序中的一個(gè)模塊,電話機(jī)是另一個(gè)模塊,我在使用電話機(jī)時(shí),對(duì)電話機(jī)的控制是通過幾個(gè)按鍵來確定的,輸入的數(shù)據(jù)是我的語(yǔ)音,輸出的數(shù)據(jù)是對(duì)方的語(yǔ)音,而這些輸入、輸出的數(shù)據(jù)變換以及控制在電話機(jī)內(nèi)部是怎么實(shí)現(xiàn)的我不需要知道,同時(shí)也不能加以直接控制,這樣,如果電話機(jī)壞了,修復(fù)或更換后對(duì)我的使用是沒有任何影響的。所以說,電話機(jī)這個(gè)模塊的信息隱蔽是十分完善的。在軟件設(shè)計(jì)中,模塊的劃分也要采取措施使它實(shí)現(xiàn)信息隱蔽。
4、模塊獨(dú)立性
模塊獨(dú)立性是指每個(gè)模塊只完成系統(tǒng)要求的獨(dú)立的子功能,并且與其他模塊的聯(lián)系最少且接口簡(jiǎn)單。這個(gè)概念就是上面說的三個(gè)基本原理的直接產(chǎn)物,在概要設(shè)計(jì)過程中,就是要求設(shè)計(jì)出具有良好模塊獨(dú)立性的軟件結(jié)構(gòu)。
那么如何來衡量軟件的模塊獨(dú)立性呢?這里有兩個(gè)定性的度量標(biāo)準(zhǔn)。
(1)耦合性:就是指模塊之間的聯(lián)系緊密程度。模塊之間聯(lián)系越緊密,其耦合性越強(qiáng),獨(dú)立性就越差。
模塊的耦合性從低到高可分為以下幾種類型:(假設(shè)某人為一模塊)
無直接耦合 (比如陌生人之間的聯(lián)系)
數(shù)據(jù)耦合 (比如去售貨員與顧客之間的聯(lián)系)
標(biāo)記耦合 (比如兩個(gè)人下棋)
控制耦合 (領(lǐng)導(dǎo)和下屬之間的聯(lián)系)
公共耦合 (比如圖書館的所有借書者之間的聯(lián)系)
內(nèi)容耦合 (比如小兩口之間的聯(lián)系)
在軟件設(shè)計(jì)中,提高模塊的獨(dú)立性,建立模塊間盡可能松散的系統(tǒng),是模塊化設(shè)計(jì)的目標(biāo)。為了降低模塊間的耦合度,可以采取以下措施:
(1)在耦合方式上降低模塊間接口的復(fù)雜性。
(2)在傳遞信息類型上盡量采用數(shù)據(jù)耦合,避免使用控制耦合,慎用或有控制地使用公共耦合。在實(shí)踐中要根據(jù)實(shí)際情況綜合考慮。
2、內(nèi)聚性
內(nèi)聚性是指模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度。根據(jù)內(nèi)聚性的從低到高可分為以下六種類型:
偶然內(nèi)聚:指一個(gè)模塊內(nèi)的各處理元素之間沒有任何聯(lián)系。(公共汽車內(nèi)的人群)
邏輯內(nèi)聚:指模塊內(nèi)執(zhí)行幾個(gè)邏輯上相似的功能,通過參數(shù)確定該模塊完成哪一個(gè)功能。(警察局里的警察)
時(shí)間內(nèi)聚:把需要同時(shí)執(zhí)行的動(dòng)作組合在一起形成的模塊為時(shí)間內(nèi)聚模塊。(交響樂團(tuán)的演奏員)
通信內(nèi)聚:指模塊內(nèi)所有處理元素都在同一個(gè)數(shù)據(jù)結(jié)構(gòu)上的操作?;蛘咧父魈幚硎褂孟嗤妮斎霐?shù)據(jù)或者產(chǎn)生相同的輸出數(shù)據(jù)。(建筑工地上的工人)
順序內(nèi)聚:指一個(gè)模塊中各個(gè)處理元素都密切相關(guān)于同一功能且必須順序執(zhí)行,前一功能的元素的輸出就是下一功能元素的輸入。(我們可以想像紡織廠中從紡紗到織布的各個(gè)操作形成的一個(gè)模塊,就是一種順序內(nèi)聚)
功能內(nèi)聚:這是最強(qiáng)的內(nèi)聚,指模塊內(nèi)所有元素共同完成一個(gè)功能,缺一不可,模塊已不可再分。(就如兩個(gè)人演獅子舞,要完成獅子形象的再現(xiàn),兩個(gè)人缺一不可.)
耦合性與內(nèi)聚性是模塊獨(dú)立性的兩個(gè)定性標(biāo)準(zhǔn),將軟件系統(tǒng)劃分模塊時(shí),盡量做到高內(nèi)聚,低耦合,提高模塊的獨(dú)立性。在內(nèi)聚性與耦合性發(fā)生矛盾的時(shí)候,最好優(yōu)先考慮耦合性,也就是先保證耦合性低一些。
四、軟件結(jié)構(gòu)的優(yōu)化準(zhǔn)則
首先應(yīng)學(xué)會(huì)用圖形表示軟件結(jié)構(gòu),軟件結(jié)構(gòu)圖反映了整個(gè)系統(tǒng)的功能實(shí)現(xiàn),即將來編好程序中的控制層次體系。軟件結(jié)構(gòu)往往用樹狀或網(wǎng)狀結(jié)構(gòu)的圖形來表示。
請(qǐng)大家對(duì)照課本的解釋來看軟件結(jié)構(gòu)圖包括哪些內(nèi)容。
我們已經(jīng)知道了軟件概要設(shè)計(jì)的主要任務(wù)就是軟件結(jié)構(gòu)的設(shè)計(jì),為了提高設(shè)計(jì)的質(zhì)量,可以根據(jù)下面的設(shè)計(jì)優(yōu)化準(zhǔn)則進(jìn)行優(yōu)化:在這些準(zhǔn)則中,都是針對(duì)模塊及模塊間關(guān)系來提出的。
1、模塊的劃分:要做到高內(nèi)聚,低耦合,保持相對(duì)獨(dú)立性。
2、模塊的控制:模塊的作用范圍要在他的控制范圍內(nèi),判定所在的模塊應(yīng)與受其影響的模塊在層次上盡量靠近)
3、形成的結(jié)構(gòu);軟件結(jié)構(gòu)的深度、寬度、扇出、扇入要適當(dāng)
4、模塊的大小: 要適中。
5、模塊的接口:模塊的接口要簡(jiǎn)單、清晰、含義明確,便于理解、易于實(shí)現(xiàn)、測(cè)試與維護(hù))。
五、概要設(shè)計(jì)的設(shè)計(jì)方法。
(一)面向數(shù)據(jù)流的設(shè)計(jì)方法(這是需要我們熟練掌握的方法)
面向數(shù)據(jù)流的設(shè)計(jì)方法是以需求階段產(chǎn)生的數(shù)據(jù)流圖為基礎(chǔ),按一定的步驟映射成軟件結(jié)構(gòu),因此又稱為結(jié)構(gòu)化設(shè)計(jì)(Structured Design SD)。這是目前使用最廣泛的軟件設(shè)計(jì)方法之一,應(yīng)該熟練掌握它。
1、首先要研究數(shù)據(jù)流圖(DFD)的類型,無論何種軟件系統(tǒng),DFD一般都可分為變換型和事務(wù)型兩類。(課本第51頁(yè))
先來看變換型數(shù)據(jù)流圖,顧名思義,變換就是把輸入的數(shù)據(jù)處理后變成另外的數(shù)據(jù)輸出,所以變換型數(shù)據(jù)的工作過程就是三步:取得數(shù)據(jù)、變換數(shù)據(jù)和輸出數(shù)據(jù)。在圖4-6中,可以看到兩股數(shù)據(jù)流經(jīng)過交換中心變成一股數(shù)據(jù)流進(jìn)行輸出。虛線為標(biāo)出的流界。
再來看事務(wù)型數(shù)據(jù)流圖,所謂事務(wù)也是一個(gè)處理,但不是數(shù)據(jù)變換,而是將輸入數(shù)據(jù)流分離成許多發(fā)散的數(shù)據(jù)流,形成許多加工路徑,并根據(jù)值選擇其中一個(gè)路徑來執(zhí)行。舉個(gè)例子,好比有一個(gè)郵件分發(fā)中心,把收進(jìn)的郵件根據(jù)其發(fā)送地址進(jìn)行分流,有的用飛機(jī)郵送,有的用汽車來運(yùn)輸?shù)鹊取?/p>
在大型軟件系統(tǒng)中的DFD數(shù)據(jù)流圖中,這兩種類型特征都有可能存在。
2、SD方法設(shè)計(jì)過程
1)精化DFD。
2)確定DFD類型并進(jìn)行相應(yīng)的映射。
3)分解上層模塊,設(shè)計(jì)中下層模塊結(jié)構(gòu)
4)根據(jù)優(yōu)化準(zhǔn)則對(duì)軟件結(jié)構(gòu)求精。
5)描述模塊功能、接口及全局?jǐn)?shù)據(jù)結(jié)構(gòu)
6)復(fù)查,如果有錯(cuò)則轉(zhuǎn)向2)修改完善,否則進(jìn)入詳細(xì)設(shè)計(jì)。
下面我們通過例子來說明變換分析設(shè)計(jì)和事務(wù)分析設(shè)計(jì)方法。
3、變換分析設(shè)計(jì)
以課本53頁(yè)圖4-8為例說明變換分析設(shè)計(jì)。
根據(jù)面向數(shù)據(jù)流的設(shè)計(jì)方法,第一步是精化DFD,也就是研究分析這個(gè)數(shù)據(jù)流圖,我們可以看到圖中從A到H的數(shù)據(jù)流向和加工,圖形比較簡(jiǎn)單。
第二步是確定DFD類型并確定加工中心,在這里已經(jīng)說明為本圖為變換型,在實(shí)際分析中應(yīng)該根據(jù)每個(gè)相關(guān)操作來確定其類型。在圖中,我們可以直觀地看到中間幾股數(shù)據(jù)流的匯合處是系統(tǒng)的變換中心。也可以通過雙向?qū)ふ曳▉泶_定,左邊是物理輸入端,從f1沿著單向路徑一直到f3,后面的f4是從C流出的,同時(shí)C還有f5流出,則可見f4,f5不能再看作是系統(tǒng)的輸入,因此可確定f4,f5前一個(gè)數(shù)據(jù)流f3就是系統(tǒng)的邏輯輸入,同樣,我們從右邊的物理輸出端往左邊沿?cái)?shù)據(jù)流的反向?qū)ふ遥梢园l(fā)現(xiàn)f4,f6不能看作是整個(gè)系統(tǒng)的輸出,因此可以確定f7,f8是邏輯輸出端,然后在這兩個(gè)分界處添上虛線,這樣,DFD的三部份就確定了。
第三步 設(shè)計(jì)軟件結(jié)構(gòu)的頂層和第一層,根據(jù)變換中心可以對(duì)應(yīng)得到主模塊的位置,就可以畫出頂層模塊(即主模塊,在實(shí)際應(yīng)用中,這個(gè)模塊的名字就是系統(tǒng)的名字,如銷售管理系統(tǒng)等)。然后在這個(gè)模塊下方根據(jù)劃分好的三個(gè)部分畫出三個(gè)功能模塊,即輸入、變換和輸出模塊,就是圖中的get f3,將f3變換成f7和f8模塊,put f7及put f8模塊,注意,這里應(yīng)當(dāng)為每個(gè)輸入和輸出設(shè)計(jì)一個(gè)模塊。然后將這些模塊與頂層模塊用連線連上表示所屬控制。畫上相應(yīng)的數(shù)據(jù)傳送箭頭。
第四步 分解上層模塊,設(shè)計(jì)中下層模塊。 根據(jù)上面的方法,分解輸入模塊,圖中的get f3模塊的功能是向主模塊提供數(shù)據(jù),而在DFD中可以看到f3是數(shù)據(jù)流f2經(jīng)過B操作后流出的,因此這里有兩個(gè)部分,就是接收f2數(shù)據(jù),再通過B轉(zhuǎn)換流出。所以在get f3模塊下畫出兩個(gè)子模塊 get f2 和B操作模塊。
就這樣一一分解,可以畫出所有的輸入和輸出子模塊,直到物理輸入和輸出為止。
對(duì)于變換中心的下屬模塊,根據(jù)數(shù)據(jù)流和變換操作,以每個(gè)基本加工建立一個(gè)功能模塊,可以畫出CDE三個(gè)子模塊。
整個(gè)過程并不復(fù)雜,畫好后根據(jù)實(shí)際情況對(duì)軟件結(jié)構(gòu)進(jìn)行優(yōu)化,也就是進(jìn)行必要的合并或分解。以求設(shè)計(jì)出高內(nèi)聚低耦合的模塊組成的、具有良好特性的軟件結(jié)構(gòu)。
4、事務(wù)分析設(shè)計(jì),可以參見圖4-9為例。其設(shè)計(jì)方法大同小異,首先確定DFD類型,這里已指明是事務(wù)型,然后找出DFD中的事務(wù)中心和加式路徑。當(dāng)DFD中時(shí)不要弄錯(cuò),然后在分解子模塊時(shí)在調(diào)度模塊上加一個(gè)菱形符號(hào)表示判斷處理。
5、綜合型數(shù)據(jù)流圖與分層數(shù)據(jù)流圖映射成軟件結(jié)構(gòu)的設(shè)計(jì)
有了上面的基礎(chǔ),對(duì)綜合型的數(shù)據(jù)流圖也可以一一分開來進(jìn)行設(shè)計(jì)了。
6、設(shè)計(jì)后的處理,在軟件結(jié)構(gòu)形成之后,我們知道,概要設(shè)計(jì)的基本任務(wù)還有文檔的編寫,在這個(gè)階段就是要編寫一些文檔,包括:
(1)為每個(gè)模塊寫一份處理說明
(2)為每個(gè)模塊提供一份接口說明
(3)數(shù)據(jù)結(jié)構(gòu)說明
(4)給出設(shè)計(jì)約束或限制
(5)進(jìn)行概要評(píng)審
(6)設(shè)計(jì)優(yōu)化。
本節(jié)介紹的設(shè)計(jì)方法是本章的重點(diǎn),要求熟練掌握。
(二)基于IDEF0圖的設(shè)計(jì)方法
(三)表示軟件結(jié)構(gòu)圖的另一種圖形工具--HIPO圖。
HIPO圖清晰易讀,主要用于編寫概要設(shè)計(jì)文檔中的說明。
本章小結(jié):根據(jù)上面的學(xué)習(xí),我們可以知道,軟件概要設(shè)計(jì)的四個(gè)主要任務(wù),知道評(píng)價(jià)軟件結(jié)構(gòu)設(shè)計(jì)質(zhì)量的原理和兩個(gè)標(biāo)準(zhǔn)即軟件模塊的耦合性及內(nèi)聚性,根據(jù)這些原理提出了軟件結(jié)構(gòu)設(shè)計(jì)的優(yōu)化準(zhǔn)則,并且詳細(xì)學(xué)習(xí)了軟件結(jié)構(gòu)的面向數(shù)據(jù)流圖的設(shè)計(jì)方法。
【編輯推薦】