锁定老帖子 主题:是否应该让实体类具备丰富的业务逻辑?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-23
to Archie:
在Forum的deleteTopics里面使用forumDao.update方法来进行数据库持久化操作(在我主张的观点中,持久化行为在完成是在Forum外面),我认为的坏处,在这几个相关的讨论中,我已经说了无数遍,感觉很累了,你自己找一下好吧? 其实我发起这个讨论的初衷就是想知道的是假设不需要外部的Service(或者Manager)来封装deleteTopics(forum, rule),而在Forum内部完成持久化,会给编程带来什么实际的好处? |
|
返回顶楼 | |
发表时间:2005-03-23
frankensteinlin 写道 引用 而后面我举的那个deleteTopics来说,这个逻辑的实现是必须依赖持久化操作的(forumDao),我们必须把forumDao.update方法调用挪到外面去(放在Manager,Server或者其他的什么里面) 也就是说 我认为应该把update方法放在里面, 为什么?看看order.getTotalAccount();方法没有持久化的帮助如何计算? Class Order{ getTotalAccount();{ List tempItems=getItems();;//需要持久化方法的调用 ................. while .............. total+=item.price();; .......... return total; } } 这里并不需要持久化方法调用,因为tempItems本身就是Order的一个属性(有一个隐含的lazy loading) |
|
返回顶楼 | |
发表时间:2005-03-23
partech 写道 为什么要让WEB的程序员知道哪些方法需要通过Service层调用,哪些需要
通过实体类的方法调用呢? Web程序员还需要关心持久化的概念? 就用你的例子,如果那天需求要求记录下被禁止回帖的情况。那不就死菜了? 这时候再去添加个服务? 举个实际的例子吧。 我做过的系统中曾经有一个是要记录登陆失败的日志的需求。 按照一般的要求,不需要记录,这样登陆失败就变成存查询了。两者的区别还需要改变客户端调用的代码? 再说让客户端开发人员必须要知道在一次服务中是否持久化,是不是有些怪异? 如果你头脑中业务逻辑的概念,包含持久化。那么我认为你的观点是正确的。 因为按照我的理解业务逻辑是同持久化无关的。 所以排除你说的情况,实体类就该包含处理它自身数据的业务逻辑。 我想可以结贴了。over。 很高兴终于回到正确的轨道来讨论问题了。 我认为的业务逻辑确实就是包含持久化的。我看了你给出的代码以后,我认为你和我的观点是一致的,只不过称呼不同,你把包含持久化的业务逻辑称为服务, 不包含持久化的业务逻辑才叫做自身数据的业务逻辑。在你的代码中,你的Service也是单向依赖domain object的。 我认为Martin Fowler的Domain Object并不光包括你说的自身数据的业务逻辑,也包括你所说的外部的有持久化的服务。我想知道的就是这种Domain Object有什么好处。 |
|
返回顶楼 | |
发表时间:2005-03-23
翻到两条:
robbin 写道 这种软件模型的优点在于提高了对象状态和业务逻辑的内聚性,它的缺点在于往一个类里面放入了过多的职责,不符合单一职责的原则。目前尚没有主流软件架构使用该模型。
看怎么理解单一职责了,因为持久化操作不属于业务逻辑,所以按业务逻辑来说这样做是符合单一职责的。 robbin 写道 domain object(including business logic) <---> DAO
从上面的依赖关系图可以看出来,第二种模型实际是把第一种模型的业务对象和持久对象合并为一个了。 这个已经解释过了,domain object -->DAO是单向依赖的。 我发现robbin说的不足之处都不成立,呵呵。 好处倒是有一个: 这种软件模型的优点在于提高了对象状态和业务逻辑的内聚性 |
|
返回顶楼 | |
发表时间:2005-03-23
引用 这个已经解释过了,domain object -->DAO是单向依赖的。
在你的模型当中 public interface ForumDao { public void updateForum(Forum forum);; } 请看清楚了,DAO依赖不依赖domain object?至于 ForumDaoxxxImpl那就更不说了。 |
|
返回顶楼 | |
发表时间:2005-03-23
robbin 写道 frankensteinlin 写道 引用 而后面我举的那个deleteTopics来说,这个逻辑的实现是必须依赖持久化操作的(forumDao),我们必须把forumDao.update方法调用挪到外面去(放在Manager,Server或者其他的什么里面) 也就是说 我认为应该把update方法放在里面, 为什么?看看order.getTotalAccount();方法没有持久化的帮助如何计算? Class Order{ getTotalAccount();{ List tempItems=getItems();;//需要持久化方法的调用 ................. while .............. total+=item.price();; .......... return total; } } ] 这里并不需要持久化方法调用,因为tempItems本身就是Order的一个属性(有一个隐含的lazy loading) (有一个隐含的lazy loading)其实就是一次隐含的持久化的读取阿,如果没有hibernate 直接jdbc的话就更加明显了。SQL打印出来就是执行了一句sql. 其实就是隐藏了OrderDetailDAO.getItems();的操作阿。 所以说要做到对象间的导航肯定要用到持久化的操作,否则肯定要跳出来,使得业务操作不连贯 |
|
返回顶楼 | |
发表时间:2005-03-23
robbin 写道 我认为Martin Fowler的Domain Object并不光包括你说的自身数据的业务逻辑,也包括你所说的外部的有持久化的服务。我想知道的就是这种Domain Object有什么好处。 那是你理解错误。 Martin Fowler并没有这样的观点。不说你了,仔细阅读大师的书,好处多多。 |
|
返回顶楼 | |
发表时间:2005-03-23
我想Martin的Domain Object的一个优点,或者说我主张的模型的一个缺点,partech最后已经指出来了。
作为Web应用程序员,他需要区分那些操作需要持久化(需要调用ForumService),那些调用不需要持久化(直接调用Forum),这可能是一个比较困难的问题,此外,万一Forum的一个业务逻辑方法由于需求变更,变得开始依赖持久化了,那么势必需要把该方法从Forum中挪到ForumService中去,这样的结果造成了Web层的应用程序不可避免的修改。 而如果是Marin的Domain Objecct模型,则直接修改Forum里面的实现代码,而不需要修改Web层代码。 |
|
返回顶楼 | |
发表时间:2005-03-23
robbin 写道 引用 这个已经解释过了,domain object -->DAO是单向依赖的。
在你的模型当中 public interface ForumDao { public void updateForum(Forum forum);; } 请看清楚了,DAO依赖不依赖domain object?至于 ForumDaoxxxImpl那就更不说了。 应该这样的: public interface Dao { public void update(Object obj);; } public class DaoImpl implements Dao { public void update(Object obj); { this.session.saveorupdate(obj);; } } 这不算依赖domain object吧。 |
|
返回顶楼 | |
发表时间:2005-03-23
partech 写道 robbin 写道 我认为Martin Fowler的Domain Object并不光包括你说的自身数据的业务逻辑,也包括你所说的外部的有持久化的服务。我想知道的就是这种Domain Object有什么好处。 那是你理解错误。 Martin Fowler并没有这样的观点。不说你了,仔细阅读大师的书,好处多多。 那帮忙解释一下那张图里Product直接指向数据库啥意思? |
|
返回顶楼 | |