论坛首页 Java企业应用论坛

是否应该让实体类具备丰富的业务逻辑?

浏览 67204 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2005-03-23  
robbin 写道
Archie 写道
看看这个例子:


老实说,我觉得你们对第一种模型(即所谓贫血模型)理解有误,你们认为实体类就是只有getter/setter方法的数据类,这是误解。就你画出来的这个UML类图来说,即使在第一种模型中,这些方法也是必须放在实体类内部的。


我们目前项目中的做法,在实体(或许不能称之为实体,因为没有持久化,而仅仅只能称之为VO或者是DTO)中,仅仅只有getter/setter方法。
我们项目大体的架构是这样的,action->business logic->transaction->dao->db,还有form和vo,其中form对象中包括vo(方便传递数据),在action层中调用form,在后面的三层中都是通过传递vo作为参数。
在这种架构中,我们很少看到拥有除getter/setter方法之外的实体对象,我也一直对这种架构存在着怀疑态度。
请问robbin,你所说的那种实体对象的具体使用场景是怎样?能够举个例子。
谢谢!
0 请登录后投票
   发表时间:2005-03-23  
先表个态:我也是第二种模型的支持者!

引用
我会建模为一套继承体系结构的实体类,和一个业务逻辑处理类


这样很可能你会根据实体类的继承体系,配套实现一个业务逻辑处理类的继承体系。于是就出现了平行的继承体系,这是一种Bad Smell。坏处不用说了吧。

至于单一职责原则,这种贫血的实体类实际上是没有承担任何职责的,充其量就是个数据结构表示。根据我的经验,除了“参数类”外,那些只有属性没有方法的类往往都是有问题的。
0 请登录后投票
   发表时间:2005-03-23  
to Readonly:

你举的那几个例子实际都是第一种模型例子。你并没有举出第二种模型的例子。真正第二种模型的例子是这样的:

例如根据论坛删贴规则删除帖子:

public class Forum {
    private List topics;
    private ForumDao forumDao;
    private TopicDao topicDao;
    
    public deletetopics(Rule rule); {
          List deletetopics = topicDao.findTopics(forum, rule);;
          forumDao.deletetopics(deletetopics );;
    }
}


在第一种模型中,这种必须依赖DAO才能完成的逻辑行为必须放在单独的业务逻辑对象中,而第二种模型,这种业务逻辑行为也是放在实体类本身完成的。

这里唯一有点不同的地方在于,DAO是否通过IoC注入,根据上面potian的说法,他认为用Type1方式注入会比较好些,而我这里是Type3注入。
0 请登录后投票
   发表时间:2005-03-23  
引用
第一种模型的依赖关系是
business object --> DAO --> persistent object(实体类)
第二种模型的依赖关系是
domain object(including business logic) <---> DAO


我所用的第二种模型的依赖关系是
domain object(including business logic) --> IDAO <-- DAO
0 请登录后投票
   发表时间:2005-03-23  
Lee 写道
引用
第一种模型的依赖关系是
business object --> DAO --> persistent object(实体类)
第二种模型的依赖关系是
domain object(including business logic) <---> DAO


我所用的第二种模型的依赖关系是
domain object(including business logic) --> IDAO <-- DAO


的确如此,domain object(including business logic) --> IDAO <-- DAO 这才是正确的依赖关系。 IDAO 实事上 ,应该同属于业务逻辑的一部分,打包是应该和DM在一起的。
0 请登录后投票
   发表时间:2005-03-23  
七彩狼 写道
继续上面的话题,楼主的题目是“是否应该让实体类具备丰富的业务逻辑? ”。

实体是什么?

业务逻辑是什么?

这些都是很令人混淆不清的概念,到底是什么应该放入到什么之内呢?

0。实体,应该是指 EJB 或 Hibernate 下 ORMapping 与数据库ER关系图相对应的对象图,只做为数据的载体。

1。CRUD是业务逻辑吗?  不是,CRUD只不过是系统架构提供给业务实体的一种基础服务,就是是操作系统的IO一样,它不是业务。

2。复杂查询是业务逻辑吗? 是的,再自然不过了,复杂查询,所谓复杂,是有其业务含义的。但是,他应该放在实体之内吗? 不应该。就像Robbin在前一派帖子之内所提到的,象这种查询,是无状态的操作,并不会改变业务实体自身的状态或属性,所以更合适的位置,应该是 Service 或是 XXXBizObjManager 之内。

3。那倒是什么是业务逻辑呢?我无法给出准确的定义,在业务范畴之内,抛去前面两种所说的,剩下的这些,才应该是放入实体之内的业务逻辑。例如:业务校验,业务计算,业务规则等等。

通常我们的绝大多数的业务,可能抛去 1、2 之后,3 几乎就没有了,这也是为什么即使现在绝大多数都采用 实体 + Service ,而没有感觉到不爽的原因了,我想。

俺大部分同意这个分析!
需要补充的是 ,
2)不仅有复杂查询这些无状态的操作,也有改变实体属性的业务操作,然而这些操作在国内大多数项目开发中,其逻辑并不是很复杂,比如需要比较别的实体或者是体集合数据的,大不了load出来然后作为参数再传入另一个Service的method中。 这样的逻辑最复杂的也不过如此,总归可以在Service之间得以协作以找到较为方便的解决方案! 这种简便的解决问题的方案正如 ageo 一直强调的三种模式在各种情况下谁优谁劣不可比较一样。


然而,无论如何,Transaction Script模式即使如此方便,成功。 不可否认, 它的实体模型仍然是贫血的。 (不敢再说他是贫血的领域模型! 这个定义似乎很值得在商妥 推敲!)
0 请登录后投票
   发表时间:2005-03-23  
Lee 写道
引用
第一种模型的依赖关系是
business object --> DAO --> persistent object(实体类)
第二种模型的依赖关系是
domain object(including business logic) <---> DAO


我所用的第二种模型的依赖关系是
domain object(including business logic) --> IDAO <-- DAO


我上面写的DAO隐含的是: DAO Interface + DAO Impl ,就是你们所谓的IDAO + DAO(非常痛恨IDAO的命名方法,MS的命名风格)。并且你们的第二种模型依赖关系画的也是错误的,因为IDAO也需要依赖domain object,domain object和IDAO接口是双向互相依赖的关系。
0 请登录后投票
   发表时间:2005-03-23  
现在的分歧比较清楚了。第一种方式就是BO+实体类。第二种方式就只有BO。

robbin的第一个图是对的,我也是这个意思,也是省略了

第二个图有问题,BO是依赖实体类的,少画了一个依赖。
0 请登录后投票
   发表时间:2005-03-23  
吵架贴已删,请继续技术讨论
0 请登录后投票
   发表时间:2005-03-23  
真正写过这种程序的人都知道,DAO的接口和实现放在同一个包中根本不可能!否则两个包循环依赖了,先编译谁呀?
0 请登录后投票
论坛首页 Java企业应用版

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