javapackage的設(shè)計(jì)原則

字號(hào):

典型的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ù)種類的不同,想得出通用性的設(shè)計(jì)套路是不大可能的。這時(shí)候遵循一些原則比之生搬硬套更為重要。在《敏捷軟件開(kāi)發(fā)》一書中對(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)聚性很好,所有的類都服務(wù)于一個(gè)目的,從而帶來(lái)了重用的可能(其實(shí)我對(duì)重用性并不感冒,除了工具類外真正能重用的東西少之又少,內(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í)就需要引入工廠類、插件或者IOC容器來(lái)負(fù)責(zé)實(shí)例化實(shí)現(xiàn)類。