1、Eclipse
法則(Eclipse Rule)
擴(kuò)展者(
Extender)
――添加插件
?????? 貢獻(xiàn)法則( Contribution Rule ):一切皆是貢獻(xiàn)。
?????? 遵循法則( Conformance Rule ):插件必須遵循預(yù)期的接口。
?????? 共享法則( Sharing Rule ):增加,不要取代。
?????? 有樣學(xué)樣法則( Monkey See/Monkey Do Rule ):遇到問題時(shí),首先復(fù)制類似插件的結(jié)構(gòu)。
?????? 相關(guān)性法則( Relevance Rule ):只有在操作有可能成功時(shí)菜顯示你所貢獻(xiàn)的操作。
?????? 整合法則( Integration Rule ):要整合,不要分裂。
?????? 責(zé)任法則( Responsibility Rule ):明確指出你所開發(fā)的插件時(shí)問題的源頭。
?????? 針對(duì) API 契約編程法則( Program to API Contract Rule ):首先檢查 Eclipse API 契約,然后針對(duì)契約編程。
?????? Other 法則( Other Rule ):讓用戶可以選擇所有東西,但把那些通常不用于當(dāng)前視角的選項(xiàng)放在 Other… 對(duì)話框中。
?????? IResource 適配法則( Adapt to IResource Rule ):應(yīng)該盡量為領(lǐng)域?qū)ο蠖x IResource 適配器。
?????? 分層法則( Strata Rule ):將語言無關(guān)的功能與特定于具體語言的功能分開,將核心性能與 UI 分開。
?????? 用戶連貫性法則( User Continuity Rule ):在多次會(huì)話之間,應(yīng)該保持 UI 狀態(tài)一致。
促成者(
Enabler?
)
――發(fā)布擴(kuò)展點(diǎn)
?????? 邀請(qǐng)法則( Invitation Rule ):盡可能的邀請(qǐng)別人為你的作品作出貢獻(xiàn),發(fā)布擴(kuò)展點(diǎn)。
?????? 懶加載法則( Lazy Loading Rule ):只有在真正需要的時(shí)候才加載插件。
?????? 安全平臺(tái)法則( Safe Platform Rule ):作為擴(kuò)展點(diǎn)的提供者,你必須保護(hù)好自己,不要讓擴(kuò)展者的誤操作給你造成損失。
?????? 公平競(jìng)爭(zhēng)法則( Fair Play Rule ):所有使用者遵守同樣的游戲規(guī)則,包括我自己。
?????? 明確擴(kuò)展法則( Explicit Extension Rule ):明確說明平臺(tái)的什么地方可供擴(kuò)展。
?????? 發(fā)散性法則( Diversity Rule ):一個(gè)擴(kuò)展點(diǎn)接納多個(gè)擴(kuò)展。
?????? 良好防御法則( Good Fences Rule ):如果要交出程序的控制權(quán),首先保護(hù)好你自己。
?????? 用戶決定法則( User Arbitration Rule ):如果有多個(gè)選擇,由用戶決定使用哪一個(gè)。
?????? 明確 API 法則( Explicit API Rule ):將 API 與插件內(nèi)部使用的類分開。
?????? 穩(wěn)定性法則( Stability Rule ):如果你已經(jīng)開始邀請(qǐng)其它人作出貢獻(xiàn),就不要再改變游戲規(guī)則。
?????? 保守 API 法則( Defensive API Rule ):只暴露你有信心的 API ,但同時(shí)也應(yīng)該做好準(zhǔn)備暴露更多的 API ,因?yàn)槭褂谜邥?huì)要求你這樣做。(不含 internal 的包被認(rèn)為是公開的、允許后續(xù)的擴(kuò)展者使用的;不含 internal 的包,則不是打算拿到插件外使用的。)
發(fā)布者(
Publisher)
――發(fā)布插件
2、Eclipse 插件(Plug-in)
何時(shí)需要一個(gè)插件類
?????? 每個(gè)插件都由一個(gè)插件類來代表。插件類是一個(gè)Singleton,其中提供了一些鉤子方法,可以對(duì)插件的什么周期事件作出響應(yīng)。可以在插件第一次加載時(shí)讀入所需的資源,也可以在插件停止時(shí)做必要的清理工資。另外,插件還負(fù)責(zé)提高一些共享信息。
投影(Shadow)的世界
?????? Eclipse平臺(tái)啟動(dòng)時(shí)會(huì)將所有插件清單文件讀入一個(gè)插件注冊(cè)表中,為每個(gè)插件創(chuàng)建一個(gè)投影。此時(shí)不會(huì)加載插件本身,只加載它們的描述信息。(Platform.getPluginRegistry())
開發(fā)插件時(shí),不要在項(xiàng)目屬性中修改構(gòu)建classpath,始終在清單文件中修改。
在Eclipse中,每個(gè)插件都有自己的類加載器(class loader)和自己的類查找路徑(classpath),后者將繼承該插件所導(dǎo)入的其它插件的classpath。當(dāng)插件的類加載器加載插件的第一個(gè)類時(shí),就會(huì)激活該插件。
插件類加載器
1、? 插件類加載器的上級(jí)加載器,Eclipse的引導(dǎo)加載器,boot.jar
2、? 插件本身的類加載器,plugin.xml清單文件中的<run-time>元素中描述的類。
3、? 相依插件的類加載器,如果插件依賴于其它插件,在類查找時(shí),會(huì)在內(nèi)部使用一個(gè)URL類加載器。
4、? 不包括應(yīng)用程序類/系統(tǒng)CLASSPATH變量的加載器。
加載擴(kuò)展的全過程
1、? 從Eclipse平臺(tái)取得擴(kuò)展點(diǎn)。
2、? 取得以在此擴(kuò)展點(diǎn)上注冊(cè)的擴(kuò)展(實(shí)現(xiàn)IExtension接口)。
3、? 對(duì)于每個(gè)擴(kuò)展,取出其中以XML方式聲明的配置元素(實(shí)現(xiàn)IConfigurationElement接口)。
4、? 對(duì)于每個(gè)配置元素,根據(jù)該元素XML聲明中class屬性的值創(chuàng)建一個(gè)對(duì)象,確保定義的屬性完整、有效。
5、? 將新創(chuàng)建的擴(kuò)展對(duì)象保存到一個(gè)集合中,而不是直接返回一個(gè)擴(kuò)展對(duì)象。
理想的開發(fā)策略:
1、? 信心:在增加新性能或修改舊結(jié)構(gòu)時(shí),不比擔(dān)心對(duì)原代碼造成破壞。
2、? 學(xué)習(xí):快速而自信地學(xué)習(xí)Eclipse地新領(lǐng)域。
3、? 設(shè)計(jì):鼓勵(lì)自己和同事認(rèn)真考慮設(shè)計(jì),尤其是代碼地外在接口,然后去考慮如何實(shí)現(xiàn)。
測(cè)試驅(qū)動(dòng)開發(fā)(Test-Driven Development, TDD)的開發(fā)循環(huán):
1、? 編寫欲添加功能的測(cè)試。
2、? 針對(duì)這個(gè)測(cè)試引用到、暫未存在的類和方法,創(chuàng)建一段空的占用程序,使測(cè)試通過編譯。
3、? 實(shí)現(xiàn)測(cè)試,測(cè)試測(cè)試應(yīng)該失敗。
4、? 盡量對(duì)實(shí)現(xiàn)代碼加以清掃,例如去除其中的重復(fù)代碼。
插件的測(cè)試策略
?????? 從審美的角度,每個(gè)插件應(yīng)該盡可能少的依賴其它插件;從實(shí)用的角度,以測(cè)試驅(qū)動(dòng)的方式開發(fā)插件的每個(gè)部分。應(yīng)該首先創(chuàng)建測(cè)試插件,讓它依賴于新插件,以便完全用測(cè)試來驅(qū)動(dòng)新插件的開發(fā)。
工作副本(working copy)是Eclipse JDT引入的一個(gè)概念,是原有的編譯單元在內(nèi)存中的復(fù)制品。讓用戶修改時(shí),操作的實(shí)際是Java編輯器所創(chuàng)建的工作副本;當(dāng)用戶保存編譯單元時(shí),Java編輯器才把副本提交到文件系統(tǒng),此時(shí)對(duì)編譯單元的修改才會(huì)以Java元素變化增量的形式廣播出去。(JavaUI.getWorkingCopyManager())
視角,定義了(一組)視圖和編輯器的排列方式,工作臺(tái)頁面的布局,解決某個(gè)完整問題的環(huán)境。
降低插件的維護(hù)成本:良好的異常處理和錯(cuò)誤報(bào)告機(jī)制;提供聯(lián)機(jī)幫助文檔(Eclipse的help擴(kuò)展點(diǎn)的擴(kuò)展)。
分段(fragment)使開發(fā)者能夠向現(xiàn)有的插件中添加代碼和資源。(fragment.xml)
分段的用途:
1、? 為插件提供額外的字符串翻譯(語言包)。
2、? 為現(xiàn)有組件提供特定于平臺(tái)的內(nèi)容。