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