对象设计夜未眠

对象设计不是仅仅为了真实的模拟现实世界,而是使现实世界的需求能更好的在计算机这个环境中表达,当我们思考对象职责,设计对象行为时,能够更好的扩展,能够更好的维护,能够更清晰的表达这个对象所承担的职责,能够更好测试,能够有更好的性能,才是我们要达到的目标。我曾经一度对什么是正确是设计,什么是好的职责分配。这一点混淆不清,那是因为我忘记了我要实现的目标,只是一味想找出现实世界在软件环境中的对应物,事实上这种思考方式也是有失偏颇的。比如以图书馆系统为例,你说还书是谁的职责呢,你说是人的职责是可以的。那我也可以说是书的职责,说书被还了。事实上对于这两个设计到底谁正确的参考标准不是哪个思维方式更贴近于现实世界。而是哪种设计能更好的和其他对象协作,更好的表达业务需求,更适合承担这个职责。说了这么多,其实对象设计就一句话,高内聚,低耦合。在这个本身互相牵制的两个法则中找到合适的点,就是合理的对象设计。
我还说下我对领域事件的理解,其实领域事件的本质实质上我觉得也是解耦合。事件这个东西很早就用于模块之间解耦合,让模块与模块之间的调用通过消息总线的方式调用,让各自模块独立的变化。然后又出现在DDD里面用来保持领域模型主导地位和领域模型注入仓储问题,同样领域事件就是为了解决领域模型和仓储解耦合问题。更有甚者想用事件代替所有的对象交互,把所有的对象的直接调用,改为向消息总线发送消息,然后让服务提供者消费对象消息。本质而论还是同样六个字:高内聚,低耦合。

模块与模块之间通过事件发送消息

聚合跟与聚合跟之间发送消息

聚合跟内发送消息
总结:发了三张图,分别是模块与模块之间的事件,聚合根与聚合根之间的事件,聚合内的事件,他们都都说明了事件的本质作用,解耦消息的发送者和消息的接受者。当然最后一张聚合内的实体发送消息有点过,聚合内的对象是紧密相关的对象,本身存在内聚性,不需要解耦合。
呵呵,终于发完了,考虑到我辛辛苦苦用画图板画图,有苦劳的情况下,各位大侠对于我的理解不当之处,请多见谅。


[该贴被OweJDao于2011-03-29 13:08修改过]




这么好的贴子要顶的。

不错,这实际已经有SOA/ESB 消息总线的影子,原理两者一致,但另外一个方向是EDA,是向ESB还是EDA,取决于你的业务,如果流程多变,性能要求不高,用ESB,如果流程变化不大,性能要求高,用EDA。

恩,楼主思考得不错。最后一张画得不对,值对象不是和实体交互,实体既然是事件生产者,那么消费者就不可能是值对象了,谁在消费呢?这取决于你的代码。

呵呵,OweJDao,原来昨天在DDD的QQ群里发那段话的是你啊。banq,关于OweJDao提到的后面两张图的思想是我提出的。具体请参看我发表的博文:http://www.cnblogs.com/netfocus/archive/2011/03/27/1997014.html
里面详细描述了我设计的基于事件驱动的领域模型的实现方案的设计初衷。

看来大家殊途同归啊,jdonframework也是基于领域模型的领域事件domain events。现在我们发的贴就是基于这个框架的论坛。以后多多讨论啊。

总的观点是:要真正实现面向对象,让业务驱动技术架构,而不是业务被压成数据囚禁在数据库中不成人样,目前两条路径:领域事件或dci