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