论坛首页 Java企业应用论坛

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

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

既然你也建议应该把forumDAO.update放到一个xxxManager里面去做,那么实际上我们的观点是一致的,你实际上主张的也是我主张的第一种模型,你想明白没有?


不太一样,我只是吧update这种持久化的操作放到XXManager里边去了。但是delete的逻辑还是在Forum里边。
0 请登录后投票
   发表时间:2005-03-23  
Lee 写道
引用
把forumDAO.update放到一个xxxManager里面去

这个xxxManager是工具类吗?


应该不算是工具类,是个业务类,比如叫做论坛管理器。
0 请登录后投票
   发表时间:2005-03-23  
Archie 写道
robbin 写道
Archie 写道
首先明确:第二种不是robbin画的那样,而是这样的:


你这个图里面的object,string都是些什么东西,看不懂,给解释解释。


就是DAO不依赖与Domain Objects

DAO.update(Object obj);
DAO.save(Object obj);
DAO.delete(Class clazz,Object obj);


那你这些obj是什么呢?还不是只有getter/setter的数据类? 这样的话,更加是贫血的了。
0 请登录后投票
   发表时间:2005-03-23  
robbin 写道
Archie 写道
robbin 写道
Archie 写道
首先明确:第二种不是robbin画的那样,而是这样的:


你这个图里面的object,string都是些什么东西,看不懂,给解释解释。


就是DAO不依赖与Domain Objects

DAO.update(Object obj);
DAO.save(Object obj);
DAO.delete(Class clazz,Object obj);


那你这些obj是什么呢?还不是只有getter/setter的数据类? 这样的话,更加是贫血的了。


这不叫依赖Domain Object吧。DAO只是依赖Object而已。而且这些Object是具有业务逻辑的,只不过在DAO里不会使用到,在业务层才会被用到。DAO里边不会有类型转换的。
0 请登录后投票
   发表时间:2005-03-23  
to Archie: 我觉得你的模型并不是我上面讲的第二种模型,也不是Marin Fowler讲的domain object。或者我们可以叫它第三种模型,建议你给出一个该模型完整的案例代码,否则大家的讨论仍然是各讲各的,不是再说一回事。

而且你的模型我感觉有很多问题,例如domain object的状态和你所谓的object,string这些东西是什么关系等等。所以还是写出来代码再讨论吧。
0 请登录后投票
   发表时间:2005-03-23  
CRUD是业务逻辑吗?我觉得不是。
CRUD应该在业务逻辑中吗?我觉得不应该。
CRUD应该出现在DM中吗?我也觉得不应该。

以下的观点,纯粹是自己的思考,没有实践,也没有大师的理论,希望能够得到大家的指正。

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 );; 
    } 
} 

public class Forum { 
    private List topics; 
    private ForumDao forumDao; 
    private TopicDao topicDao; 
    
    public deletetopics(Rule rule); { 
          ... 
          如果这个topics符合删除逻辑 
          this.topics.remove(xxx);; 
          ... 
          forumDao.update(this);; 
    } 
} 
Interface ForumDAO 
{ 
   update(Object obj);; 
} 


上面的两段代码,并没有本质上的区别。不过可以看出第二段代码的一些思路,对其进一步改进,可以得到如下代码。

public class ForumTransactionScript {
    private ForumDAO forumDao;

    public deletetopics(Forum forum, Rule rule); { 
	      forum.deletetopics(rule);;
		  forumDao.update(forum);;
    } 
}

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

Interface ForumDAO 
{ 
   update(Object obj);; 
} 

上面这段代码中, Forum 是一个纯粹的DomainModel , 所以说它纯粹,是因为他没有涉及到I/O操作。
ForumTransactionScript 这个新加的类,表名了一种业务上的一种事务操作。为什么是 Transaction Script ,对于业务建模采用 Domain Model 是适合的,但对于具体某一事务性业务,用Transaction Script是最合适的。也就是说即使我们采用DomainModel,Transaction Script也是不可避免的,只不过Transaction Script表示一种粗粒度的业务过程调用。
0 请登录后投票
   发表时间:2005-03-23  
robbin 写道
to Archie: 我觉得你的模型并不是我上面讲的第二种模型,也不是Marin Fowler讲的domain object。或者我们可以叫它第三种模型,建议你给出一个该模型完整的案例代码,否则大家的讨论仍然是各讲各的,不是再说一回事。


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

很高兴看到你这个帖子里面阐述的观点,我想说的是,其实经过你修改后的这段代码就是我一直主张的第一种模型。在这里Forum这个实体类他是可以也应该带有逻辑的,但是他带有的逻辑应该是有状态的,不依赖持久化的逻辑。那些无状态的,依赖持久化的逻辑则分离到业务逻辑对象中去(就是你例子中的ForumTransactionScript,专业一点的命名就是xxxManager)
0 请登录后投票
   发表时间:2005-03-23  
动物园的猪 写道
一个业务系统而言,什么是最重要的,就是业务,我们在各种书中看到的都是业务的建模,业务的建模和技术无关的,我们使用OOA的方式,分析业务的概念模型,进行所谓的领域模型分析,这些都是业务范畴的,和技术无关。

然后有了领域模型后,领域模型是一个静态的视图,他只是表明实体,属性和关联,而领域模型的行为,往往要到向具体技术映射的时候,在详细的考虑,

这就到了设计的阶段,设计阶段,我们说白了是在干什么?是在使用java语言进行领域建模的深化,POJO也好,ebj也好,都是手段,只是想把我们抽象出来的
领域模型技术化。

我们明确这个过程后,我们就明白多了,业务建模是最先要做的东西,到了后期,我们才突然想起,噢!我们需要进行业务的数据的存储,然后我们想到了o-r映射。

所以,技术实现的领域模型,应该是一个相对独立的东西,他的目标是表达业务的领域模型。

有了这个领域模型后,我们考虑序列化了,我的想法呢,就这样。

持久层需要有专门的PO(persistence object),我把我的领域模型,通过一层(叫DataMapping),把她导成PO的关系,在DAO中,最终完成数据的存取。

也就是说,领域模型不应该意识到什么叫做持久化,而持久化层,也不知道领域模型,双方靠一个映射层(DataMapping),完成转化。


领域模型并没有被直接序列化,也不应该直接被序列化,而是经过了一个转化。

当然,这只是一个思路,这个思路强调的是关注业务,然后是技术。

当然,这个思路也是看书看来的,并没有在复杂的业务系统中实践过,说出来供大家参考。

为什么一定要多一个映射层呢? 为什么要有一个只代表底层数据的PO呢?既然领域模型的实现需要到POJO的属性数据,为什么一定要把本属于领域模型的数据分离到POJO上呢?中间还要加入一层 Mapping?  为什么不能赋予 领域模型可持久化的行为呢? 虽然三层模型那么流行,但是并不表明只要分层就是好的!

在设计具体的领域模型实现时,我们为什么不能赋予他可持久化的行为呢?
0 请登录后投票
   发表时间:2005-03-23  
Archie 写道
robbin 写道
to Archie: 我觉得你的模型并不是我上面讲的第二种模型,也不是Marin Fowler讲的domain object。或者我们可以叫它第三种模型,建议你给出一个该模型完整的案例代码,否则大家的讨论仍然是各讲各的,不是再说一回事。


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


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

另外我还是看不懂你那个图要表达什么,还是给代码吧。
0 请登录后投票
论坛首页 Java企业应用版

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