張茵
摘要:面向?qū)ο笤O(shè)計就是用面向?qū)ο笥^點建立求解空間模型的過程。通過面向?qū)ο蠓治龅贸龅膯栴}域模型為建立求解空間模型奠定了堅實基礎(chǔ),分析與設(shè)計本質(zhì)上是_個多次反復(fù)迭代的過程,面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計的界限尤其模糊。文章主要介紹了為獲得優(yōu)秀設(shè)計結(jié)果應(yīng)該遵循的基本準(zhǔn)則和通過經(jīng)驗得出的幾條有助于提高設(shè)計質(zhì)量的啟發(fā)式規(guī)則。有助于讀者更加清楚的了解面向?qū)ο笤O(shè)計的優(yōu)勢。
關(guān)鍵詞:面向?qū)ο笤O(shè)計;準(zhǔn)則;啟發(fā)式規(guī)則
0 引言
所謂優(yōu)秀設(shè)計,就是權(quán)衡了各種因素,從而使得系統(tǒng)在其整個生命周期中的總開銷最小的設(shè)計。指導(dǎo)軟件設(shè)計的基本原理在進(jìn)行面向?qū)ο笤O(shè)計時仍然成立,但是增加了一些與面向?qū)ο蠓椒芮邢嚓P(guān)的新特點,從而具體化為下列面向?qū)ο笤O(shè)計準(zhǔn)則。
1 面向?qū)ο笤O(shè)計準(zhǔn)則
1.1 模塊化
面向?qū)ο筌浖_發(fā)模式,很自然地支持了把系統(tǒng)分解成模塊的設(shè)計原理:對象就是模塊。它是把數(shù)據(jù)結(jié)構(gòu)和操作這些數(shù)據(jù)的方法緊密的結(jié)合在一起所構(gòu)成的模塊。
1.2 抽象
面向?qū)ο蠓椒ú粌H支持過程抽象,而且支持?jǐn)?shù)據(jù)抽象。類實際上是一種抽象數(shù)據(jù)類型,它對外開放的公共接口構(gòu)成了類的規(guī)格說明,這種接口規(guī)定了外界可以使用的合法操作符,利用這些操作符可以對類實例中包含的數(shù)據(jù)進(jìn)行操作。使用者無須知道這些操作符的實現(xiàn)算法和類中數(shù)據(jù)元素的具體表示方法,就可以通過這些操作符使用類中定義的數(shù)據(jù)。通常這類抽象稱為規(guī)格說明抽象。
某些面向?qū)ο蟮某绦蛟O(shè)計語言還支持參數(shù)化抽象。所謂參數(shù)化抽象,是指當(dāng)描述類的規(guī)格說明時不具體制定所要操作的數(shù)據(jù)類型,而是把數(shù)據(jù)類型作為參數(shù)。這使類的抽象程度更高,應(yīng)用范圍更廣,可重用性更高。
1.3 信息隱藏
在面向?qū)ο蠓椒ㄖ?,信息隱藏通過對象的封裝性實現(xiàn):類結(jié)構(gòu)分離了接口和實現(xiàn),從而支持了信息隱藏。對于類的用戶來說,屬性的表示方法和操作的實現(xiàn)算法都應(yīng)該是隱藏的。
1.4 弱耦合
耦合是指一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的緊密程度。在面向?qū)ο蠓椒ㄖ?,對象是最基本的模塊,耦合主要指不同對象之間互相關(guān)聯(lián)的緊密程度。弱耦合是優(yōu)秀設(shè)計的一個重要標(biāo)準(zhǔn),因為這有助于使得系統(tǒng)中某一部分的變化對其他部分的影響降到最低程度。
如果一類對象過多依賴其他類對象完成自己的工作,不僅給理解、測試或修改這個類帶來很大困難,而且還將大大降低該類的可重用性和可移植性。類之間的這種相互依賴關(guān)系是緊耦合。對象不可能是完全孤立的,當(dāng)兩個對象必須相互聯(lián)系相互依賴時,應(yīng)該通過類的協(xié)議實現(xiàn)耦合,不應(yīng)該依賴于類的具體實現(xiàn)細(xì)節(jié)。
1.4.1 交互耦合
如果對象之間的耦合通過消息連接來實現(xiàn),這種耦合叫交互耦合。為使交互耦合盡可能松散,應(yīng)遵循下述準(zhǔn)則:
(1)盡量降低消息連接的復(fù)雜程度。應(yīng)該盡量減少消息中包含的參數(shù)個數(shù),降低參數(shù)的復(fù)雜程度。
(2)減少對象發(fā)送的消息數(shù)。
1.4.2 繼承耦合
與交互耦合相反,應(yīng)該提高繼承耦合程度。繼承是一般化類與特殊類之間耦合的一種形式。從本質(zhì)上看,通過繼承關(guān)系結(jié)合起來的基類和派生類,構(gòu)成了系統(tǒng)中粒度更大的模塊。因此它們彼此之間應(yīng)該結(jié)合的越緊密越好。
為獲得緊密的繼承耦合,特殊類應(yīng)該確實是對它的一般化類的一種具體化。如果一個派生類擯棄了它基類的許多屬性,他們之間是松耦合。
1.5 強(qiáng)內(nèi)聚
內(nèi)聚衡量一個模塊內(nèi)各個元素彼此結(jié)合的緊密程度。也可以把內(nèi)聚定義為:設(shè)計中使用的一個構(gòu)件內(nèi)的各個元素,對完成一個定義明確的目的所作出的貢獻(xiàn)程度。在設(shè)計時應(yīng)該力求做到高內(nèi)聚。在面向?qū)ο笤O(shè)計中存在3種內(nèi)聚:
(1)服務(wù)內(nèi)聚。一個服務(wù)應(yīng)該完成一個且僅完成一個功能。
(2)類內(nèi)聚。設(shè)計類的原則是,一個類應(yīng)該只有一個用途,它的屬性和服務(wù)應(yīng)該是高內(nèi)聚的,類的屬性和服務(wù)應(yīng)該全都是完成該類對象的任務(wù)所必需的,其中不包括無用的屬性或服務(wù)。如果某個類有多個用途,通常應(yīng)該把它分解成多個專用的類。
(3)一般特殊內(nèi)聚。設(shè)計出的一般特殊結(jié)構(gòu),應(yīng)該符合多數(shù)人的概念,這種結(jié)構(gòu)應(yīng)該是對相應(yīng)的領(lǐng)域知識的正確抽取。
緊密的繼承耦合與高度的一般特殊內(nèi)聚是一致的。
1.6 可重用性
軟件重用是提高軟件開發(fā)生產(chǎn)率和目標(biāo)系統(tǒng)質(zhì)量的重要途徑。重用基本上從設(shè)計階段開始。重用有兩方面的含義:盡量使用已有的類;如果確實需要創(chuàng)建新類,則在設(shè)計這些新類的協(xié)議時,應(yīng)該考慮將來的可重復(fù)使用性。
2 啟發(fā)規(guī)則
人們使用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件歷史雖然不長,但也積累了一些經(jīng)驗。總結(jié)這些經(jīng)驗得出了幾條啟發(fā)規(guī)則,它們往往能幫助軟件開發(fā)人員提高面向?qū)ο笤O(shè)計的質(zhì)量。
2.1 設(shè)計結(jié)果應(yīng)該清晰易懂
使設(shè)計結(jié)構(gòu)清晰、易讀、易懂,是提高軟件可維護(hù)性和可重用性的重要措施。保證設(shè)計結(jié)果清晰易懂的主要因素如下:
(1)用詞一致。名字與它所代表的事物一致,應(yīng)該盡量使用人們習(xí)慣的名字。
(2)使用已有的協(xié)議。如果開發(fā)同一軟件的其他設(shè)計人員已經(jīng)建立了類的協(xié)議,應(yīng)該使用這些已有的協(xié)議。
(3)減少消息模式數(shù)目。如果已有標(biāo)準(zhǔn)的消息協(xié)議,設(shè)計人員應(yīng)該遵循這些協(xié)議。如果確需自己建立消息協(xié)議,應(yīng)該盡量減少消息模式的數(shù)目,只要可能,就使消息具有一致的模式。
(4)避免模糊的定義。一個類的用途應(yīng)該是有限的,而且應(yīng)該從類名可以較容易的推想它的用途。
2.2 一般一特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)
應(yīng)該使類等級中包含的層次數(shù)適當(dāng)。在一個中等規(guī)模的系統(tǒng)中,類等級層次數(shù)應(yīng)保持為7-2到7+2范圍內(nèi)。不應(yīng)該僅僅從方便編碼的角度出發(fā)隨意創(chuàng)建派生類,應(yīng)該使一般特殊結(jié)構(gòu)與領(lǐng)域知識或常識保持一致。
2.3 設(shè)計簡單的類
盡量設(shè)計小而簡單的類,以便于開發(fā)和管理。當(dāng)類很大的時候,要記住它的所有服務(wù)是非常困難的。如果一個類的定義不超過一頁紙,則使用這個類是比較容易的。為使類保持簡單,應(yīng)該注意以下幾點。
(1)避免包含過多的屬性。屬性過多通常表明這個類過分復(fù)雜,它所完成的功能可能太多了。
(2)有明確的定義。為了使類的定義明確,分配給每個類的任務(wù)應(yīng)該簡單,最好能用一兩個簡單語句描述它的任務(wù)。
(3)盡量簡化對象之間的合作關(guān)系。如果需要多個對象協(xié)同配合才能做好一件事,則破壞了類的簡明性和清晰性。
(4)不要提供太多服務(wù)。一個類提供的服務(wù)過多,表明這個類過分復(fù)雜,一個類提供的服務(wù)不要超過7個。
在開發(fā)大型軟件系統(tǒng)時,遵循上述啟發(fā)規(guī)則也會帶來另一個問題:設(shè)計出大量較小的類,這同樣會帶來一定復(fù)雜性。解決這個問題的辦法,是把系統(tǒng)中的類按邏輯分組,也就是劃分“主題”。
2.4 使用簡單的協(xié)議
消息中的參數(shù)不要超過3個。經(jīng)驗表明,通過復(fù)雜消息相互關(guān)聯(lián)的對象是緊耦合的,對一個對象的修改往往導(dǎo)致其他對象的修改。
2.5 使用簡單的服務(wù)
面向?qū)ο笤O(shè)計出來的類中的服務(wù)通常都很小,一般只有3-5行源程序語句,可以用僅含一個動詞和一個賓語的簡單句子描述它的功能。如果一個服務(wù)中包含了過多的源程序語句,或語句嵌套層次太多,或使用了復(fù)雜的CASE語句,應(yīng)該仔細(xì)檢查這個服務(wù),設(shè)法分解或簡化它。應(yīng)該盡量避免使用復(fù)雜的服務(wù)。如果需要在服務(wù)中使用CASE語句,通常應(yīng)該考慮用一般特殊結(jié)構(gòu)代替這個類的可能性。
2.6 把設(shè)計變動減至最小
設(shè)計的質(zhì)量越高,設(shè)計結(jié)果保持不變的時間也越長。即使出現(xiàn)必須修改設(shè)計的情況,也應(yīng)該使修改的范圍盡可能小。在設(shè)計的早期階段,變動較大,隨著時間推移,設(shè)計方案日趨成熟,改動也越小。
3 結(jié)語
分析是提取和整理用戶需求,建立問題域精確模型的過程。設(shè)計則是把分析得到的需求轉(zhuǎn)變成符合成本和質(zhì)量要求的、抽象的系統(tǒng)實現(xiàn)方案的過程。系統(tǒng)設(shè)計確定實現(xiàn)系統(tǒng)的策略和目標(biāo)系統(tǒng)的高層結(jié)構(gòu),對象設(shè)計確定解空間中的類、關(guān)聯(lián)、接口形式以及實現(xiàn)服務(wù)的算法。面向?qū)ο笤O(shè)計就是用面向?qū)ο笥^點建立求解域模型的過程。許多分析結(jié)果可以直接映射成設(shè)計結(jié)果,在設(shè)計過程中又會加深和補(bǔ)充對系統(tǒng)需求的理解,從而進(jìn)一步完善分析結(jié)果。