论坛首页 Java企业应用论坛

PACMAN项目中的编码反模式

浏览 1857 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-22   最后修改:2008-12-22

这一阵子正在处理一个jira issue, 不得不去抠原来的一些代码,加上原来做code review的一些条目,决定促成这篇blog文章。

以下的一些“所谓的”代码模式(或者说编码模式)都节选自PACMAN项目,但并不意味着它们仅存在于PACMAN项目中, 实际上,如果我们细心观察的话,许多地方都能发现这些似曾相识的代码模式,这段文字权当“抛砖引玉”,希望帮助大家发现并进而改进现有的或者可能存在的一些编码过程中的反模式。

Note
[Note]

实际上,这里的许多代码都可以工作,但作为一个perfectionist,某些瑕疵也是无法容忍的,或许这属于做事方式的不同,并没对错之分, 所以,以下观点仅属于个人观点,如果有有失偏颇之处,还请各位看官海涵则个...

确切的讲,这个案例不应该算是PACMAN的,PACMAN仅仅是个“受害者”。 PACMAN中用到一个组件叫做Blotter,这个Blotter可不一般,按小蒯的说法, “那简直是所有bug的根源”,小蒯用了两年这个组件当然是感同身受了,我还没咋摸清出这个blotter的习性,所以,不做太多评论,毕竟,这个组件也早就停止开发了, 挖太多的“陈谷子烂芝麻”出来也没太大意思,就挑一个第一眼看上去就印象深刻的来说吧!

Blotter说白了就是一个Swing的JTable的替代品,我不知道当时开发这个组件的Team是如何想的,或者是否真的遇到了某些问题,而必须要用一个泛泛的全局的事件管理器来管理blotter的几乎所有事件,从表格的选取到相关的一些资源释放的事件,全部使用同一个类来管理。 在Blotter中,要监听Blotter的事件,那么,用String型的key来标注事件类型,然后注册到全局的ApplicationActionManager上去:

String actionName = ...;
ApplicationActionManager.getInstance().subscribeToAction(actionListener, actionName);
				

其中, actionListener是一个ApplicationActionListener实例,在这个actionListener中,你可以根据你注册的actionName来监听自己感兴趣的事件:

public class YourActionListener implements ApplicationActionListener

    public void doAction(final String actionName, final Object obj) {
		if (StringUtils.equals(actionName, Blotter.SELECTION_ACTION)
			&& (obj == settlementViewBlotter)) {
			...
		}
		if (obj == financeViewBlotter) {
		    if (StringUtils.contains(actionName, ApplicationActionManager.VIEW_CHANGED)) {
			...
		}
    }
    
    public void subscribeToActions() {}

}
				

即使是Table相关的事件,你依然需要如此,对于TableSelection之类事件来说,在Blotter里面,简直就是“生不如死”啊,一点儿存在的价值都没有,呵呵。 有强类型的,细粒度的事件监听器不用,转而使用宽泛的没有类型安全保证的模型, 真不知道该说是进步那还是倒退那!

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics