1. 程式人生 > >基於Eclipse的開發初識(一)

基於Eclipse的開發初識(一)

  最近做基於Eclipse的開發,寫寫對基於Eclipse的開發一些體會。以前一直在用Eclipse,感覺到外掛機制的強大和靈活性,但一直沒有接觸到Eclipse的開發。現在寫程式碼基本上模仿+現學現賣,Eclipse Plugin開發首先就應該學會模仿(我老大常說的一句Monkey see monkey do,《Contributing to Eclipse》的一條rule),因為Eclipse除了Run-time Kernal外都是外掛(Everything is a contribution),所以要習慣從已有的contributions來學習,許多時候我們要讀Eclipse的原始碼,其實讀原始碼是學習的一個很好的途徑,事實上Eclipse靈活的設計凝聚了設計模式大師Erich Gamma的許多優秀的模式思想(看過Erich Gamma作品《設計模式-可複用的軟體基礎》和JUnit程式碼的人都為模式帶來的靈活和優美感到震驚,Eclipse同樣也是)。        

     Eclipse開發的基礎是SWT和JFace,SWT/JFace是和awt/swing對應的東東,其實熟悉awt/swing開發的人很容易過度到SWT/JFace的開發,事件機制,UI組建、佈局管理器也基本類似,SWT使用UI元件提供了更一致的程式設計風格(建構函式都是是parent,style,不需要顯式的新增,一種更方便的Composite模式的構建樹形結構的方式),SWT的事件機制底層是直接對Windows事件機制的一種封裝(windows下版本而言),熟悉Windows程式設計的,很容易理解他的事件機制,這也是和Swing的區別,SWT中的非UI執行緒是不能夠訪問UI執行緒的資源的,需要使用 asyncExec,syncExec,timerExec方法開闢一個執行緒,這個執行緒交給UI執行緒來呼叫,而Swing提供了一種更直觀的程式設計模型,非有UI執行緒可以訪問直接UI執行緒的。SWT的佈局管理器一般通過Layout來定義結構,用layoutData來定義元件的大小,可擴充套件方式等。JFace實際上是構建在SWT基礎之上的粒度更大的,更具有MVC的UI元件。JFace 使用LabelProvider和ContentProvider將模型介面適配成Viwer可以呈現的方式,從而Model和UI的到了徹底的分離。Model和UI分離,Model不被UI所汙染是所有UI設計都需要遵循的,Eclipse更是如此。      

       Eclipse使用了大量的設計模式,核心模式Extension Object/Extension Interface,讓Eclipse在保持API穩定的情況下,能夠新增新的介面。Extension Object要達到的效果是:(1)向已有的服務介面新增型別而又不暴露它(2)向已有的型別新增行為。其實現方式是向已有的物件註冊支援的型別,使用者可以query到已註冊的型別,就像這個類動態的繼承了一個介面,支援一個新的介面一樣,“可以在執行時新增為一個物件新增介面”。這和COM元件的核心思想一樣的。記得Bob大叔在《敏捷開發原則、模式、實踐》這本書上就指出了可擴充套件的幾個設計模式:Visitor、Decorator和 Extension Object模式。Visitor是在不改變原來結點類的情況下為結點新增行為、Decorator模式是可以在執行時為物件新增行為。Adapter模式也是Eclipse裡面用的比較多的,像前面說的LabelProvider和ContentProvider.Proxy模式是Eclipse Lazy load的核心,Lazy load的實現一般是一個虛擬代理,常常為了效率而使用它(如Hibernate 的Lazy load)。Poxy有很多種,還有如遠端代理等,Poxy的目的主要是控制對一個物件的訪問,提供安全控制,遮蔽底層細節。    Eclipse plugin開發、EMF、GMF待續。