论坛首页 Java企业应用论坛

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

浏览 67250 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2005-03-23  
robbin 写道
Archie 写道
robbin 写道
to Archie: 我觉得你的模型并不是我上面讲的第二种模型,也不是Marin Fowler讲的domain object。或者我们可以叫它第三种模型,建议你给出一个该模型完整的案例代码,否则大家的讨论仍然是各讲各的,不是再说一回事。


很抱歉为了直观起见,引入了Martin Fowler网站上的一张图。
我想我和这种方式的区别可能就是上个forumDAO.update()放在forum里边还是单独拿出来搞个XXXManager。也就是什么时候持久化,由对象自己决定还是由他的管理者来决定。
如果事务控制使用容器控制,或者使用类似spring的框架,现在觉得倒是由对象自己决定持久化的时机比较好(当然是委托给DAO去做)。这样的化管理者的逻辑更清楚,我就是让你删掉符合规则的帖子!
业务逻辑不管对象保存在哪里,也不关心数据库是什么东西,在管理者的眼里没有数据库。


至于持久化方法是否要放在domain object中这已经不需要再讨论了,肯定是应该剥离出去的,前面帖子中已经非常详细讨论过这个问题了,如果再要讨论这个问题,还是另开帖子讨论,这里不要跑题了。

另外我还是看不懂你那个图要表达什么,还是给代码吧。


我的想法是和七彩狼一样的,那个图换成Forum的代码就是这个:
public class Forum { 
    private List topics; 
    private ForumDao forumDao; 
    private TopicDao topicDao; 
    
    public deletetopics(Rule rule); { 
          ... 
          如果这个topics符合删除逻辑 
          this.topics.remove(xxx);; 
          ... 
          forumDao.update(this);; 
    } 
} 


如果持久化操作与Domain Object分离是统一意见的话,这就没什么好讨论的了。开个贴讨论一下不分离的情况。
0 请登录后投票
   发表时间:2005-03-23  
好了,问题争论的焦点终于浮现出来了:

第一种模型的观点是 forumDao.update(...)应该独立出去,不应该放在Forum里面,而应该写到ForumManager中去。

第二种模型的观点是 forumDao.update(...)不应该独立出去,而应该直接放在Forum里面。

好了,针对forumDao.update(...)这个方法调用究竟应该放在Forum里面,还是应该分离出去放在ForumManager里面,大家展开论述吧。
0 请登录后投票
   发表时间:2005-03-23  
七彩狼 写道
ForumTransactionScript 这个新加的类,表名了一种业务上的一种事务操作。为什么是 Transaction Script ,对于业务建模采用 Domain Model 是适合的,但对于具体某一事务性业务,用Transaction Script是最合适的。也就是说即使我们采用DomainModel,Transaction Script也是不可避免的,只不过Transaction Script表示一种粗粒度的业务过程调用。

你添加的这个类,我认为是属于Service层的东西,虽然它的名字叫TransactionScript。
0 请登录后投票
   发表时间:2005-03-23  
robbin 写道
好了,问题争论的焦点终于浮现出来了:

第一种模型的观点是 forumDao.update(...)应该独立出去,不应该放在Forum里面,而应该写到ForumManager中去。

第二种模型的观点是 forumDao.update(...)不应该独立出去,而应该直接放在Forum里面。

好了,针对forumDao.update(...)这个方法调用究竟应该放在Forum里面,还是应该分离出去放在ForumManager里面,大家展开论述吧。

呵呵,第二种模型不是你说的这样的。关于提交的操作是由Service层来控制的。
0 请登录后投票
   发表时间:2005-03-23  
To partech:

不管叫做service也好,叫做manager也罢,还是叫做transactionscript也行,随你怎么叫好了。但是请你不要跑题了,我们现在观点争论的焦点就是在这个删除帖子的行为中,forumDao.update(...)放在哪里?放在Forum里面,还是放在Forum外面,你现在只要告诉大家你选择1还是2,并且阐明你的理由,就OK了。
0 请登录后投票
   发表时间:2005-03-23  
partech 写道
robbin 写道
好了,问题争论的焦点终于浮现出来了:

第一种模型的观点是 forumDao.update(...)应该独立出去,不应该放在Forum里面,而应该写到ForumManager中去。

第二种模型的观点是 forumDao.update(...)不应该独立出去,而应该直接放在Forum里面。

好了,针对forumDao.update(...)这个方法调用究竟应该放在Forum里面,还是应该分离出去放在ForumManager里面,大家展开论述吧。

