![]() |
|
对业务流程没有很大影响的属性,象身高体重出生年月之类,最好用一个HashMap来存放,而不要直接用成员变量+getXXX/setXXX.对于ejbCreate也是一样,十几个参数的create方法,实现、维护都是代价高昂的。需知实际应用中这些字段的增减、属性变化是家常便饭,光维护get/set方法可能就会让你吐血了。但是,对于对业务流程有关建意义的字段,例如员工的入职日期决定其休假天数的计算,那么还是作为成员变量的好。
7、分清Entity bean和session bean的职责
Entity bean是实体的对象形式,它的职责应限于自身的存储,以及对外部提供访问内部数据的接口(所以我认为它本质上应该属于数据存储层)。Entity bean应该尽量避免自己实现有其他Entity bean参与的业务逻辑。例如,订单的货款收到以后,将订单的状态由“提交”变为“生效”,同时将订单的金额按照某种规则折算成该客户的积分。这个业务流程有三个对象参与:客户,订单和积分折算策略。那么,实现流程的方法应该在哪个对象中呢,是客户还是订单?都不合适,如果在订单中,那么订单对象需要了解客户积分属性的接口及积分折算的接口;如果在客户对象中也是一样。耦合度增强就意味着维护难度增大,如果用户对象的积分接口或者折算策略的接口改变了,那么改变就会蔓延到订单对象中。合适的方式是用一个OrderProcessor来管理订单处理流程,以stateless session bean来实现。OrderProcessor了解所有参与订单处理的对象的接口,它集中管理对订单的处理流程,如果流程发生变化,订单生效之前要通过审批,这种变化不会影响到参与流程的实体对象;同样,参与流程的某个对象接口发生了变化,也不会影响到其他对象。
8、重视表现层的复用
企业软件的界面,大部分都可以用一些基本元素如grid, tree, page control, form等组合而来。如果能合理采用一些技术对这些元素进行复用,不但有利于降低开发成本,而且也便于统一维护界面风格。对J2EE的表现层,也就是JSP/servlet,可以采用的复用技术不多,基本上就是文件包含、创建类库、Tag lig(本质上还是创建类库,使用起来我觉得还不一定有直接方法调用来的方便)等等。还有一些不同于JSP/servlet的表现层框架,如Apache Velocity、Enhydra、WebMacro等等,也可以参考。虽然Java还没有一个规范的、统一的HTML界面元素类库,但自己项目内部统一使用某种方案还是可能的。
另外,XML+XSLT也是一种方案。将数据直接用XML形式表现出来,绕过Entity bean,然后再用XSLT模版转化成最终界面。XML与XSLT之间属于模式匹配式的松散耦合,可以避免强类型语言方法调用带来的参数类型、个数、顺序限制,做到彻底地数据与界面分离;同时XML形式的数据集在app server中可以按照合适的方案进行缓冲,避免频繁访问数据库,抵销XSLT转换引入的性能负担。同时XML和XSLT是业界广泛采纳的标准,如果今后采用不同的体系结构(如从J2EE移植到。Net或者相反),表现层的XSLT形式的界面可以重用。JSP或ASP就没有这种可能。问题在于首先要管理关系型数据到层次型XML数据的映射,其次如果没有一个好的工具,创建、维护XSLT也是很费时费力的事情。我现在的项目正在朝这个方向努力,希望能做一个象Delphi那样好用的,基于XSLT的HTML界面控件开发、管理、使用环境。
9、充分估计开发的艰辛程度
这个,一言难尽。总之实际需求的变化往往是超乎我们想象的,要在需求分析结束的时候就清晰划分模块接口几乎做不到,计划不如变化。而J2EE体系架构是重量级的框架,虽然app server实现了很多功能,但同时也要求你开发的时候付出额外的代价。对于J2EE项目的资金、时间、人手等资源估计,宁可多不可少,千万不要简单认为用了一个weblogic就万事大吉了。
[1] [2]