官术网_书友最值得收藏!

4.4 關(guān)于設(shè)計(jì)的概念

在軟件工程歷史上產(chǎn)生了一系列基本的軟件設(shè)計(jì)概念。盡管多年來對每一種概念的關(guān)注程度不斷變化,但它們都經(jīng)受住了時(shí)間的考驗(yàn)。基礎(chǔ)的軟件設(shè)計(jì)概念為“使程序正確”提供了必要的框架,每一種概念都為軟件設(shè)計(jì)者提供了應(yīng)用更加復(fù)雜設(shè)計(jì)方法的基礎(chǔ)。每一種方法都可以回答下面的問題。

●使用什么標(biāo)準(zhǔn)將軟件分割為獨(dú)立的構(gòu)件?

●功能和數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)如何從軟件的概念表示中分離出來?

●定義軟件設(shè)計(jì)技術(shù)質(zhì)量的統(tǒng)一標(biāo)準(zhǔn)是什么?

4.4.1 抽象

當(dāng)考慮某一問題的模塊化解決方案時(shí),可以給出許多抽象級。在最高抽象級上,使用問題所處環(huán)境的語言以概括性的術(shù)語描述解決方案。在較低的抽象級上,將提供更詳細(xì)的解決方案說明。當(dāng)力圖陳述一種解決方案時(shí),面向問題的術(shù)語和面向?qū)崿F(xiàn)的術(shù)語會同時(shí)使用。最后,在最低的抽象層次上,解決方案將以一種能直接實(shí)現(xiàn)的方式得到陳述。

當(dāng)開發(fā)不同層次的抽象時(shí),軟件設(shè)計(jì)師力圖創(chuàng)建過程抽象和數(shù)據(jù)抽象。過程抽象是指具有明確和有限功能的指令序列,其命名暗示了這些功能,但隱藏了具體的細(xì)節(jié)。過程抽象的例子如單詞“開門”,“開”隱含了一長串的過程性步驟(例如,走到門前,伸出手并抓住把手,轉(zhuǎn)動(dòng)把手并拉門,從門口走開等)。

數(shù)據(jù)抽象是描述數(shù)據(jù)對象的冠名數(shù)據(jù)集合。在過程抽象“開”的場景下可以定義一個(gè)名為door的數(shù)據(jù)抽象。同任何數(shù)據(jù)對象一樣,door的數(shù)據(jù)抽象將包含一組描述門的屬性(例如,門的類型、轉(zhuǎn)動(dòng)方向、開門方法、重量和尺寸)。因此,過程抽象“開”將利用數(shù)據(jù)抽象門的屬性中所包含的信息。

4.4.2 體系結(jié)構(gòu)

軟件體系結(jié)構(gòu)意指“軟件的整體結(jié)構(gòu)和這種結(jié)構(gòu)為系統(tǒng)提供概念完整性的方式”。從最簡單的形式來看,體系結(jié)構(gòu)是程序構(gòu)件(模塊)的結(jié)構(gòu)或組織、這些構(gòu)件交互的形式,以及這些構(gòu)件所用數(shù)據(jù)的結(jié)構(gòu)。然而在更廣泛的意義上,構(gòu)件可以概括為表示主要的系統(tǒng)元素及其交互。

軟件設(shè)計(jì)的目標(biāo)之一是導(dǎo)出系統(tǒng)的體系結(jié)構(gòu)示意圖,該示意圖作為一個(gè)框架來指導(dǎo)更詳細(xì)的設(shè)計(jì)活動(dòng)。一系列的體系結(jié)構(gòu)模式使軟件工程師能夠解決常見的設(shè)計(jì)問題。

下面這組屬性應(yīng)該被指定為體系結(jié)構(gòu)設(shè)計(jì)的一部分。

1)結(jié)構(gòu)特性。體系結(jié)構(gòu)設(shè)計(jì)表示定義了系統(tǒng)的構(gòu)件(如模塊、對象和過濾器)、構(gòu)件被封裝的方式,以及構(gòu)件之間相互作用的方式。例如,對象封裝了數(shù)據(jù)和過程,過程操縱數(shù)據(jù)并通過方法調(diào)用進(jìn)行交互。

2)外部功能特性。體系結(jié)構(gòu)設(shè)計(jì)描述應(yīng)當(dāng)指出設(shè)計(jì)體系結(jié)構(gòu)如何滿足需求。這些需求包括性能需求、能力需求、可靠性需求、安全性需求、可適應(yīng)性需求,以及其他系統(tǒng)特征需求。

