Realease在即,而Mock-up卻還在更新,這就是我目前的境況。要命的卻是還有一個從來沒有涉獵過的領域擺在我面前,那就是GEF,Eclilpse最復雜的框架之一。我一向推崇簡單就是美,Java搞了這么多年,但是越搞越復雜,Eclipse也是如此。最令人推崇的Eclipse開發版本還是2.1.2,相對于2.1版本,3.2簡直就是蝸牛。而我們卻要無休止緊跟著Eclipse的腳步,它走一步,我們就要前進一步。我以前甚至不屑于使用JFace,更何況這個傳說中的GEF,玩玩還可以,使用它那還不是要我的小命。
不過框架自有框架的好處,如果能夠熟練使用,可以少寫很多代碼,因此能夠使項目速成。我現在要做的是一個數據庫表索引關聯編輯器,功能其實不多,但是麻雀雖小,五臟俱全,一個完完整整地GEF應用。拖拉暫且不說,是GEF的基本應用,最麻煩的其實還是各個表初始化的布局,需要寫一個自己的布局管理器。如果要自己從頭寫而不用GEF,估計一個月怎么也夠嗆。現在采用GEF,我想半個月就差不多了,不過學習成本昂貴呀。我得承認我嚴重低估了GEF的復雜度,到目前為止,我已經研究了三四天,才剛剛能夠進行簡單應用。看書,找資料,研究框架的構架,都是扯淡,看了八進制的文章,仍舊是一頭霧水。看別人的容易,變成自己的就太難了,什么事情都還要靠自己領悟才行。
還好我是多條路并行采用了。雖然我眼下的項目可以稱得上是最復雜的GEF應用之一(源代碼打ZIP包都快30M了),但身邊能用GEF開發的高手卻屈指可數,Manager估計早就想讓我搞這個玩意了。JFace我都是速成的,現在已經很熟練了。順便說一下TreeViewer這個東西,它的顯示邏輯全部都是通過Provider來實現的。顯示的時候就會通過getChildren從上往下走,找一個節點的時候則是通過getParent從下往上走,現在就有一個問題了,如果我setInput的Model的內部邏輯和我要顯示的外部邏輯相差比較大,那么如何實現?在這兒適配器是不能工作的,因為溝通是雙方的,適配器則是單方的。如果用一個虛節點來代替Model實際上沒有的顯示邏輯,那么虛節點的兒子(一個Model實體)通過getParent是找不到那個虛節點的,它只知道自己的實體父親。封裝所有的Model也是不可取的,要不要Model干什么。我想TreeViewer碰到這樣的應用就會無能為力了。
現在說一下框架速成大法:
1、問,自然是問高手了。高手會一針見血的把問題找出來,并能告訴你框架的整體結構,通過現場演示,能夠讓你的腦子對框架有一個整體的認識,這可比看文章接受的快多了。我同事已經被我折磨了一個禮拜了。在問和解答的過程中,大家都能夠發現自己的不足,如果兩個人在一起編碼,又是一個結對編程的過程,這個時候2個人的腦子思維都會很清晰。
2、Debug,找一個和自己相近的應用。每一個框架,作者一般都會提供一些例子,而且這些例子雖然簡單,卻基本上包含了框架的方方面面。要想應用框架,最終是需要自己寫代碼的,代碼在哪兒找,就是作者的例子里找。看看例子里有多少應用是自己需要的,找到合適的地方Debug一把,一步一步地跟下去,很快你就能夠通過堆棧信息以及源碼了解應用的整個步驟,然后用Copy大法,一個自己的應用就創建出來了。
當然第二點依賴于第一點,初學者是很難尋找合適的斷點進行跟蹤,所以需要找個高手過來,讓他來跟,他演示的過程就是自己學習的過程。有了自己的第一桶金,后面的路就已經很平坦了。一個人對于未知領域的恐懼并不是怕自己不能掌握,而是不知道自己要花多長時間來掌握它。通過3天的速成,雖然對GEF的整體了解是管中窺豹,但我已經心里非常有底了。現在已經能夠把Tabel以及里面的Column畫出來,而且已經實現了布局,拖拽等基本事件,剩下需要研究的東西不會太多,夠用就行。技術這個東西,不怕不了解,就怕不會學習,很多時候,等到要用到的時候再學也不會遲,關鍵是要掌握正確的學習方法。