【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,
關(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)綜合考慮吧
為什么說這個問題呢?親眼看到一些插件開發(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語言支持的吧。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 }
關(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