3)相關(guān)系統(tǒng)族。體系結(jié)構(gòu)應(yīng)當(dāng)能抽取出在一類相似系統(tǒng)開發(fā)中經(jīng)常遇到的重復(fù)性模式。本質(zhì)上,設(shè)計(jì)應(yīng)當(dāng)能夠重用體系結(jié)構(gòu)構(gòu)件。

一旦給出了這些特性的規(guī)格說明,體系結(jié)構(gòu)設(shè)計(jì)就可以用一種或多種模型來表示。結(jié)構(gòu)模型將體系結(jié)構(gòu)表示為程序構(gòu)件的一個(gè)有組織的集合。通過確定類似應(yīng)用中遇到的可復(fù)用的體系結(jié)構(gòu)來設(shè)計(jì)框架,框架模型可以提高設(shè)計(jì)抽象級別。動(dòng)態(tài)模型強(qiáng)調(diào)程序體系結(jié)構(gòu)的行為方面,指明結(jié)構(gòu)或系統(tǒng)配置作為外部事件的函數(shù)將如何變化。過程模型注重系統(tǒng)必須提供的業(yè)務(wù)或技術(shù)流程設(shè)計(jì)。最后,功能模型可以用來表示系統(tǒng)的功能層次結(jié)構(gòu)。

4.4.3 模式

設(shè)計(jì)模式描述了在某個(gè)特定場景與可能影響模式應(yīng)用和使用方式的“影響力”中解決某個(gè)特定的設(shè)計(jì)問題的設(shè)計(jì)結(jié)構(gòu)。

每個(gè)設(shè)計(jì)模式的目的都是提供一個(gè)描述,以便設(shè)計(jì)人員能夠確定:①模式是否適用于當(dāng)前的工作;②模式是否能夠復(fù)用(因此,節(jié)約設(shè)計(jì)時(shí)間);③模式是否能夠用于指導(dǎo)開發(fā)一個(gè)類似的、但是功能或結(jié)構(gòu)不同的模式。

4.4.4 模塊化

模塊化是關(guān)注點(diǎn)分離最常見的表現(xiàn)。軟件被劃分為獨(dú)立命名的、可處理的構(gòu)件,有時(shí)被稱為模塊,把這些構(gòu)件集成到一起可以滿足問題的需求。

有人提出“模塊化是軟件的單一屬性,它使程序能被智能化地管理”。軟件工程師難以掌握單塊軟件(即由一個(gè)單獨(dú)模塊構(gòu)成的大程序)。對于單塊大型程序,其控制路徑的數(shù)量、引用的跨度、變量的數(shù)量和整體的復(fù)雜度使得理解這樣的軟件幾乎是不可能的。幾乎所有的情況下,為了理解起來更容易,都應(yīng)當(dāng)將設(shè)計(jì)劃分成許多模塊,這樣做的結(jié)果是,構(gòu)建軟件所需的成本將會隨之降低。應(yīng)該避免不足的模塊化或過度的模塊化問題。

模塊化設(shè)計(jì)(以及由其產(chǎn)生的程序)使開發(fā)工作更易于規(guī)劃;可以定義和交付軟件增量;更容易實(shí)施變更;能夠更有效地開展測試和調(diào)試;可以進(jìn)行長期維護(hù)而沒有嚴(yán)重的副作用。

4.4.5 信息隱蔽

信息隱蔽原則建議模塊應(yīng)該“具有的特征是:每個(gè)模塊對其他所有模塊都隱蔽自己的設(shè)計(jì)決策”。換句話說,模塊應(yīng)該規(guī)定并設(shè)計(jì)成為在模塊中包含的信息(算法和數(shù)據(jù))不被不需要這些信息的其他模塊訪問。

隱蔽意味著通過定義一系列獨(dú)立的模塊可以得到有效的模塊化,獨(dú)立模塊相互之間只交流實(shí)現(xiàn)軟件功能所必需的那些信息。抽象有助于定義構(gòu)成軟件的過程(或信息)實(shí)體。隱蔽定義并加強(qiáng)了對模塊內(nèi)過程細(xì)節(jié)的訪問約束和對模塊所使用的任何局部數(shù)據(jù)結(jié)構(gòu)的訪問約束。

將信息隱蔽作為模塊化系統(tǒng)的一個(gè)設(shè)計(jì)標(biāo)準(zhǔn),在測試和隨后的軟件維護(hù)過程中需要進(jìn)行修改時(shí),可提供最大的益處。由于大多數(shù)數(shù)據(jù)和過程對軟件的其他部分是隱蔽的,因此,在修改過程中不小心引入的錯(cuò)誤不會傳播到軟件的其他地方。