呵呵,第二种模型不是你说的这样的。关于提交的操作是由Service层来控制的。


呵呵,是啊,我晕了,第二种模型显然是行不通的呀。不过我还是没看懂那张图里边Porduct指向数据库是啥意思?
0 请登录后投票
   发表时间:2005-03-23  
public class ForumService implements IForumService extends Service
{

    //这是一种简单的实现
    public deletetopics(String forumID);
    {
	   Init();;

           Forum forum = ForumRepository.findByID(forumID);;   
           Rule rule = new Rule();;
	   forum.deletetopics(rule);;
           
	   commit();;
    }
}

public class Forum {
    private List topics;
   
    public deletetopics(Rule rule); {
          ...
          如果这个topics符合删除逻辑
          this.topics.remove(xxx);;  // 这个才是业务逻辑。对数据库的读写不是业务逻辑,而是系统架构的I/O操作。
    }
}
public class Service
{
  ...
  protected void init();
  {
    ...
    Session.init();;
    ...
  }

  protected void commit();
  {
    ...
    Session.commit();;
    ...
  }
  ...
}
public class Session
{
  static public void commit();
  {
   ...
  	Session.instance();.unitOfWork.commit();;  
   ...
  }
}
0 请登录后投票
   发表时间:2005-03-23  
好好,为了避免各种术语的争执,为了避免没完没了的纠缠,我们现在也不要谈什么第几种模型了,大家都亮代码出来,OK?

前面七彩郎同学已经把两套不同的代码对比列了出来,这两套代码唯一的不同就是在deleteTopics这个方法中要不要写forumDao.upate(...)。

我的主张,forumDao.upate(...)不应该写在Forum的deleteTopics()里面,Archie主张forumDao.update(...)应该写在Forum的deleteTopics()里面,

请其他诸位同学做出你的投票,如果你的代码和他们都不一样,请亮出你们的代码。
0 请登录后投票
   发表时间:2005-03-23  
partech 写道
public class ForumService implements IForumService extends Service
{

    //这是一种简单的实现
    public deletetopics(String forumID);
    {
	   Init();;

           Forum forum = ForumRepository.findByID(forumID);;   
           Rule rule = new Rule();;
	   forum.deletetopics(rule);;
           
	   commit();;
    }
}

public class Forum {
    private List topics;
   
    public deletetopics(Rule rule); {
          ...
          如果这个topics符合删除逻辑
          this.topics.remove(xxx);;  // 这个才是业务逻辑。对数据库的读写不是业务逻辑,而是系统架构的I/O操作。
    }
}


这应该是Service指向数据库而不是Forum啊
0 请登录后投票
   发表时间:2005-03-23  
我来做个阶段性的小结吧。

我们的问题是:“问题的本质就是是否应该让实体类具备丰富的业务逻辑语义 ”

名词解释:

(纯粹的)实体类:只含有数据载体的Getter&&Setter方法,也是我们目前用的最普遍的形式。
带业务逻辑的实体类:这个词,我不知道大家都是怎样理解的,从上面的帖子来看,可能大家就把它当成领域模型来对待好了。也就是说和领域模型是等价的。
领域模型:基于业务建模建立起对象模型,除自身数据属性外,还包含具体的业务逻辑。

业务逻辑:-- CRUD逻辑 (虽然我不认为它是业务逻辑,但我还是将其列在这里)
          -- 复杂查询逻辑
  -- 业务逻辑A - 独立
  -- 业务逻辑B - 依赖 复杂查询逻辑
  -- 业务逻辑C - 依赖 CRUD逻辑
  -- 业务逻辑D - 依赖 CRUD逻辑 && 复杂查询逻辑

对于不同的业务逻辑,我们应该怎样的处理:

CRUD逻辑 -- 系统架构提供统一的CRUD方法(象Hibernate),做为系统IO的基础。
复杂查询逻辑    -- 放在 XXXRepository,做为一种业务服务。
业务逻辑A -- 这应该是大家公认的应该可以放进领域模型之内的业务逻辑,是领域模型的完美体现。
业务逻辑B       -- 目前暂没有深入地讨论到,个人观点,应该是有业务容器,将上面提到的 XXXRepository注射进来,供领域模型所使用的。
业务逻辑C -- 目前正在激烈讨论中。个人观点,目前 partech 的代码,是最接近我想法的。
业务逻辑D       -- 上面 B&C 的组合,就不多说了。
0 请登录后投票
论坛首页 Java企业应用版

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