自考《軟件工程》第四章學(xué)習(xí)輔導(dǎo)

字號:

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