4.4.6 功能獨(dú)立

功能獨(dú)立的概念是關(guān)注點(diǎn)分離、模塊化、抽象和信息隱蔽概念的直接產(chǎn)物。通過開發(fā)具有“專一”功能和“避免”與其他模塊過多交互的模塊,可以實(shí)現(xiàn)功能獨(dú)立。換句話說,軟件設(shè)計(jì)時(shí)應(yīng)使每個(gè)模塊僅涉及需求的某個(gè)特定子集,并且當(dāng)從程序結(jié)構(gòu)的其他部分觀察時(shí),每個(gè)模塊只有一個(gè)簡單的接口。

具有有效模塊化(也就是獨(dú)立模塊)的軟件更容易開發(fā),這是因?yàn)楣δ鼙环指舳医涌诒缓喕紤]由一個(gè)團(tuán)隊(duì)進(jìn)行開發(fā)時(shí)的結(jié)果)。獨(dú)立模塊更容易維護(hù)(和測試),因?yàn)樾薷脑O(shè)計(jì)或修改代碼所引起的副作用被限制,減少了錯(cuò)誤擴(kuò)散,而且模塊復(fù)用也成為可能。概括地說,功能獨(dú)立是良好設(shè)計(jì)的關(guān)鍵,而設(shè)計(jì)又是軟件質(zhì)量的關(guān)鍵。

獨(dú)立性可以通過兩條定性的標(biāo)準(zhǔn)進(jìn)行評估:內(nèi)聚性和耦合性。

內(nèi)聚性顯示了某個(gè)模塊相關(guān)功能的強(qiáng)度,是信息隱蔽概念的自然擴(kuò)展。一個(gè)內(nèi)聚的模塊執(zhí)行一個(gè)獨(dú)立的任務(wù),與程序的其他部分構(gòu)件只需要很少的交互。簡單地說,一個(gè)內(nèi)聚的模塊應(yīng)該(理想情況下)只完成一件事情。即使人們總是爭取高內(nèi)聚性(即專一性),一個(gè)軟件構(gòu)件執(zhí)行多項(xiàng)功能也經(jīng)常是必要的和可取的。然而,為了實(shí)現(xiàn)良好的設(shè)計(jì),應(yīng)該避免“分裂型”構(gòu)件(執(zhí)行多個(gè)無關(guān)功能的構(gòu)件)。

耦合性顯示了模塊間的相互依賴性,它表明軟件結(jié)構(gòu)中多個(gè)模塊之間的相互連接性。耦合性依賴于模塊之間的接口復(fù)雜性、引用或進(jìn)入模塊所在的點(diǎn)及什么數(shù)據(jù)通過接口進(jìn)行傳遞。在軟件設(shè)計(jì)中,應(yīng)當(dāng)盡力得到最低可能的耦合。模塊間簡單的連接性使得軟件易于理解并減少“漣漪效果”的傾向。當(dāng)在某個(gè)地方發(fā)生錯(cuò)誤并傳播到整個(gè)系統(tǒng)時(shí),就會引起“漣漪效果”。

4.4.7 求精

逐步求精是一種自頂向下的設(shè)計(jì)策略。通過連續(xù)精化過程細(xì)節(jié)層次來實(shí)現(xiàn)程序的開發(fā),通過逐步分解功能的宏觀陳述(過程抽象)直至形成程序設(shè)計(jì)語言的語句來進(jìn)行層次開發(fā)。求精實(shí)際上是一個(gè)細(xì)化的過程。該過程從高抽象級上定義的功能陳述(或信息描述)開始,概念性地描述了功能或信息,但是沒有提供有關(guān)功能內(nèi)部的工作或信息內(nèi)部的結(jié)構(gòu)。可以在原始陳述上進(jìn)行細(xì)化,隨著每個(gè)精化(細(xì)化)的持續(xù)進(jìn)行,將提供越來越多的細(xì)節(jié)。

抽象和精化是互補(bǔ)的概念。抽象能夠明確說明內(nèi)部過程和數(shù)據(jù),但對“外部使用者”隱藏了低層細(xì)節(jié);精化有助于在設(shè)計(jì)過程中揭示低層細(xì)節(jié)。這兩個(gè)概念均有助于設(shè)計(jì)人員在設(shè)計(jì)演化中構(gòu)造出完整的設(shè)計(jì)模型。

