Posted on 2008-09-06 00:15
dennis 閱讀(2997)
評(píng)論(3) 編輯 收藏 所屬分類(lèi):
java
典型的J2EE項(xiàng)目,package的設(shè)計(jì)有成熟的套路可循,如分為domain、dao、service、action等等,職責(zé)已經(jīng)分解的比較單一和清晰,循環(huán)依賴這樣的情況出現(xiàn)并不多。而在一般的java項(xiàng)目,如服務(wù)器程序、客戶端程序和通用性框架的開(kāi)發(fā)中,包的設(shè)計(jì)并沒(méi)有套路可循,畢竟由于應(yīng)用和業(yè)務(wù)種類(lèi)的不同,想得出通用性的設(shè)計(jì)套路是不大可能的。這時(shí)候遵循一些原則比之生搬硬套更為重要。在《敏捷軟件開(kāi)發(fā)》一書(shū)中對(duì)包的設(shè)計(jì)有深入的討論,雖然針對(duì)的是發(fā)布的二進(jìn)制包而言,但是對(duì)于java package的設(shè)計(jì)同樣有借鑒意義,如對(duì)包的內(nèi)聚性、可重用性、穩(wěn)定性的強(qiáng)調(diào),對(duì)于依賴的探討,這些都是比較籠統(tǒng)的概念,不是那么直觀,需要在實(shí)際運(yùn)用中認(rèn)真歸納和重構(gòu),向這些原則靠攏。
我所想到一個(gè)比較直觀的方法就是:對(duì)于一個(gè)包的描述,你是否能用一句簡(jiǎn)明扼要的話概括,也就是包的功能或者說(shuō)介紹能否做到簡(jiǎn)明扼要,這是衡量一個(gè)包的設(shè)計(jì)是否合理的最簡(jiǎn)單的方法。如果可以,顯然這個(gè)包的內(nèi)聚性很好,所有的類(lèi)都服務(wù)于一個(gè)目的,從而帶來(lái)了重用的可能(其實(shí)我對(duì)重用性并不感冒,除了工具類(lèi)外真正能重用的東西少之又少,內(nèi)聚性才是需要關(guān)注的);反之,這個(gè)包可能承擔(dān)了太多的職責(zé)或者依賴過(guò)多,仔細(xì)的重構(gòu)和分離是需要做的。包的設(shè)計(jì)同樣要遵循接口分離的原則,將接口與實(shí)現(xiàn)隔離在不同的包之中,客戶程序就不會(huì)知道具體的實(shí)現(xiàn),并且也保證了實(shí)現(xiàn)對(duì)接口的單向依賴。當(dāng)然,這時(shí)就需要引入工廠類(lèi)、插件或者IOC容器來(lái)負(fù)責(zé)實(shí)例化實(shí)現(xiàn)類(lèi)。
評(píng)論
接口與實(shí)現(xiàn)隔離在不同的包之中是個(gè)比較好的實(shí)踐,贊同。
關(guān)注點(diǎn)分離永遠(yuǎn)是軟件開(kāi)發(fā)架構(gòu)的重點(diǎn),LZ說(shuō)重用甚少,開(kāi)發(fā)軟件如果架構(gòu)允許的話我們都會(huì) import 第三方組件,such as apache commons and so on. commons 重用的原因是因?yàn)楹蜆I(yè)務(wù)無(wú)關(guān),沒(méi)有依賴性,當(dāng)然和業(yè)務(wù)有關(guān)的也可以重用,這也就是 SOA 的理念之一了。
@Jack.Wang
重用的粒度問(wèn)題,而我說(shuō)談的重用局限在代碼級(jí)別的重用。
贊同樓主觀點(diǎn),包的設(shè)計(jì)應(yīng)該是在通用的設(shè)計(jì)原則的指導(dǎo)下完成
應(yīng)該以很多個(gè)維度來(lái)綜合地看待這個(gè)問(wèn)題,盡量考慮到各個(gè)規(guī)則(例如盡量分離抽象和實(shí)現(xiàn),更好的遵循開(kāi)閉原則....),不要和經(jīng)典的規(guī)則發(fā)生沖突~_~
有的人可能更喜歡從技術(shù)視角進(jìn)行劃分,例如可能會(huì)出現(xiàn)**.factory類(lèi)型的包,里面放置了供用戶調(diào)用的工程類(lèi);有的人則可能更喜歡從業(yè)務(wù)角度進(jìn)行劃分等。
大的原則是存在的,具體細(xì)節(jié)因人而異 ^_^。