獨(dú)家專訪林昊:一步一步了解Java模塊化
原創(chuàng)【51CTO獨(dú)家特稿】模塊化編程從UNIX開始興起,自Eclipse和NetBeans等插拔式IDE獲得巨大成功之后,在最近幾年受到廣泛關(guān)注。51CTO開發(fā)頻道曾對模塊化編程的優(yōu)點(diǎn)與實(shí)現(xiàn)原理進(jìn)行過簡單的介紹,并且在Java模塊化方面,對OSGi規(guī)范進(jìn)行了持續(xù)的報(bào)道。
但是,很多Java開發(fā)者對模塊化編程仍然接觸不多,對Java的模塊化的進(jìn)展也不甚了解。多方觀望,2010年將是Java模塊化的一年,因此51CTO編輯希望能在這一年中讓更多的開發(fā)者了解模塊化編程的概念,它的學(xué)習(xí)、實(shí)現(xiàn)方式以及它的好處。為此,我們請來了一位國內(nèi)的OSGi布道者為大家進(jìn)行一次簡單的普及介紹。
有請China OSGi User Group Director,淘寶網(wǎng)平臺架構(gòu)部架構(gòu)師——林昊(@BlueDavy)。林昊是《OSGi原理與最佳實(shí)踐》一書的作者。
此次采訪模式為郵件采訪,林昊對51CTO編輯提出的7個(gè)問題一一進(jìn)行了回復(fù)。內(nèi)容如下:
1. 模塊的實(shí)現(xiàn)和傳統(tǒng)編程方法有何不同?開發(fā)者需要學(xué)習(xí)哪些知識(比如版本控制、依賴性管理、規(guī)范的接口設(shè)計(jì)等)?
林昊:模塊的實(shí)現(xiàn)和傳統(tǒng)的編程方法確實(shí)有一些差別,主要體現(xiàn)在模塊之間類訪問的隔離、版本選擇這兩個(gè)方面。如希望更好的設(shè)計(jì)模塊化的系統(tǒng),開發(fā)者需要學(xué)習(xí)ClassLoader機(jī)制、模塊之間類的交互方法(這包括了模塊怎么樣對外提供可訪問的package、怎么樣訪問其他模塊提供的package、如何選擇適合版本的package等)。
2. 對模塊化的形容,我們往往使用“高內(nèi)聚”,“低耦合/松散耦合”這樣的用語。您是如何理解這兩個(gè)概念的?
林昊:高內(nèi)聚、低耦合更多程度是指讓模塊之間的依賴是清晰的,內(nèi)聚體現(xiàn)在內(nèi)部對功能實(shí)現(xiàn)的封裝,而低耦合體現(xiàn)在模塊對外提供的接口是可控的。在模塊化之前,在Java體系中更多的是通過public、protected、private這樣的作用域來保證依賴清晰(參考閱讀:模塊化概念解惑);但事實(shí)證明,這樣的方法來保證不是非常有效。而在模塊化的體系中,則會有明確的模塊之間接口暴露以及依賴的定義,因此能夠更好的實(shí)現(xiàn)高內(nèi)聚和低耦合。
3. 模塊化編程的好處有哪些?它解決了原來那種緊密耦合式編程中存在的哪些問題?
林昊:模塊化編程最大的好處在于有效的控制和避免了模塊被外部誤用。其他方面的好處在于各模塊可以方便的做到引用自己所需要依賴的包,避免產(chǎn)生包沖突現(xiàn)象,對于現(xiàn)有java體系而言,另外一個(gè)好處則是可以做到多版本的共存。
4. 您覺得模塊化編程最大的難點(diǎn)在哪里?在您的模塊化開發(fā)過程中,理清邏輯和層次所花的時(shí)間和編寫代碼花費(fèi)的時(shí)間大致是怎樣的比例?
林昊:模塊化編程最大的難點(diǎn)一方面是設(shè)計(jì)方面的挑戰(zhàn),在沒有實(shí)際隔離情況下模塊化的設(shè)計(jì)其實(shí)并不會真正做到有效的模塊隔離的設(shè)計(jì);另一方面是在開發(fā)過程中,以前的開發(fā)習(xí)慣都需要改變,例如以前需要依賴其他模塊時(shí),可以采用直接依賴工程或依賴jar的方式,但在模塊化的系統(tǒng)中則不行。
在實(shí)際的模塊化開發(fā)過程中,更多的時(shí)間仍然會花費(fèi)在設(shè)計(jì)階段。
5. 我們來談?wù)凮SGi規(guī)范。OSGi模塊化規(guī)范有什么特點(diǎn)?
林昊:OSGi是Java中目前唯一的一個(gè)模塊化、動(dòng)態(tài)化的規(guī)范。在模塊化方面OSGi聯(lián)盟已經(jīng)研究了很多年了,因此OSGi規(guī)范對于模塊的物理隔離、模塊的交互、多版本這些方面都有了非常完善的機(jī)制,并且也得到了現(xiàn)在幾乎所有的App Server廠商或開源社區(qū)的認(rèn)可。
6. 雖然OSGi已經(jīng)是有十多年發(fā)展的成熟的模塊化標(biāo)準(zhǔn),但Sun在對Java進(jìn)行模塊化的時(shí)候卻選擇采用JSR 294,并在Java 7當(dāng)中開展Jigsaw項(xiàng)目。您對此有什么看法?
#t#林昊:JCP在關(guān)于Java 7納入模塊化后到底采用什么標(biāo)準(zhǔn)爭論了非常久,JSR 294是個(gè)研討了多年的規(guī)范,但最后不了了之;Sun現(xiàn)在另起爐灶做Jigsaw,但其實(shí)并沒有得到多大的擁護(hù),各App Server仍然采用OSGi作為其基礎(chǔ)平臺就是最好的證明(參考閱讀:JSR 294被叫停 應(yīng)用服務(wù)器押寶OSGi)。可以說現(xiàn)在OSGi已經(jīng)是Java領(lǐng)域模塊化、動(dòng)態(tài)化的事實(shí)性標(biāo)準(zhǔn)。
7. 您認(rèn)為理想的Java模塊化標(biāo)準(zhǔn)應(yīng)該具備怎樣的特點(diǎn)?您對Java模塊化的發(fā)展有怎樣的期待?
林昊:Java模塊化標(biāo)準(zhǔn)應(yīng)有明確的模塊定義、模塊之間隔離機(jī)制的定義、模塊交互機(jī)制的定義,個(gè)人認(rèn)為在模塊化這一方面OSGi已經(jīng)做到非常好了,當(dāng)然,如果是語言級能支持就更完美了。
對于Java模塊化的發(fā)展而言,還是希望Sun能放開胸懷,采用OSGi作為Java模塊化的實(shí)現(xiàn)基礎(chǔ),并納入語言級中。