4.4.8 方面

在開始進(jìn)行需求分析時(shí),一組“關(guān)注點(diǎn)”就出現(xiàn)了。這些關(guān)注點(diǎn)“包括需求、用例、特征、數(shù)據(jù)結(jié)構(gòu)、服務(wù)質(zhì)量問題、變量、知識產(chǎn)權(quán)邊界、合作、模式及合同”。理想情況下,可以按某種方式組織需求模型,該方式允許分離每個(gè)關(guān)注點(diǎn)(需求),使得能夠獨(dú)立考慮每個(gè)關(guān)注點(diǎn)(即需求)。然而實(shí)際上,某些關(guān)注點(diǎn)跨越了整個(gè)系統(tǒng),從而很難進(jìn)行分割。

當(dāng)開始進(jìn)行設(shè)計(jì)時(shí),需求被精化為模塊設(shè)計(jì)表示。考慮兩個(gè)需求:A和B。“如果已經(jīng)選擇了一種軟件分解(精化),在這種分解中,如果不考慮需求A的話,需求B就不能得到滿足”,那么需求A橫切需求B。

方面是一個(gè)橫切關(guān)注點(diǎn)的表示,因此標(biāo)識方面很重要,以便在開始求精和模塊化的時(shí)候,設(shè)計(jì)能夠很好地適應(yīng)這些方面。在理想情況下,一個(gè)方面作為一個(gè)獨(dú)立的模塊(構(gòu)件)進(jìn)行實(shí)施,而不是作為“分散的”或者和許多構(gòu)件“糾纏的”軟件片斷進(jìn)行實(shí)施。為了做到這一點(diǎn),設(shè)計(jì)體系結(jié)構(gòu)應(yīng)當(dāng)支持定義一個(gè)方面,該方面即一個(gè)模塊,該模塊能夠使該關(guān)注點(diǎn)經(jīng)過它橫切的所有其他關(guān)注點(diǎn)而得到實(shí)施。

4.4.9 重構(gòu)

很多敏捷方法都建議一種重要的設(shè)計(jì)活動(dòng)——重構(gòu),即一種重新組織的技術(shù),可以簡化構(gòu)件的設(shè)計(jì)(或代碼)而無須改變其功能或行為。“重構(gòu)是使用這樣一種方式改變軟件系統(tǒng)的過程:不改變代碼(設(shè)計(jì))的外部行為而是改進(jìn)其內(nèi)部結(jié)構(gòu)。”

當(dāng)重構(gòu)軟件時(shí),檢查現(xiàn)有設(shè)計(jì)的冗余性、沒有使用的設(shè)計(jì)元素、低效的或不必要的算法、拙劣的或不恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu),以及其他設(shè)計(jì)不足,修改這些不足以獲得更好的設(shè)計(jì)。例如,第一次設(shè)計(jì)迭代可能得到一個(gè)構(gòu)件,表現(xiàn)出很低的內(nèi)聚性(即,執(zhí)行3個(gè)功能但是相互之間僅有有限的聯(lián)系)。在仔細(xì)思考之后,設(shè)計(jì)人員可以決定將構(gòu)件重構(gòu)為3個(gè)獨(dú)立的構(gòu)件,每個(gè)構(gòu)件都表現(xiàn)出較高的內(nèi)聚性。其結(jié)果是軟件更容易集成、測試和維護(hù)。

4.4.10 設(shè)計(jì)類

面向?qū)ο螅╫bject-oriented,OO)范型已經(jīng)廣泛地應(yīng)用于現(xiàn)代軟件工程。面向?qū)ο蟮男枨竽P投x了一組分析類,每一個(gè)分析類都描述問題域中的某些元素,這些元素關(guān)注用戶可見的問題方面。分析類的抽象級相對較高。

在設(shè)計(jì)模式演化時(shí),必須定義一組設(shè)計(jì)類:①通過提供設(shè)計(jì)細(xì)節(jié)精化分析類,這些設(shè)計(jì)細(xì)節(jié)將促成類的實(shí)現(xiàn);②實(shí)現(xiàn)支持業(yè)務(wù)解決方案的軟件基礎(chǔ)設(shè)施。

有5種類型的設(shè)計(jì)類,每一種都表示了設(shè)計(jì)體系結(jié)構(gòu)的一個(gè)不同層次。

●用戶接口類:定義人-機(jī)交互(Human-Computer Interaction,HCI)所必需的所有抽象。在很多情況下,HCI出現(xiàn)在隱喻的環(huán)境(如支票簿、訂單表格和傳真機(jī))中,而接口的設(shè)計(jì)類可能是這種隱喻元素的可視化表示。

