网上一篇文章《十年之后再看“面向对象”》
http://www.cnblogs.com/freeflying/p/7410167.html
里面有讲到:
我举一个例子:
现在有两个类,一个用户类(User),一个博客类(Blog),现在有一个发布博客的方法(Publish)。
那么,“发布博客”这个方法,究竟是应该放在用户的类里面,还是博客的类里面?即:究竟是User.Publish(Blog)呢,还是Blog.Publish()?
原文作者未说例子给出一个较好的处理方案,并由此例子对面向对象进行了负面的评论。个人认为这块是有待商榷的。
首先我们不能把面向对象简单化了。OO不是简单的把现实的事件来做一个动谓分解。用户发布博客,不能简单的就是一个用户类,然后一个发布的方法。如果这样简单粗暴的话,那OO也就太容易了。
这块个人认为应结合领域驱动来分析问题。这种不知道放在哪个领域对象上的行为,一般都是比较复杂的业务,可能会涉及多个Entity及外部资源调用,所以用户发布博客可以提取成Domain层的一个服务,如BlogPulishService(此服务应归属于Blog 聚合类所在的BC)。它应该调用下层相应的领域模型来实现,相关业务包括如博客内容的审核,博客的状态更新,粉丝消息通知等。这个发布博客事件可以用一个pipline来实现。
通过对发布博客这个事件的进一步业务分析,设计出更合理的领域模型才应该是OO所关注的重点。
另:“发布博客”业务可以产生一个“blogPublished”事件。其它业务可以订阅这个事件。设计上方便解耦。