軟件工程:實(shí)踐者的研究方法第14章設(shè)計(jì)方法

字號(hào):

第14章 設(shè)計(jì)方法
    設(shè)計(jì)通常被描述為一個(gè)多步的過(guò)程,其主要任務(wù)是從信息需求中綜合出數(shù)據(jù)結(jié)構(gòu)的表示、程序結(jié)構(gòu)、接口特征和過(guò)程細(xì)節(jié)。Freeman在[FRE80]中對(duì)設(shè)計(jì)有較為詳細(xì)的描述:
    設(shè)計(jì)是一項(xiàng)主要考慮進(jìn)行重要決策的活動(dòng),這些決策通常都與結(jié)構(gòu)有關(guān)。設(shè)計(jì)與編程都要考慮抽象信息表示,但其詳細(xì)程度與編程有很大的不同。設(shè)計(jì)的結(jié)果是一個(gè)一致的、合理計(jì)劃的程序表示,主要描述高層各部分的相互關(guān)系和低層所需的邏輯操作…
    在前一章我們已經(jīng)指出,設(shè)計(jì)是由信息驅(qū)動(dòng)的。各種軟件設(shè)計(jì)方法主要考慮分析模型中的三個(gè)域,因此數(shù)據(jù)、功能和行為三個(gè)域是整個(gè)設(shè)計(jì)創(chuàng)建活動(dòng)的指南。
    本章將討論多種用于創(chuàng)建設(shè)計(jì)模型(見(jiàn)圖13-1)的各個(gè)層次的方法,本章的目標(biāo)是提供一個(gè)系統(tǒng)地完成設(shè)計(jì)的方法,設(shè)計(jì)的結(jié)果就是構(gòu)造軟件的藍(lán)圖。
    14.1 數(shù)據(jù)設(shè)計(jì)
    數(shù)據(jù)設(shè)計(jì)是實(shí)施軟件工程中的四個(gè)設(shè)計(jì)活動(dòng)的第一個(gè)(有人也認(rèn)為是最重要的一個(gè))。由于數(shù)據(jù)結(jié)構(gòu)對(duì)程序結(jié)構(gòu)和過(guò)程復(fù)雜性都有影響,數(shù)據(jù)結(jié)構(gòu)對(duì)軟件質(zhì)量的影響是很深遠(yuǎn)的。信息隱蔽和抽象數(shù)據(jù)的概念為數(shù)據(jù)設(shè)計(jì)提供了基礎(chǔ)。
    Wasserman在參考文獻(xiàn)[WAS80]中總結(jié)了數(shù)據(jù)設(shè)計(jì)的過(guò)程:
    數(shù)據(jù)設(shè)計(jì)的主要活動(dòng)是選擇對(duì)需求定義和規(guī)約過(guò)程中找出來(lái)的數(shù)據(jù)對(duì)象(數(shù)據(jù)結(jié)構(gòu))的邏輯表示。選擇過(guò)程可以包括對(duì)候選結(jié)構(gòu)進(jìn)行算法分析,以決定出效率的結(jié)構(gòu);選擇過(guò)程也可以只使用一組模塊(一個(gè)包),在對(duì)象的某種表示上提供需要的操作。
    設(shè)計(jì)中的另一個(gè)相關(guān)的活動(dòng)是標(biāo)識(shí)要直接作用于邏輯數(shù)據(jù)結(jié)構(gòu)的程序模塊,這樣,各個(gè)數(shù)據(jù)設(shè)計(jì)決策的影響域就受到了約束。
    無(wú)論采用哪種設(shè)計(jì)技術(shù),好的數(shù)據(jù)設(shè)計(jì)將改善程序結(jié)構(gòu)和模塊劃分,降低過(guò)程復(fù)雜性。
    Wasserman[WAS80]提出了一組用于數(shù)據(jù)規(guī)約和設(shè)計(jì)的原則。在實(shí)際應(yīng)用中,數(shù)據(jù)設(shè)計(jì)在創(chuàng)建分析模型(見(jiàn)第12章)就已經(jīng)開(kāi)始了,考慮到需求分析和設(shè)計(jì)經(jīng)常要重疊,我們主要考慮以下一組數(shù)據(jù)規(guī)約原則[WAS80]:
    1.用于功能和行為的系統(tǒng)分析原則也應(yīng)用于數(shù)據(jù)。我們通常要在導(dǎo)出、復(fù)審和刻畫(huà)功能需求和初步設(shè)計(jì)上花很多時(shí)間和工作量;數(shù)據(jù)對(duì)象及其關(guān)系、數(shù)據(jù)流和內(nèi)容的表示也應(yīng)該按步驟進(jìn)行開(kāi)發(fā)和復(fù)審,其他可選的數(shù)據(jù)組織結(jié)構(gòu)也應(yīng)加以考慮,數(shù)據(jù)模型對(duì)于軟件設(shè)計(jì)的影響也應(yīng)得到正確的評(píng)估,例如,一個(gè)多環(huán)鏈表可能可以很好地滿足數(shù)據(jù)需求,但它也可能導(dǎo)致過(guò)于復(fù)雜的軟件設(shè)計(jì),而其他替代的數(shù)據(jù)組織結(jié)構(gòu)可能會(huì)得到更好的結(jié)果。
    2.應(yīng)該標(biāo)識(shí)所有的數(shù)據(jù)結(jié)構(gòu)以及其上的操作。設(shè)計(jì)一個(gè)高效的數(shù)據(jù)結(jié)構(gòu)必須考慮其上的操作(見(jiàn)參考文獻(xiàn)[AHO83]),例如,考慮一個(gè)由不同數(shù)據(jù)元素組成的數(shù)據(jù)結(jié)構(gòu),在許多重要的軟件功能中都要操作這個(gè)數(shù)據(jù)結(jié)構(gòu)。通過(guò)評(píng)估該數(shù)據(jù)結(jié)構(gòu)上的操作,可定義一個(gè)抽象數(shù)據(jù)類型,以便在以后的軟件設(shè)計(jì)中使用。抽象數(shù)據(jù)類型的規(guī)約將大大簡(jiǎn)化軟件設(shè)計(jì)。
    3.應(yīng)當(dāng)建立數(shù)據(jù)字典,并用于數(shù)據(jù)設(shè)計(jì)和程序設(shè)計(jì)。數(shù)據(jù)字典的概念在第12章中已經(jīng)介紹,數(shù)據(jù)字典明確表示了數(shù)據(jù)對(duì)象間的關(guān)系以及對(duì)數(shù)據(jù)結(jié)構(gòu)中的元素的約束。如果有一個(gè)類似字典的數(shù)據(jù)規(guī)約存在,那些必須利用某些特定關(guān)系的優(yōu)秀算法的定義將得到簡(jiǎn)化。
    4.低層的設(shè)計(jì)決策應(yīng)該推遲到設(shè)計(jì)過(guò)程的后期。數(shù)據(jù)設(shè)計(jì)可以采用逐步求精的過(guò)程,也就是說(shuō),總體的數(shù)據(jù)組織可以在需求分析階段定義,在概要設(shè)計(jì)中進(jìn)行精化,并在以后的設(shè)計(jì)迭代中進(jìn)行詳細(xì)描述。在數(shù)據(jù)設(shè)計(jì)中應(yīng)用自頂向下方法的優(yōu)點(diǎn)與在軟件設(shè)計(jì)中應(yīng)用自頂向下方法的優(yōu)點(diǎn)類似:主要的結(jié)構(gòu)屬性要首先進(jìn)行設(shè)計(jì)和評(píng)估,以便建立數(shù)據(jù)的體系結(jié)構(gòu)。
    5.只有那些需要直接使用數(shù)據(jù)結(jié)構(gòu)內(nèi)部數(shù)據(jù)的模塊才能看到該數(shù)據(jù)結(jié)構(gòu)的表示。信息隱蔽的概念以及相關(guān)的耦合概念為軟件設(shè)計(jì)質(zhì)量的評(píng)估提供了依據(jù)。本原則不但強(qiáng)調(diào)了這兩個(gè)概念的重要性,還強(qiáng)調(diào)了“將數(shù)據(jù)對(duì)象的邏輯視圖和物理視圖分開(kāi)的重要性”[WAS80]。
    6.應(yīng)該開(kāi)發(fā)一個(gè)由有用的數(shù)據(jù)結(jié)構(gòu)和應(yīng)用于其上的操作組成的庫(kù)。數(shù)據(jù)結(jié)構(gòu)和操作都應(yīng)被看作可用于軟件設(shè)計(jì)的資源,數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)可以考慮到復(fù)用。數(shù)據(jù)結(jié)構(gòu)模板(抽象數(shù)據(jù)類型)庫(kù)可以減少數(shù)據(jù)規(guī)約和設(shè)計(jì)的工作量。
    7.軟件設(shè)計(jì)和程序設(shè)計(jì)語(yǔ)言應(yīng)該支持抽象數(shù)據(jù)類型的規(guī)約和實(shí)現(xiàn)。如果沒(méi)有辦法對(duì)已有的數(shù)據(jù)結(jié)構(gòu)直接進(jìn)行規(guī)約,復(fù)雜數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)(以及對(duì)應(yīng)的設(shè)計(jì))將變得非常困難。例如,如果目標(biāo)語(yǔ)言是Fortran的話,實(shí)現(xiàn)(或設(shè)計(jì))一個(gè)鏈表或多層異構(gòu)數(shù)組將是非常困難的,因?yàn)镕ortran不支持直接對(duì)這些數(shù)據(jù)結(jié)構(gòu)進(jìn)行規(guī)約。
    以上這些原則為數(shù)據(jù)設(shè)計(jì)提供了基礎(chǔ),它們既可以應(yīng)用在軟件工程的定義階段,也可以應(yīng)用在開(kāi)發(fā)階段。在本書(shū)的其他部分我們已經(jīng)指出,清晰的信息定義是軟件開(kāi)發(fā)成功的關(guān)鍵。
    14.2 體系結(jié)構(gòu)設(shè)計(jì)
    體系結(jié)構(gòu)設(shè)計(jì)的主要目標(biāo)是開(kāi)發(fā)一個(gè)模塊化的程序結(jié)構(gòu),并表示出模塊間的控制關(guān)系。此外,體系結(jié)構(gòu)設(shè)計(jì)將程序結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)相結(jié)合,為數(shù)據(jù)在程序中的流動(dòng)定義了接口。
    為了理解體系結(jié)構(gòu)設(shè)計(jì)的重要性,這里給出一個(gè)日常生活的小例子:
    你存了一筆錢(qián),買(mǎi)了一塊土地,準(zhǔn)備蓋一幢自己夢(mèng)想中的房子。由于沒(méi)有這方面的經(jīng)驗(yàn),你拜訪了一位建筑師,向建筑師解釋了自己的要求:房間的大小和數(shù)目、流行的式樣、溫泉、教堂式的屋頂、大量的玻璃窗等等。建筑師仔細(xì)的聽(tīng)了,問(wèn)了幾個(gè)問(wèn)題,然后表示需要花幾個(gè)星期進(jìn)行設(shè)計(jì)。