我想絕大部分Eclipse插件開(kāi)發(fā)人員對(duì)擴(kuò)展點(diǎn)這個(gè)概念應(yīng)該都比較熟悉了,那么什么時(shí)候決定創(chuàng)建自己的擴(kuò)展點(diǎn)呢?簡(jiǎn)單的說(shuō)一下俺的看法,錯(cuò)了不要笑話。
為什么說(shuō)這個(gè)問(wèn)題呢?親眼看到一些插件開(kāi)發(fā)剛?cè)腴T的人,不怎么懂得擴(kuò)展點(diǎn)相關(guān)的東西,也談不上理解擴(kuò)展點(diǎn)機(jī)制,所以這個(gè)時(shí)候從來(lái)不自己定義新的擴(kuò)展點(diǎn);過(guò)了一段時(shí)間之后,感覺(jué)使用Eclipse擴(kuò)展點(diǎn)有點(diǎn)經(jīng)驗(yàn)了(尤其是workbench相關(guān)的擴(kuò)展點(diǎn)肯定經(jīng)常使用),開(kāi)始定義自己的擴(kuò)展點(diǎn)了,....,災(zāi)難發(fā)生了,亂定義擴(kuò)展點(diǎn),各種想法的擴(kuò)展點(diǎn)都出來(lái)了.....
背景知識(shí):
【Eclipse插件開(kāi)發(fā)】Eclipse中的擴(kuò)展點(diǎn)機(jī)制存在的理由
在什么情況下你才會(huì)創(chuàng)建你自己的擴(kuò)展點(diǎn)呢?一句話:允許擴(kuò)展,而且是主動(dòng)邀請(qǐng)外部擴(kuò)展。
在定義擴(kuò)展點(diǎn)之前,你可以試著問(wèn)一下自己如下兩個(gè)問(wèn)題:
1、從需求角度考慮,要這種需求存在嗎?
2、從技術(shù)視角思考,你要用擴(kuò)展點(diǎn)描述的東西是不是屬于模塊內(nèi)部的實(shí)現(xiàn)?
3、從技術(shù)視角思考,即使需要擴(kuò)展,真的需要?jiǎng)討B(tài)掛入嗎?java默認(rèn)的靜態(tài)注入不可以?
4、從技術(shù)視角思考,你處的模塊是不是一個(gè)上層功能模塊?
關(guān)于第一點(diǎn),就去看一下需求文檔,對(duì)應(yīng)的功能點(diǎn)需求描述如何。這個(gè)時(shí)候從客戶的角度看,客戶會(huì)針對(duì)你的模塊進(jìn)行二次開(kāi)放嗎,如果開(kāi)發(fā),需要注冊(cè)擴(kuò)展到你的模塊嗎?
關(guān)于第二點(diǎn),如果你要用擴(kuò)展點(diǎn)描述的東西不是對(duì)模塊外部可見(jiàn)的,是屬于你模塊里面的內(nèi)部實(shí)現(xiàn),擴(kuò)展點(diǎn)肯定用不上。
關(guān)于第三點(diǎn),是很多新人非常容易犯的錯(cuò)誤,將語(yǔ)言特性和平臺(tái)機(jī)制混在了一起。舉個(gè)例子,假設(shè)你定義了一個(gè)策略接口IPolicy,有個(gè)對(duì)應(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 }
而且你感覺(jué)以后還會(huì)有有PolicyC加入。那就加入好了,加入的時(shí)候望你的manager里面用代碼注冊(cè)一下就可以了。那可能會(huì)問(wèn),這樣不是修改代碼了嗎,如果用擴(kuò)展點(diǎn),那么不就不用修改manager的代碼了? 要記住,擴(kuò)展點(diǎn)是平臺(tái)機(jī)制,比語(yǔ)言特性高一個(gè)level。在這種場(chǎng)景下,除非你確實(shí)需要外部參與提供新的IPolicy實(shí)現(xiàn)(利用擴(kuò)展點(diǎn)動(dòng)態(tài)掛入),否則就老實(shí)用java語(yǔ)言支持的吧。
關(guān)于第四點(diǎn),看一下Eclipse自身提供的擴(kuò)展點(diǎn)就知道了。Eclipse中大部分?jǐn)U展點(diǎn)基本上都是在兩中類型模塊中提供的:一是基礎(chǔ)模塊,例如runtime、resource management、workbench;二是可能需要二次定制開(kāi)發(fā)的模塊,例如JDT,因?yàn)楹芏鄨?chǎng)景下用戶會(huì)基于JDT進(jìn)行擴(kuò)展開(kāi)發(fā),往JDT中提供自己的擴(kuò)展。 如果你的模塊是一個(gè)上層的功能模塊,而且也可以肯定不會(huì)有其他模塊會(huì)依賴于它,那么怎么可能會(huì)存在擴(kuò)展點(diǎn)呢???如果你現(xiàn)在做的是一個(gè)IDE,創(chuàng)建了自己的工程類型,那么現(xiàn)有的文件類型就有可能會(huì)擴(kuò)展。你現(xiàn)在在設(shè)計(jì)一個(gè)project builder,正常的設(shè)計(jì)邏輯當(dāng)然是針對(duì)不同文件類型去調(diào)用對(duì)應(yīng)的編譯器,那這種編譯器就需要?jiǎng)討B(tài)掛入了。例如你的針對(duì)文件的編譯器接口是IModelCompiler,那你就創(chuàng)建一個(gè)compiler擴(kuò)展點(diǎn),你現(xiàn)有的compiler實(shí)現(xiàn)也是以擴(kuò)展點(diǎn)的方式動(dòng)態(tài)掛入,公平法則啊。
幾點(diǎn)綜合考慮吧
本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請(qǐng)注明出處,謝謝!