随笔-34  评论-1965  文章-0  trackbacks-0

通过这一年多的艰苦奋战,项目就快接近收官之战。回首过往一年的开发历程,心中不免有些感慨万千,故写下这篇BLOG总结一下经验与教训,算是兑现上一篇BLOG的诺言。

项目简介

由于一些商业上的原因,我不能透露项目的细节。不过,我可以与大家分享一下所谓的“架构”。之所以给“架构”两字加上引号,是因为我不想玷污这个神圣的词汇。在项目开始选用第三方组件(Component)时,由于种种原因,其实我只有很小选择余地,所以只能对着一些官方文档将这些组件并揍在一起。

图1 组件图
图1 组件图

经验与教训

虽然我们平时说“成功的经验,失败的教训”,但是有时要区分两者并不容易,因为有些事情虽称不上成功,却也不至于失败。故请允许我暂时将其混成一谈。

#1 分而治之(divide and conquer),重构代码

在项目中当复杂业务逻辑变得复杂时,有的程序员没有胆量去重构旧代码,而取用保守方式,拼命地添加新的代码。这样做的后果就是会导致代码量激增,难于维护。“分而治之”可以帮助我们理清复杂的业务,提高代码可重用性。所以任何时候,都不要忘记这个程序基本的方法学。

#2 尽量不要使用远程(Remote)EJB

远程EJB给我们带来很多的问题:部置的复杂性,由于网络传输引起的性能问题,EJB安全性问题等。我的同事中有些人坚持使用远程EJB的原因,他们认为只有使用远程EJB才实现群集(Cluster)。其实这想法是错误,具体可以参考《Marstering Enterprise JavaBeans》第三版中,第8章“EJB Performance Optimization”中“Choosing Between Local Interfaces and Remote Interfaces”和第19章“Clustering”。

#3 避免在程序中保存状态(State)

有的程序员偏爱全局类型变量,而忽略通过参数和返回值进行共享数据。状态对程序来说其实就是一种负担,在多线程和分布式的环境下更是如此。还有,编程的另一原则是尽量缩小变量有效范围(Scope),大家可以参考一下《Code Complete》中一些建议。

另外,要小心使用静态变量,切记要通过final关键字和Collections.unmodifiableXxxx方法(对于集合类型)使其不可变。如果需要在对象之间共享状态,可以考虑使用HttpSession或分布式的缓存如(JBoss Cache等)。

#4 如果使用Hibernate,请确保程序员了解Hibernate中持久化对象生命周期

在我身边有很程序员,在使用Hibernate时,没有花时间了解持久化对象生命周期。他们以普通JDBC的编程风格编写Hibernate程序。故出现了如下所示的代码:

    public void myDao() {
        Session session 
= getSession();
        Cat cat 
= session.load("kitty");
        cat.setName(
"Hello Kitty");
        session.saveOrUpdate(cat);
    }
列表1 代码示例

虽然上述代码功能上没有问题,但是反映了它的作者没有了解Hibernate的持久化对象生命周期。这里的session.saveOrUpdate其实是完全没必要的。如果你不明白个中原因,可以参考Hibernate的官方文档或《Hiberante In Action》的第四章“Working with persistent objects”。

#5 设计好你的业务对象模型

我看过很多项目的代码中其大量存在所谓的PO(Persistent Object)用于ORM和VO(Value Object)或称为DTO(Data Transfer Object)用于程序之间传输数据,更有甚者,这两种对象只是相差一两个属性。这样的做法的弊端是代码中充斥大量林林总总的copyXxx的方法,导致程序出现一些不可预期的行为。

其实,通过对业务对象分析,尤其是对象之间的关系建立,上述问题中的大部分都是可以避免的。

#6 不要单独使用JSF

经过这两年过JSF学习与使用,我对JSF是又爱又恨。JSF有不少优点:

  • 类似ASP.NET的事件驱动(Event-Driven)开发模型,简化了Web应用的开发;
  • 通过EL(Expression Language,表达式语言)双向值绑定,提高编程效率;
  • 基于组件(ASP.NET中称之控件)的模型,方便第三方进行扩展。

不过,同样JSF缺点也不少:

  • 保存过多的页面状态,而除了Session和Application范围之外的Managed Bean都是没有状态,这个不对称性导致很多问题。所以在很多时候迫使程序员使用Session范围的Managed Bean。而过度使用Session会加大服务器的内存消耗;
  • 蹩脚的验证框架等。

所以,在使用JSF时,我们应该结合其它优秀的框架如JBoss Seam,RichFaces等,达到互相取长补短效果。

结言

上述评论,仅代表我本人立场:-)。如有错误,还望各位朋友不吝赐教。

posted on 2008-10-25 01:20 Max 阅读(19131) 评论(28)  编辑  收藏 所属分类: 心路历程

评论:
# re: 项目总结 2008-10-25 08:23 | 大道自然
总结的不错.但有些问题即然说明了不好的地方,就要给出个好的答案.比如hibernate中的saveOrUpdate.等  回复  更多评论
  