●業(yè)務(wù)域類:通常是早期定義的分析類的精化。這些類識別實(shí)現(xiàn)某些業(yè)務(wù)域元素所必需的屬性和服務(wù)(方法)。

●過程類:實(shí)現(xiàn)完整的管理業(yè)務(wù)域類所必需的低層業(yè)務(wù)抽象。

●持久類:表示將在軟件執(zhí)行之外持續(xù)存在的數(shù)據(jù)存儲(如數(shù)據(jù)庫)。

●系統(tǒng)類:實(shí)現(xiàn)軟件管理和控制功能,使得系統(tǒng)能夠運(yùn)行,并在其計(jì)算環(huán)境內(nèi)與外界通信。

隨著體系結(jié)構(gòu)的形成,每個(gè)分析類轉(zhuǎn)化為設(shè)計(jì)表示,抽象級就降低了。也就是說,分析類使用業(yè)務(wù)域的專門用語描述對象(以及對象所用的相關(guān)服務(wù));設(shè)計(jì)類更多地表現(xiàn)技術(shù)細(xì)節(jié),用于指導(dǎo)實(shí)現(xiàn)。應(yīng)該評審每個(gè)設(shè)計(jì)類,以確保設(shè)計(jì)類是“組織良好的”。

組織良好的設(shè)計(jì)類具有以下4個(gè)特征。

1)完整性與充分性。設(shè)計(jì)類應(yīng)該完整地封裝所有可以合理預(yù)見到的(根據(jù)對類名的理解)存在于類中的屬性和方法。例如,為視頻編輯軟件定義的Scene類,只有當(dāng)它包含與創(chuàng)建視頻場景相關(guān)的所有合理的屬性和方法時(shí),才是完整的。充分性確保設(shè)計(jì)類只包含那些“對實(shí)現(xiàn)這個(gè)類的目的足夠”的方法,不多也不少。與一個(gè)設(shè)計(jì)類相關(guān)的方法應(yīng)該關(guān)注實(shí)現(xiàn)類的某一個(gè)服務(wù)。例如,視頻編輯軟件的VideoClip類,可能用屬性start-point和end-point指定剪輯的起點(diǎn)和終點(diǎn)(注意,加載到系統(tǒng)的原始視頻可能比要用的部分長)。方法setStartPoint()和setEndPoint()為剪輯提供了設(shè)置起點(diǎn)和終點(diǎn)的唯一手段。

2)高內(nèi)聚性。一個(gè)內(nèi)聚的設(shè)計(jì)類具有小的、集中的職責(zé)集合,并且專注于使用屬性和方法來實(shí)現(xiàn)那些職責(zé)。例如,視頻編輯軟件的VideoClip類可能包含一組用于編輯視頻剪輯的方法。只要每個(gè)方法只關(guān)注與視頻剪輯相關(guān)的屬性,內(nèi)聚性就得以維持。

3)低耦合性。在設(shè)計(jì)模型內(nèi),設(shè)計(jì)類之間相互協(xié)作是必然的。但是,協(xié)作應(yīng)該保持在一個(gè)可以接受的最小范圍內(nèi)。如果設(shè)計(jì)模型高度耦合(每個(gè)設(shè)計(jì)類和其他所有設(shè)計(jì)類都有協(xié)作關(guān)系),那么系統(tǒng)就難以實(shí)現(xiàn)和測試,并且維護(hù)也很費(fèi)力。通常,一個(gè)子系統(tǒng)內(nèi)的設(shè)計(jì)類對其他子系統(tǒng)中的類應(yīng)僅有有限的了解。該限制被稱為Demeter定律[1],該定律建議一個(gè)方法應(yīng)該只向周邊類中的方法發(fā)送消息。

主站蜘蛛池模板: 石狮市| 岐山县| 绿春县| 兰西县| 大方县| 通化县| 安义县| 三亚市| 寻甸| 晋江市| 新余市| 兴安县| 海兴县| 贵溪市| 长垣县| 获嘉县| 凤山县| 出国| 贡山| 方山县| 香河县| 苏州市| 天祝| 光泽县| 新邵县| 湘潭县| 宜春市| 康乐县| 汨罗市| 宁陕县| 昌黎县| 德化县| 富阳市| 富锦市| 历史| 嵩明县| 禹城市| 卓资县| 城口县| 蚌埠市| 黄平县|