Posted on 2010-07-16 08:47
delvin 閱讀(924)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
面向?qū)ο?/a>
想要把類(lèi),接口和模塊設(shè)計(jì)好是一項(xiàng)高難度的工作。前人對(duì)此有過(guò)很好的研究和總結(jié),在此僅把我自己設(shè)計(jì)類(lèi)的方法歸納下:
設(shè)計(jì)類(lèi)的步驟?
1.定義類(lèi)的職責(zé)
Note:
1)一個(gè)類(lèi)的職責(zé)是這個(gè)類(lèi)存在的價(jià)值,若你不能清晰的給這個(gè)類(lèi)定義職責(zé),那么很可能意味著這個(gè)類(lèi)沒(méi)有存在的價(jià)值。
2)從職責(zé)的角度去定義類(lèi),選擇類(lèi)比單純的什么從業(yè)務(wù)術(shù)語(yǔ)中找名詞來(lái)做類(lèi)名要有效的多.
3) 在設(shè)計(jì)類(lèi)的時(shí)候,我經(jīng)常用CEO設(shè)計(jì)企業(yè)組織機(jī)構(gòu)來(lái)比喻。在設(shè)計(jì)企業(yè)架構(gòu)時(shí),需要考慮企業(yè)做的事,劃分不用的職責(zé)和角色,
再設(shè)計(jì)不同的部門(mén)和崗位來(lái)承擔(dān)這些職責(zé)。部門(mén)類(lèi)似我們軟件的package,崗位就類(lèi)似我們類(lèi),具體的人就類(lèi)似對(duì)象。
2.找個(gè)好名字來(lái)作為類(lèi)名,這個(gè)類(lèi)名基本可以暗示該類(lèi)的職責(zé)。
Note:
1)對(duì)人來(lái)說(shuō),一個(gè)有意義的名字,勝過(guò)千言萬(wàn)語(yǔ)。好名字的標(biāo)準(zhǔn)就是用名字表達(dá)意圖。
2)若不能找到一個(gè)好名字,也可能暗示這個(gè)類(lèi)的職責(zé)沒(méi)有定義清楚,這個(gè)類(lèi)存在的價(jià)值值得懷疑。
3)一般我們選擇英文名詞作為類(lèi)名,比如converter就是convert好。若把軟件系統(tǒng)比喻成機(jī)器系統(tǒng),那個(gè)類(lèi)就是部件,而部件一般都是用名詞 的。當(dāng)然這也不能絕對(duì)化,有些情況例外。
3.定義對(duì)外接口
Note:
1)類(lèi)的職責(zé)最后要轉(zhuǎn)化為可供外部使用的接口,具體來(lái)說(shuō)就是公共方法集。
2)接口盡量有完備的方法(是它做的事,都應(yīng)該有對(duì)應(yīng)方法來(lái)做,或組合來(lái)做),同時(shí)盡量使接口小(最小化),能用接口已有方法組合來(lái)做的,就不提供其他方法,但有例外,若這種組合用法很普遍,那最好提供一個(gè)冗余方法。Java 中的List類(lèi)是一個(gè)很少的例子,本身用List.size()== 0 方式可以達(dá) 到判斷是不是空的效果,但這種情況太普遍了,類(lèi)庫(kù)的設(shè)計(jì)者提供了一個(gè)isEmpty()方法。但要注意這種的便利方法,不易太多,這些方法沒(méi)有提高類(lèi)的能力,只是提高了便利性。
4.撰寫(xiě)類(lèi)或接口的規(guī)范
Note:
1.撰寫(xiě)的類(lèi)或方法規(guī)范本身也是設(shè)計(jì)的一部分工作。在Java中可以用javadoc來(lái)做。
2.很多人忽略撰寫(xiě)接口規(guī)范,實(shí)際上類(lèi)設(shè)計(jì)的很大一部分工作就是定義這個(gè)接口規(guī)范。
5.使用自己設(shè)計(jì)接口
Note:
1)類(lèi)設(shè)計(jì)完一定要自己先去使用,站在使用者的角度去評(píng)價(jià)這個(gè)類(lèi)的好壞。
2)現(xiàn)在的測(cè)試驅(qū)動(dòng)開(kāi)發(fā),就是一種用測(cè)試驅(qū)動(dòng)設(shè)計(jì)的好辦法,測(cè)試代碼就是客戶(hù)代碼的一種。在測(cè)試過(guò)程中就能知道類(lèi)設(shè)計(jì)的怎么樣,若感覺(jué)不好,就需要返回去再設(shè)計(jì)。
一個(gè)設(shè)計(jì)良好的類(lèi)具有的一般特征:
1.類(lèi)接口具有完備性和最小化,適當(dāng)提供冗余方法
2.使類(lèi)和成員的可訪問(wèn)性最小話
理由:滿(mǎn)足軟件設(shè)計(jì)的基本原則之一封裝(Encapsulation)或信息隱藏(information hiding)
Java語(yǔ)言提供的機(jī)制:訪問(wèn)控制(Access Control)。
如何達(dá)到:請(qǐng)參考Effectvie Java 中第13條。
3.在共有類(lèi)中使用共有方法而非共有域
理由:共有域?qū)儆趯?shí)現(xiàn)細(xì)節(jié)的東西,不應(yīng)該暴露出去,這樣就違背了封裝原則。
4.使可變性最小化
理由:類(lèi)是具有職責(zé)的實(shí)體,根據(jù)單一職責(zé)原則,一個(gè)類(lèi)應(yīng)該只有一個(gè)或一類(lèi)職責(zé),也就是說(shuō)只有一個(gè)引起類(lèi)變化的原因。導(dǎo)致類(lèi)可變性越小,修改這個(gè)類(lèi)的機(jī)會(huì)就越小,從而提高了維護(hù)性和減少Bug。
5.接口命名具有一致性
理由:設(shè)計(jì)一個(gè)接口類(lèi)似在設(shè)計(jì)一個(gè)簡(jiǎn)單的語(yǔ)言,若接口命名不一致,就會(huì)導(dǎo)致使用者的困惑和費(fèi)解。