论坛首页 Java企业应用论坛

Domain Object贫血vs富血(DDD)和spring roo到ruby的扯淡

浏览 42325 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-04-17  
我一直有个疑惑,既然是用“贫血模型”那还要什么面向对象的语言。贫血模型和数据结构+函数有什么本质区别么?
0 请登录后投票
   发表时间:2011-04-17   最后修改:2011-04-17
ppgunjack 写道
错误的领域模型对项目的危害非常之大,而实现一个好的领域模型非常困难。
当业务变得复杂时,领域模型显出巨大的优势

这两句不矛盾吗?

见过的电信标准亲一色都是数据service分离 ,各种各样的manager协调着各方数据
Unix管道的设计哲学是富血还是贫血,面向过程还是面向对象

多少人会把应该写成Add(a,b)的写成a.add(b)
以前写过电信设备inventory系统,得到的体会就是尽量把数据和处理分离,对象当成操作数,而不是操作的主体调用者,除非是它自己的吃喝拉撒,很多方法最早在域对象,后面都被移出去,做了很多无用功,最后的代码越来越接近标准接口的风格
在对象当中加方法太危险,用的时候很开心很方便,当方觉模型出问题的时候很揪心,尤其是被继承 扩散后
看到很多牛人的blog都是倾向c而不是c++来重新构建他们的系统,而且还不是因为性能
框架永远解决的是繁琐而简单的问题,最好让他们止于粘合层,能解决复杂问题的东西叫做产品

1.矛盾的那句话是别人说的,我并没有实践过DDD.
2.确实,我相信国内的大多数的javaee应用,都是贫血模型驱动的。我也做过不少电信行业的项目,基本上是你说的情况。但是吃喝拉撒放在一起的情况也很少见呀。
3.因为贫血模型不是那么OO,不好复用Domain逻辑,所以有人批呀。如:
Martin Flowler批贫血的文章:AnemicDomainModel
http://martinfowler.com/bliki/AnemicDomainModel.html
4.而且现在确实也有人在实践DDD,成效怎样并不知道。能看到有人现身说法就好了。
0 请登录后投票
   发表时间:2011-04-17  
lzyzizi 写道
我一直有个疑惑,既然是用“贫血模型”那还要什么面向对象的语言。贫血模型和数据结构+函数有什么本质区别么?

虽然贫血模型把数据(domain)和方法(放在Service层)分开,有违OO的封装的原则,但OO还有很多其它的特性和原则,还有设计模式等。所以用Java这种80%的OO语言,也没什么大不了吧。更何况还有j2ee without ebj的盛行,和hibernate这些o/r mapping的框架,有pojo,在国内外java盛行也正常了。虽然现在java有很多人垢病,但还是我们赖以生存的谋手生段。
0 请登录后投票
   发表时间:2011-04-17  
无语中,已经变成一场否定OO的讨论了
0 请登录后投票
   发表时间:2011-04-17  
yangyi 写道
无语中,已经变成一场否定OO的讨论了

为什么有这样的感想?虽然我大多数时间都在用贫血的东西。但DDD,应该是更OO才对吧?
0 请登录后投票
   发表时间:2011-04-17  
yangyi 写道
除非能够抛弃关系型数据库,否则对此不抱乐观。ORM从某种程度上说,并没有取得成功,OO的视角是流转的数据,而DB的视角是数据的流转,这种矛盾从架构上是不可调和的。除非能够在业务系统中淡化数据库的角色(隔离它),或者干脆用新的持久化方法(取代它)。原因还是和上面说的一样,数据库的访问方式决定了它的侵入性。

ORM不就是隔离DB的手段嘛。ORM本身就是来调合这些东西的,所以有hibernate的盛行。ORM至少从多年应用来看,还是算成功的。我想现在,甚至几年前的DDD实践者应该都用的是关系数据库吧。面向OO对象的DB,要盛行应该不会是10年之内的事。
0 请登录后投票
   发表时间:2011-04-17  
把数据(domain)和方法(放在Service层)分开,有违OO的封装的原则
不能一概而论,这要考虑A contact B这个很有广泛性形式的业务转化成A、B、contact谁主导的问题,没有绝对不变的答案
Db.save(A),A.save(DB),save(DB,A),
我觉得其实第三种是侵入最小,最容易复用和重构的,尤其是在对三者职能划分还没理解透的情况下
很多时候其实很难判断一个方法应该在域模型还是放到专属service对象

是否复用我觉得和是不是把方法放进class其实没关系,而是是否遵循了最小依赖设计的原则
RDBMS的范式设计其实就是实体表--关系表---实体表这样的一种设计体现,关系的抽出让实体更加纯粹,OO与DB最难调和的恰恰是继承多态这些关系

OO更适合处理树形继承关系,问题在于对象和对象远不止这种关系,所以需要第三方的manager去处理那些继承和多态不好覆盖的逻辑
0 请登录后投票
   发表时间:2011-04-17  
ppgunjack 写道
把数据(domain)和方法(放在Service层)分开,有违OO的封装的原则
不能一概而论,这要考虑A contact B这个很有广泛性形式的业务转化成A、B、contact谁主导的问题,没有绝对不变的答案
Db.save(A),A.save(DB),save(DB,A),
我觉得其实第三种是侵入最小,最容易复用和重构的,尤其是在对三者职能划分还没理解透的情况下
很多时候其实很难判断一个方法应该在域模型还是放到专属service对象

没怎么明白你上面的逻辑。db是什么东西?你是不是指关联对象?比如计算费用
那么我们Account.bill(OtherDomain)行不行呢?bill内部有处理逻辑呀。

ppgunjack 写道

OO更适合处理树形继承关系,问题在于对象和对象远不止这种关系,所以需要第三方的manager去处理那些继承和多态不好覆盖的逻辑

我觉得DDD+设计模式应该可以处理好这样的东西。
0 请登录后投票
   发表时间:2011-04-17  
db就理解成B就好了
0 请登录后投票
   发表时间:2011-04-17   最后修改:2011-04-17
对于你上面所说的这种问题。应该指的是方法逻辑划分在哪个domain下面更合适。这就要搞domain model的人既要很懂领域知识,又要有丰富的设计经验才行,能事先看到以后的一些问题,并避免那样的问题发生。所以我也觉得ddd,一旦设计不好,就会带出很多问题,包括domain间逻辑的反复变化。
0 请登录后投票
论坛首页 Java企业应用版

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