# re: 项目总结 2008-10-25 10:45 | TiGERTiAN
@大道自然
处于Persistent状态的对象,调用saveOrUpdate是不做任何事情的  回复  更多评论
  
# re: 项目总结 2008-10-25 11:37 | live2map
我的理解是采用load方法是获取Persistent状态的对象,然后需要removeCache改版它的状态,这样用saveOrUpdate有用,save or update完了后,再put in cache,不知道我的理解对不,  回复  更多评论
  
# re: 项目总结 2008-10-25 20:27 | 久城
先支持下,不错。
第五点还想请教一下,我们项目中一直都是大量的使用DTO。
你所说的不可预期的行为是什么?有什么好的避免的办法吗?  回复  更多评论
  
# re: 项目总结 2008-10-26 12:13 | xiapir
前排  回复  更多评论
  
# re: 项目总结 2008-10-26 22:23 | 雨奏
@live2map
你没必要这样做啊:如果一个对象处于persistent状态,你更改了它,Hibernate会在flush的时候自动把它保存到数据库中的。对于缓存,Hibernate也会根据你制定的策略进行同步

@久城
个人认为如果使用了Hibernate,确实没有必要使用DTO:你把一个detach的对象当作VO或DTO就可以了嘛  回复  更多评论
  
# re: 项目总结 2008-10-27 10:20 | 西滨(Ivan Chen)
其实作者已经说清楚了“这里的session.saveOrUpdate其实是完全没必要的。“

就是可以不用写这一句,等到session结束后,Hibernate检查cat对象发生了改变,会自动更新的。  回复  更多评论
  
# re: 项目总结[未登录] 2008-10-27 13:35 | abc
@西滨(Ivan Chen)
写个seam jsf的简单入门吧!  回复  更多评论
  
# re: 项目总结[未登录] 2008-10-28 14:39 | 猪猪
经验不错,但说出了就大概解说下。  回复  更多评论
  
# re: 项目总结[未登录] 2008-11-03 15:54 | Allen
关注中!MAX,如果有机会,我有很多困惑想得到你的解答!msn:xxrrss1987@live.cn  回复  更多评论
  
# re: 项目总结 2008-11-03 19:58 | 小易
关注!  回复  更多评论
  
# re: 项目总结[未登录] 2008-11-05 21:47 | yxl
希望MAX兄弟能有更好的博文在博客中出现,期盼................  回复  更多评论
  
# re: 项目总结 2008-11-07 20:55 | yeshucheng
作者提到了session的问题,其实这里最主要是需要了解hibernate中的三种状态,这个最为主要。了解三个状态的差异区别就知道原因了,呵呵  回复  更多评论
  
# re: 项目总结 2008-11-07 20:56 | yeshucheng
题外话,感觉作者的这个项目也是一个很怪异的项目。而且感觉这个项目是在融合或者说兼容其他的项目,这种项目最头疼。  回复  更多评论
  
# re: 项目总结 2008-11-11 15:43 | fanwenda
我支持这个内容
  回复  更多评论
  
# re: 项目总结 2008-11-11 15:45 | fanwenda
我知道这个论坛很好www.bjjypw.com 希望大家都支持

我支持 www.wdjpw.com
希望大家支持  回复  更多评论
  
# re: 项目总结 2008-11-24 10:07 | thematrix
虽然看不怎么懂,但是还是要顶一下。  回复  更多评论
  
# re: 项目总结 2008-11-26 16:30 | gqs
支持作者  回复  更多评论
  
# re: 项目总结[未登录] 2008-12-09 15:17 | 三少
我觉得hibernate的saveOrUpdate最好不用,很容易出错。
做好save或者是update的判断就可以了!

JSF我觉得蛮好的,但是它自己的IOC不够强大,结合Spring就好多了!  回复  更多评论
  
# re: 项目总结 2008-12-11 10:21 | zjielove
虽然自己能力不高 有些看不懂 还是要顶 哈哈  回复  更多评论
  
# re: 项目总结 2008-12-15 09:29 | kaig
问一下你们开发了一个什么样的项目啊(告诉名称即可,好奇)?但我更希望多一点STRUTS2的交流  回复  更多评论
  
# re: 项目总结[未登录] 2008-12-25 14:24 | fungway
学习。。。  回复  更多评论
  
# re: 项目总结 2009-02-01 15:19 | tigerkin
@大道自然
把session可以close或者flush就可以自动更新  回复  更多评论
  
# re: 项目总结 2009-02-20 10:55 | Illu
希望楼主能对存在的问题提出更好的解决方案  回复  更多评论
  
# re: 项目总结 2009-03-09 15:40 | 龙华城
文章写的很不错,我正在学struts2 ,谢谢你的文章了.  回复  更多评论
  
# re: 项目总结 2009-03-19 08:11 | dealry
我想作者是想引导我们去看相关的资料,而不是在这里一一灌输给我们
非常感谢 您能把自己的经验和知识分享
  回复  更多评论
  
# re: 项目总结 2009-09-17 10:20 | tsscomcn
精典,收藏了。  回复  更多评论
  
# re: 项目总结 2010-04-28 17:26 | zisehefeng
牛人啊。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: