论坛首页 Java企业应用论坛

如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件

浏览 27379 次
精华帖 (1) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-03  
不是很明白。这样就能称之为解耦?

事实上,我们在开发一个J2EE程序的时候,会有很多Assumption。比如说,我们会倾向于使用相对成熟的框架来构建我们的开发。不会轻易的由于使用的Jar包升级而直接更换Jar包。所以楼主所谓的耦合我感觉实在不在我们的讨论范围之内。

如果你真要降低耦合,并不是说你的某些类不应该继承HibernateDAOSupport,而是将Jar包的依赖降低到相对比较轻的程度从而便于单元测试,或者说将Jar包的依赖控制在某个特定的层次(例如DAO层),其他的层次诸如Service层不依赖于这些Jar包而独立存在,这样才能比较轻松地在各种实现上切换。
0 请登录后投票
   发表时间:2007-02-04  
谢谢downpour。 实际上downpour的疑问也是许多人的疑问,我的许多朋友和同事也常常跟我讨论这个问题。我认为,目前国内的软件开发可以分为几个不同的层次。

1、就是做项目,即为一个或几个特定的客户进行定制开发。这样的开发往往一旦完成就很少或者少量地需要升级。

2、当完成了一个项目以后,有的公司会努力将该软件项目推广到同行业的数家企业中。在把一个项目推广到另一个企业的时候,往往需要在许多地方进行修改和增加新的功能。

3、开发产品。公司根据市场的需要事先开发出一个通用产品,然后努力销售到数百上千家企业。这样的产品往往不断升级,整个软件周期将可能持续十多年。

4、软件开发平台。有的公司为了提高自己的软件开发速度,制作出自己的软件开发平台。在这个软件开发平台使用的数年间,该公司的所有软件项目或产品都将使用这个软件开发平台进行软件开发。

分析这4个层次,第一个层次是我们目前软件行业比较普遍的一种开发模式,它很少需要软件升级,或者升级所需要的修改量不大,因此它不怎么需要我在这篇文章中提出的方案。第二个层次也是比较常见的模式,它需要一些升级维护,但对于本文提出的方案,对于眼光比较长远的公司可能需要,但迫切程度也不是非常大。

对于第三个层次,产品开发的特点是,前期投入大,投向市场的客户群大,软件生命长,软件大规模升级的次数也多。处于这个层次的公司需要考虑的问题就比较多,眼光需要比较长远。他们需要考虑的其中一点就是,当该产品使用数年以后现在需要升级了,这个升级依然使用过去的旧技术,还是与时俱进采用目前的新技术。为了解决这个问题,他们正需要本文提出的方案。

对于第四个层次,一个平台往往需要使用数年,在这数年间将会发生数次技术更新。因此,一个公司在开发自己的平台的时候,必须要考虑技术更新的问题。可以试想,软件开发平台使用数年以后,公司要用平台开发一个新的项目了。这是难道公司因为要使用开发平台就依然沿用数年前的旧技术?他们需要软件开发平台能够经过少量的更新维护就可以应用目前流行的新技术。本文提出的方案正是解决他们的问题的方法之一。

我相信,随着中国软件业的发展和最大利润的追求,会有更多的公司采用第三、第四层次的软件开发。
0 请登录后投票
   发表时间:2007-02-08  
我们就是使用的整个系统一个DAO的方式。当时主要目的倒也不是考虑到Hibernate升级之类的问题,而是想要简化持续层的调用接口(我们的系统用.net开发,很多同事对hibernate不熟悉),最后效果还不错。还带来了些额外的好处,例如我们在DAO中加入拦截,就能在某些对象发生改变是自动触发一组相关操作。
0 请登录后投票
   发表时间:2007-02-08  
woodhead 写道
我们就是使用的整个系统一个DAO的方式。当时主要目的倒也不是考虑到Hibernate升级之类的问题,而是想要简化持续层的调用接口(我们的系统用.net开发,很多同事对hibernate不熟悉),最后效果还不错。还带来了些额外的好处,例如我们在DAO中加入拦截,就能在某些对象发生改变是自动触发一组相关操作。

现在我也在思考整个项目使用一个DAO的方式,这样可以大大简化我们的开发工作。
0 请登录后投票
   发表时间:2007-04-11  
楼主与我们现在分层的应用基本相似,业务逻辑的实现通过接口隔离,大概的流程是这样的:action---bussiness---dao---daoImpl.
0 请登录后投票
   发表时间:2007-04-26  
这个问题很容易解决,BasicDao(以及其子类们)均实现了某一个接口,DAO们需要使用到的方法在接口中定义好就行了……


不太明白 不是还都要继承吗?为什么可以解决重新编译的问题了?
0 请登录后投票
   发表时间:2007-04-27  
xchlove 写道
这个问题很容易解决,BasicDao(以及其子类们)均实现了某一个接口,DAO们需要使用到的方法在接口中定义好就行了……


不太明白 不是还都要继承吗?为什么可以解决重新编译的问题了?

在类与类的关系中,接口与实现是松耦合的,父类与子类的继承是强耦合的。在我的结构中,BasicDao与spring的HibernateDaoSupport不是直接的继承关系,而是通过DaoSupport这样一个接口,实现了解藕。实现这个解藕是我的根本目的,因为这样就使我的项目不依赖于spring了。至于DaoSupport的各个实现依然继承自HibernateDaoSupport,这已经不重要了,因为对于不同的spring版本,由于它们存在一定地差异,每个版本我都需要去给一个实现,也就是说,当更换了spring和hibernate,我需要重新编译和升级更新的只有DaoSupport的实现和相应的配置文件。
0 请登录后投票
   发表时间:2007-04-27  
看了楼主的例子,收益不少,只是有个疑问DaoSupportHibernateImp里面的query方法调用太繁琐了点,应该是对单表操作,为什么不用Criteria呢,传这么多参数容易产生接口耦合问题
0 请登录后投票
   发表时间:2007-04-27  
robinjim 写道
看了楼主的例子,收益不少,只是有个疑问DaoSupportHibernateImp里面的query方法调用太繁琐了点,应该是对单表操作,为什么不用Criteria呢,传这么多参数容易产生接口耦合问题

谢谢robinjim的提醒,这确实是个问题
0 请登录后投票
   发表时间:2007-05-15  
分析决策的第一点感觉很象桥接模式啊,不知道理解有无错误.
0 请登录后投票
论坛首页 Java企业应用版

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