Live a simple life

          沉默(zhu_xing@live.cn)
          隨筆 - 48, 文章 - 0, 評論 - 132, 引用 - 0
          數(shù)據(jù)加載中……

          【Eclipse插件開發(fā)】在什么情況下創(chuàng)建擴(kuò)展點(diǎn)

                  我想絕大部分Eclipse插件開發(fā)人員對擴(kuò)展點(diǎn)這個概念應(yīng)該都比較熟悉了,那么什么時候決定創(chuàng)建自己的擴(kuò)展點(diǎn)呢?簡單的說一下俺的看法,錯了不要笑話。
                  為什么說這個問題呢?親眼看到一些插件開發(fā)剛?cè)腴T的人,不怎么懂得擴(kuò)展點(diǎn)相關(guān)的東西,也談不上理解擴(kuò)展點(diǎn)機(jī)制,所以這個時候從來不自己定義新的擴(kuò)展點(diǎn);過了一段時間之后,感覺使用Eclipse擴(kuò)展點(diǎn)有點(diǎn)經(jīng)驗(yàn)了(尤其是workbench相關(guān)的擴(kuò)展點(diǎn)肯定經(jīng)常使用),開始定義自己的擴(kuò)展點(diǎn)了,....,災(zāi)難發(fā)生了,亂定義擴(kuò)展點(diǎn),各種想法的擴(kuò)展點(diǎn)都出來了.....

                  背景知識:【Eclipse插件開發(fā)】Eclipse中的擴(kuò)展點(diǎn)機(jī)制存在的理由
                     
                  在什么情況下你才會創(chuàng)建你自己的擴(kuò)展點(diǎn)呢?一句話:允許擴(kuò)展,而且是主動邀請外部擴(kuò)展

                  在定義擴(kuò)展點(diǎn)之前,你可以試著問一下自己如下兩個問題:
                  1、從需求角度考慮,要這種需求存在嗎?
                  2、從技術(shù)視角思考,你要用擴(kuò)展點(diǎn)描述的東西是不是屬于模塊內(nèi)部的實(shí)現(xiàn)?
                  3、從技術(shù)視角思考,即使需要擴(kuò)展,真的需要動態(tài)掛入嗎?java默認(rèn)的靜態(tài)注入不可以?
                  4、從技術(shù)視角思考,你處的模塊是不是一個上層功能模塊?
              
                  關(guān)于第一點(diǎn),就去看一下需求文檔,對應(yīng)的功能點(diǎn)需求描述如何。這個時候從客戶的角度看,客戶會針對你的模塊進(jìn)行二次開放嗎,如果開發(fā),需要注冊擴(kuò)展到你的模塊嗎?

                  關(guān)于第二點(diǎn),如果你要用擴(kuò)展點(diǎn)描述的東西不是對模塊外部可見的,是屬于你模塊里面的內(nèi)部實(shí)現(xiàn),擴(kuò)展點(diǎn)肯定用不上。

                  關(guān)于第三點(diǎn),是很多新人非常容易犯的錯誤,將語言特性和平臺機(jī)制混在了一起。舉個例子,假設(shè)你定義了一個策略接口IPolicy,有個對應(yīng)的manager類型的角色在管理IPolicy實(shí)例,現(xiàn)有實(shí)現(xiàn)PolicyA、PolicyB,
           1 public class PolicyManager {
           2     private static PolicyManager manager;
           3     
           4     private List<IPolicy> policyList = new ArrayList<IPolicy>(5);
           5     
           6     /**
           7      * sinleton
           8      */
           9     private PolicyManager() {
          10         policyList.add(new PolicyA());
          11         policyList.add(new PolicyB());
          12     }
          13 
          14     public static PolicyManager getInstance() {
          15         if (manager == null)
          16             manager = new PolicyManager();
          17         
          18         return manager;
          19     }
          20     
          21     public static IPolicy[] getPolicys() {
          22         //TODO:
          23     }
          24 }
          而且你感覺以后還會有有PolicyC加入。那就加入好了,加入的時候望你的manager里面用代碼注冊一下就可以了。那可能會問,這樣不是修改代碼了嗎,如果用擴(kuò)展點(diǎn),那么不就不用修改manager的代碼了?  要記住,擴(kuò)展點(diǎn)是平臺機(jī)制,比語言特性高一個level。在這種場景下,除非你確實(shí)需要外部參與提供新的IPolicy實(shí)現(xiàn)(利用擴(kuò)展點(diǎn)動態(tài)掛入),否則就老實(shí)用java語言支持的吧。

                  關(guān)于第四點(diǎn),看一下Eclipse自身提供的擴(kuò)展點(diǎn)就知道了。Eclipse中大部分?jǐn)U展點(diǎn)基本上都是在兩中類型模塊中提供的:一是基礎(chǔ)模塊,例如runtime、resource management、workbench;二是可能需要二次定制開發(fā)的模塊,例如JDT,因?yàn)楹芏鄨鼍跋掠脩魰贘DT進(jìn)行擴(kuò)展開發(fā),往JDT中提供自己的擴(kuò)展。  如果你的模塊是一個上層的功能模塊,而且也可以肯定不會有其他模塊會依賴于它,那么怎么可能會存在擴(kuò)展點(diǎn)呢???如果你現(xiàn)在做的是一個IDE,創(chuàng)建了自己的工程類型,那么現(xiàn)有的文件類型就有可能會擴(kuò)展。你現(xiàn)在在設(shè)計一個project builder,正常的設(shè)計邏輯當(dāng)然是針對不同文件類型去調(diào)用對應(yīng)的編譯器,那這種編譯器就需要動態(tài)掛入了。例如你的針對文件的編譯器接口是IModelCompiler,那你就創(chuàng)建一個compiler擴(kuò)展點(diǎn),你現(xiàn)有的compiler實(shí)現(xiàn)也是以擴(kuò)展點(diǎn)的方式動態(tài)掛入,公平法則啊。

                  幾點(diǎn)綜合考慮吧

          本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請注明出處,謝謝!

          posted on 2008-09-04 18:14 zhuxing 閱讀(2301) 評論(1)  編輯  收藏 所屬分類: Eclipse Plug-in & OSGI

          評論

          # re: 【Eclipse插件開發(fā)】在什么情況下創(chuàng)建擴(kuò)展點(diǎn)  回復(fù)  更多評論   

          好文章,擴(kuò)展點(diǎn)更像是一個配置級別的API。
          2008-09-04 21:22 | Always BaNg.
          主站蜘蛛池模板: 昌都县| 丽水市| 北宁市| 游戏| 噶尔县| 西畴县| 福鼎市| 开阳县| 涿州市| 绍兴市| 宁陵县| 曲麻莱县| 济阳县| 和林格尔县| 健康| 乌拉特中旗| 沂水县| 益阳市| 嘉鱼县| 永福县| 昭平县| 民权县| 广饶县| 内丘县| 嵩明县| 建德市| 辽源市| 柏乡县| 芒康县| 五大连池市| 都兰县| 淮滨县| 宁晋县| 淮阳县| 黄大仙区| 嵊泗县| 成都市| 广宗县| 杭锦后旗| 阳信县| 玉树县|