繁体   English   中英

Grails:当我不想保存任何内容时,我可以使用域对象吗?

[英]Grails: Can I use domain objects when I don't want to save anything?

我的一些域类变得相当丰富:它们实现了一个有趣的可比较,可能有加号,减号,乘法和div,许多都有一些方便的getter来调用服务并确定复杂的东西。 最重要的是,他们拥有合适的属性。 我正在将这两者用于正常的“数据库事务”,并且在我只想要一个具有所有这些方法但可能不想保存它的对象的时候。

我的队友确信这非常糟糕,并建议我应该使用DTO(数据传输对象),据我所知,这将是一个POGO / POJO,其中一个域类'代码复制/粘贴。这似乎真的不干,我看不出有什么好处。 将域对象不时用作常规对象有什么问题吗? 我错过了DTO的观点吗?

Grails域类有点错误,因为应用程序的域层通常由持久类和非持久类组成。 但是Grails域类总是持久的。 您可以拥有非持久域(在传统意义上)类,但它们必须位于src / groovy或src / java中。 这可能令人沮丧,因为域应用程序在应用程序中分为两个部分。 我们已经有了非持久域类的请求,例如static persistent = false或类似的东西,但它还没有实现。

我想如果你想利用域类的非持久性特性(例如验证,依赖注入等),那么可以使用一些可以由数据库支持但不支持的类。 您只需要在代码中记录它或具有某种约定,例如特殊的包结构或命名约定。 如果你从不调用诸如save()list()findAllByFoo()等GORM方法,那么就不会有任何数据库访问。

就DTO而言,它们可以是非干的,但有一个插件可以提供帮助 - 请参阅http://grails.org/plugin/dto 它有一段时间没有更新,但我很确定它仍然有效。 它有一个很好的功能,它将使用语法domainObj as DTO从持久域类实例创建DTO实例。 您确实需要在类之间保持同步更改,但是通过脚本自动生成初始DTO。

我认为你走的是正确的道路。

1 - 只需要创建一个类来处理域类,就可以使模型更加耦合。 您正在创建更多依赖项,这显然很糟糕。 你的物品应该能够照顾好自己。

2 - 您的朋友正在谈论的模型实际上被称为贫血领域模型 ,您可以将数据与程序的逻辑分开,并且首先由Martin Fowler将其描述为反模式。 逻辑和数据之间的这种分离在程序编程中非常常用,但在面向对象编程中却没有(OOP的目的恰恰相反)。

3 - 减少代码重用。

4 - 一旦必须初始化与数据分离的逻辑,就更难测试。 同时,数据通过您的系统泄漏。

DTO是你可以使用的东西,当然。 但不建议您这样做。 它最初设计用于通过进程或层来传输数据(对象)。 然后,由于某种原因,人们开始在层之间使用它,这是不值得的。 使您的程序更复杂(一旦您将这些实体分布在您的应用程序中),它就允许全局访问。

你正在做什么被称为富域模型,并没有使用它的问题。 但是,当然你应该小心。 如果你看到你的班级承担了太多的责任,那么也许是时候设计另一个课程来帮助(也许你打破了SRP原则)。

看看如何在Grails中设计域对象。 他们鼓励您编写丰富的模型(验证,数据库事务等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM