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