我的Swing Jide WizardDialog实践个论我的Swing Jide WizardDialog实践个论--外部化,统一化, 职责化你的代
我的Swing Jide WizardDialog实践个论
我的Swing Jide WizardDialog实践个论
--外部化,统一化, 职责化你的代码
楔子
感觉好久没写技术方面的博客了,沉寂了这么久,今天正好借机疏解一下自己的“郁闷”之情。自从8月中旬加入花旗软件(大连),转眼已经快三个月了,原先的美好愿望和希冀,现在却由淡淡的“忧伤”和“郁闷”而替代,原因或许很多,也或许根本就没有啥,纯粹庸人自扰:
书稿写完了,提交给出版社之后的空虚?因为前女友家里人全员反对而分开后的郁郁寡欢?抑或是现在的工作与当初的设想大相径庭?!
道不清说不明的,反正这阵子一直是过得不快乐就是了。 其实,花旗大连这边的工作氛围是比较轻松的,应该说正是自己当时所希望的,但是,现实的情况却是,闲大法了也不好,当你已经习惯了飚车的速度感,猛然让你陷入闹市的堵车当中,应该是比较烦躁的吧?!
还记得自己当初刚进花旗软件(大连)时候的激情四射,狂啃项目组中业务相关的金融资料的情景,可是随着时间的流逝,才发现,短期内自己是多么的无助,呵呵,银行系统内部系统的庞大,又怎么可能一朝之间让你了然于心那?!现在的感觉真的只能用那句“心有余而力不足”来形容了。
当前项目组的技术架构虽然很简单,但是,前面写了两年多的codebase却着实让我无能为力,不能说代码很烂,但是,各种细节之间的纠缠却非我这刚进来的newbie所能掌控的,所以,每每有新的issue交给我处理,都是小心翼翼的,能不动之前的codebase就不动,
要知道,"失节"事小,"驾崩"事大,这可是金融系统,稍一不慎把系统搞挂掉,那可不是闹着玩的(虽然发布之前回旋余地大一些)。
不过那,不去动之前的codebase并不是说这些codebase有多好,有多容易维护,实际上,整个项目有些“挂羊头,卖狗肉”的味道,说是敏捷开发,但没有看到多少敏捷的实践;说是使用Spring框架,却让它形同虚设;说是用Hibernate做数据访问,却仅仅用它来做为调用存储过程的中间层,只用了调用存储过程后能够帮助你将结果映射到结果对象这一点点功能,个人感觉就是Hibernate在这里真的是“生不逢时”…
当然啦,我今天可不是要为了挑刺儿,毕竟任何项目都会存在这样那样的问题嘛,我今天要说的,只不过是从一个小小的功能点引申出来的代码实践而已,下面让我们进入正题…
Jide简介 或许做Swing的各位同仁对jidesoft(http://www.jidesoft.com/)所提供的产品早就有所耳闻,也或许没有,总之俺是进花旗这个项目组之后才知道有这么一个产品(其实,从身边许多人那里都可以了解到,许多金融相关产品的客户端使用swing做的),你可以鄙视我,谁让俺之前只做过两年左右的swt/jface而没有用swing那,呵呵。
应该说,jide提供的产品还是比较强大的,不过,商业产品,应该不是谁都愿意花这份儿银子吧!jide在原有swing基础上给出了多种扩展,包括dockable framework, action framework,dialogs,data grid/pivot table等等,我们今天要扯的话题与jide提供的WizardDialog有关,所以,就在这里对jide简单提及一下,希望没有说太多废话。
现有codebase中的WizardDialog代码实践 话说我们要为用户提供接口,分多步从用户那里获取输入数据,这种情况下,为用户提供一个向导式的输入界面应该说是比较自然的事情,现在,就有这样的一个场景,所以,我们决定使用jide提供的WizardDialog来实现之。
《JIDE Dialogs Developer Guide》虽然对WizardDialog相关的各个类以及功能做了介绍,但是,如何在开发过程中使用它们,就得由我们来决定了,这自然就会引出不同的实践方式,下面是我从现有的codebase中移植过来的代码片段原型,我称之为“内部化”的代码实践(代码风格如何暂且不论)。
首先,XAction类是一个标准的Swing Action,其定义如下:
public class XAction extends AbstractAction {private WizardDialogLauncher launcher;public void actionPerformed(ActionEvent arg0) {PagesModel model = new PagesModel();model.setX(..);...PageList pageList = new PageList();pageList.append(new YourPageOne(model));pageList.append(new YourPageTwo(model));...Runnable finishAction = new YourFinishAction(model);launcher.launch(pageList, finishAction);}// getters and setters}
显然,如果有新的WizardDialog需求,我们所要做的,无非就是像如上代码所示,提供相应的Page实现和对应的FinishAction实现即可。
重构的过程其实很简单,最主要在于,即使你不能使用Spring或者Guice之类的IoC容器或者框架,那也不应该放弃“外部化你的依赖管理”,没有框架的支持,不应该成为你不去编写可复用性,可测试性,可维护性良好的代码的借口。
小结以旁观者的角度去观察,设计和实现你的代码逻辑,这将使你更加专注于明确各个实现类的职责,而不会被来自不同“地区”的依赖打乱“战局”。大家都知道,做同样一件事情有很多种方式,但是,总有更好的方式,如果你是一个追求完美的人,那即使没有任何的理论和设计模式之类的指导,你也同样可以写出令人赏心悦目地代码,因为,那是艺术,而你就是拥有艺术气质的那种人!
(感觉说的有些乱,各位看官讲究着看吧,只不过实在无聊,书写一些文字而已。拍砖都可以,别骂人就行)
1 楼 newday1 2009-11-29 楼主我是个JAVA swing的爱好者,很早就想使用他写程序感觉很漂亮,我给他们公司发邮件希望他们提供给我一个个人学习版。。被婉拒了,楼主能否给我一份类库,满足学生学习的愿望谢谢, wadamolyf@gmail.com 2 楼 fujohnwang 2009-11-30 不好意思,我没有这个东西,只是工作上公司买的lisence, 我现在已经不用它了, 只是为了演示一些code的best practice而已, 类库是什么在这里却不是紧要的。 3 楼 baicongjiang 2010-03-15 请问您是谁?我也是花旗大连的,最近要用到jide,希望能在您方便的时候交流一下。