关于DDD的疑惑。

-->>失血模型

  MF(Martin Fowler)曾经提出有名的贫血模型或失血模型,让我们好生迷惑和彷徨,他认为实体模型对象中只有弱行为setter和getter方法,没有真正行为,好像缺少血液的人,不和谐了,不少高手又被忽悠了,大谈贫血模型。

  其实,Eric已经认为,在DDD中,领域中一些概念不能作为模型中的对象来处理的,如果将这些功能概念强行加给实体对象和值对象,破坏模型中对象的定义,人为添加没有意义的对象。服务是描述领域概念最自然的方式。

我想问一下,我们现在的领域模型对象到底是失血呢,还是充血。我想应该是充血的才对吧。DDD不是要在实体等领域对象中加入业务逻辑吗?请前辈们指点一二哈哈。小弟多谢了。


class Car{}
class CarQuery{
Set<Car> findViolation(City city){}
}

单看Car类就贫血,但是单看一个Car也没有意义,不能构成一个完整的领域。查找某地区的违章车是一个领域作业的话,这个作业应该在哪里。它和它的管理者共同构成领域,这就有血。这就是我的理解了。

领域对象中应该是丰富的业务行为,有时这种业务行为还会被我们用设计模式分离到其他类中,那么当前类就没有业务行为,但是你不能认为当前类就是失血模型,这是片面的,盲人摸象的。

有人看到JiveJdon3中FourmMessage只有set/get,就认为是贫血的,这就很片面,不能教条主义看待失血和充血,JiveJdon3的ForumMessage粗看上去是失血,只有set/get,没有业务逻辑,但是看看其子包下MessagRender就发现业务行为不少,这些都是从FourmMessage中分离出来的,是细节设计考虑,当然如果为了面对形式上充血,我完全可以将MessageRender功能都并入ForumMessage,那谁能看得懂ForumMessage呢?OO宗旨又跑到哪里了呢?再说Evans DDD最终必须结合设计模式的。

通过我这样的思路,我们的Domain Model又是充血的丰富的,完整的,又能够在分布式系统/SOA中快速序列化奔跑,这就是裸奔,裸奔有理,体现我们OO分离细分原则。

哦,多谢两位老师了。我也刚开始学DDD,以为模型对象,比如实体里要含有业务逻辑,这样我们的实体就是充血的,看来我的认识还是在代码级别。DDD是不是讲究领域模型是充血的,但是我们的具体的实体还是贫血的。

>DDD是不是讲究领域模型是充血的,但是我们的具体的实体还是贫血的。
晕倒,你还没有明白分析和设计的区别,什么是系统分析,最后落实为设计是什么样。看来你对设计模式不是很懂,学习DDD,必须掌握好设计模式基础。

DDD讲究领域模型是充血的,我们的具体实体也是充血的,你看到的失血实体代码只是看到只是整个充血实体的一个部分,或者说一个胳膊。

就象设计模式是由多个类组合起来的,你能够指着其中一个类说,这不是设计模式,因为我在这个类中没有看到模式,这就是我前面讲的盲人摸象啊。

[该贴被banq于2008-06-25 17:45修改过]

DDD讲究领域模型是充血的??
一个领域模型 怎么可能是贫血的?如果贫血,岂不是还要写服务去调用 领域模型?不可思议,那谁还会用领域模型建模

我们的具体实体也是充血的
这说的 建模的时候 实体类看起来是充血的?设计的时候,用设计模式分 把实体类解成n个 ,我的天天,这能叫一次建模?这不明显建立的是业务模型,之后还要建系统模型