论坛首页 Java企业应用论坛

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

浏览 67213 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2005-03-23  
Archie 写道
哦,那双向依赖有什么不好之处吗?

没什么不好。不过如果两个类型(包括接口)是相互依赖的关系的话,你就需要
把它们放到同一包中。
0 请登录后投票
   发表时间:2005-03-23  
partech 写道
Archie 写道
哦,那双向依赖有什么不好之处吗?

没什么不好。不过如果两个类型(包括接口)是相互依赖的关系的话,你就需要
把它们放到同一包中。


那不是要把DomainObjects放到DAO的包里了?

那业务逻辑的Package不就是依赖 DAO的package了??
0 请登录后投票
   发表时间:2005-03-23  
Archie 写道
那不是要把DomainObjects放到DAO的包里了?

那业务逻辑的Package不就是依赖 DAO的package了??

DAO的接口同DomainObject在同一个包中,
DAO的实现在另外一个包中,明白吗?
再不明白,就去阅读MartinFowler的《Patterns of Enterprise Application Architecture 》第18章Separated Interface。
0 请登录后投票
   发表时间:2005-03-23  
partech 写道
Archie 写道
那不是要把DomainObjects放到DAO的包里了?

那业务逻辑的Package不就是依赖 DAO的package了??

DAO的接口同DomainObject在同一个包中,
DAO的实现在另外一个包中,明白吗?
再不明白,就去阅读MartinFowler的《Patterns of Enterprise Application Architecture 》第18章Separated Interface。


public class CustomerFinderImpl implements ICustomerFinder 
{ 
   Customer findByCustomerCode(String customerCode); 
   { 
         Query query=this.pm.newQuery(Customer.class);; 
         query.setFilter("customerCode=="+customerCode);; 
         query.setUnique(true);; 
         return (Customer);query.execute(); 
   } 
}


这样CustomerFinderImpl 不算是依赖Customer是吧。
0 请登录后投票
   发表时间:2005-03-23  
Archie 写道
这样CustomerFinderImpl 不算是依赖Customer是吧。

算依赖Customer,不好意思,要走了。
总结一下
DomainObject需要依赖DAO的接口,反之亦然。
DAO的实现依赖DomainObject和DAO的接口。

去看书,什么都明白了。 拜拜。
0 请登录后投票
   发表时间:2005-03-24  
robbin 写道
引用
我现在的做法就是把需要多个domain object互相协作的方法放到Services里,也好做事务和权限控制。这种TransactiionScript免不了的。有点像多态,难道有了多态就不需要if语句了?只不过if语句只会出现一次,以后就都是多态了。


如果TransactionScript无法避免的话,我宁愿放弃Martin大叔的Domain Object模型,还是用我自己的那种Domain Object模型。

因为Domain Object之间的交互是无可避免的,万一某个domain object自己的业务逻辑,经过需求变更之后,现在需要其他的domain object参与协作了,那么按照你的说法,我就必须把这个业务逻辑方法从domain object挪到TransactionScript去,嘿嘿,同样无法避免我提到的两个问题,一点都没有省。

所以Martin Fowler的Domain Object也就是看起来挺好而已。


有一点觉得奇怪: 为什么domain object 相互协作就一定要移动到service呢, domain object 之间本来就是相互依赖的。还是以Order 为例子,Order 要计算他的总价,但是它可能还与Buyer对象相关,对不同的buyer有不同的 discount,(例子不再做引申,不讨论例子本身的合理性,全部语义在此):
     Class Order{
       public countPrice{
           Items  item =getItems();;     
           while (....);{
                item.getPrice();*getBuyer();.getDiscount();;
           }
        }
     
    }


如果用service+dao+*类型1*的对象该如何写?可能会非常复杂哦
0 请登录后投票
   发表时间:2005-03-24  
路过,感觉这帖子口水话太多,大家都想清楚了一次说完不好吗?
0 请登录后投票
   发表时间:2005-03-24  
DDOS的设计就是第二种的设计,用起来超级不爽,别的就不多说了。随便专家怎么说,那样用着舒服用那样,还是继续走纯po路线。
0 请登录后投票
   发表时间:2005-03-24  
frankensteinlin 写道
robbin 写道
引用
我现在的做法就是把需要多个domain object互相协作的方法放到Services里,也好做事务和权限控制。这种TransactiionScript免不了的。有点像多态,难道有了多态就不需要if语句了?只不过if语句只会出现一次,以后就都是多态了。


如果TransactionScript无法避免的话,我宁愿放弃Martin大叔的Domain Object模型,还是用我自己的那种Domain Object模型。

因为Domain Object之间的交互是无可避免的,万一某个domain object自己的业务逻辑,经过需求变更之后,现在需要其他的domain object参与协作了,那么按照你的说法,我就必须把这个业务逻辑方法从domain object挪到TransactionScript去,嘿嘿,同样无法避免我提到的两个问题,一点都没有省。

所以Martin Fowler的Domain Object也就是看起来挺好而已。


有一点觉得奇怪: 为什么domain object 相互协作就一定要移动到service呢, domain object 之间本来就是相互依赖的。还是以Order 为例子,Order 要计算他的总价,但是它可能还与Buyer对象相关,对不同的buyer有不同的 discount,(例子不再做引申,不讨论例子本身的合理性,全部语义在此):
     Class Order{
       public countPrice{
           Items  item =getItems();;     
           while (....);{
                item.getPrice();*getBuyer();.getDiscount();;
           }
        }
     
    }


如果用service+dao+*类型1*的对象该如何写?可能会非常复杂哦


这个是血小板比较多的Domain Object,而且只是涉及到Domain之间的交互,不会和什么数据库打交道的,我们有时候也会用这种小技巧,毕竟原则是死的,人是活的。不过还是还是写为getCountPrice()比较好吧,这样上层调用起来统一一些。
0 请登录后投票
   发表时间:2005-03-24  
引用
万一某个domain object自己的业务逻辑,经过需求变更之后,现在需要其他的domain object参与协作了,那么按照你的说法,我就必须把这个业务逻辑方法从domain object挪到TransactionScript去


不是把domain object中的逻辑挪到Services中去。一般来说domain object不需要改变,但是可能需要增加一个新的Services方法来协调新参与的协作。这种需求往往也是应用逻辑而不是业务逻辑。

引用
为什么domain object 相互协作就一定要移动到service呢


因为协调各个domain object 这是一个控制类的责任,不属于某个domain object 的责任。

引用
item.getPrice()*getBuyer().getDiscount();


这是非常糟糕,也是非常常见的Bad Smell!它有个名字叫“train wreck”。请注意不要与陌生人讲话原则。
0 请登录后投票
论坛首页 Java企业应用版

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