首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不直接扩展GenericDAO?

为什么不直接扩展GenericDAO?
EN

Stack Overflow用户
提问于 2015-02-16 13:53:02
回答 2查看 96关注 0票数 0

我的问题可能有点基础,但希望通过堆栈溢出的人运行这一点。

通常的做法是拥有域类(属性和getter/setter,比如User.java)。然后让DAOs (扩展了UserDAO.java的GenericDAO.java)提供CRUD操作。

如果我们让域扩展GenericDAO呢?像User.java一样,扩展了GenericDAO,它允许我们拥有这样的东西:

代码语言:javascript
复制
user.save();

我研究过Grails,如果你知道Grails,你就会明白为什么要问这个问题。还有一些关于领域驱动设计的想法,我想这也是类似的建议。我找到一篇关于DDD的文章,上面写着:

客户端应该始终调用域对象,而域对象又应该调用DAO来将数据持久化到数据存储区。

我只想知道为什么人们不这么做有什么坏处吗?

EN

回答 2

Stack Overflow用户

发布于 2015-02-16 14:08:05

如果我们让域扩展GenericDAO呢?像User.java一样,扩展了GenericDAO,它允许我们拥有这样的东西:

您如何知道此域模型的使用者将需要该方法(save())?例如,可以在使用UserUser保存到数据库的web服务中使用DAO。同样的User也被发送到响应对象中的web服务客户端。为什么要将持久化层打包到web服务客户端上呢?它只会让web客户端用户感到困惑,因为save()在那里没有意义。

我只想知道为什么人们不这么做有什么坏处吗?

在我看来,这是一种关注点的分离。User是一个模型。它的责任是代表User的状态。UserDAO是持久化层的一部分。它的责任是将模型持久化到持久性存储中(例如数据库)。通过将这两种功能混合在一起,可以将功能紧密地结合在一起。

票数 1
EN

Stack Overflow用户

发布于 2015-02-17 09:02:14

它主要是关于单一责任原则和关注点的分离--在DDD中,域层对象专门用于域的建模和不变量的执行。不管数据是如何持久化的,何时持久化都不是他们的事,这些都是其他代码模块处理的不同的关注点。

SRP和较小的类范围的一些优点是:可读性和合理性(您知道在打开/调试类时所期望的是什么)、更小的测试、更少的脆弱性(对类的更改影响有限)、独立的部署性。

在DDD和更集成的方法(如one (G)Rails )之间进行选择,基本上是在时间上的柔性(改变对代码库的影响最小的程序的某一方面)和即时生产力之间的权衡。无论是对是错,这只是一个背景问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28542983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档