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画出来,而且已经实现了布局,拖拽等基本事件,剩下需要研究的东西不会太多,够用就行。技术这个东西,不怕不了解,就怕不会学习,很多时候,等到要用到的时候再学也不会迟,关键是要掌握正确的学习方法。