我的一些领域类的越来越富宁:他们实现了一个有趣的可比性,可能有加,减,乘,DIV,多有一些方便的干将,其呼叫服务,并确定复杂的事情。 最重要的是,他们有正确的性质。 我使用这些都为正常的“数据库事务”,也于时候,我只是想拥有所有这些方法,但可能不想保存它的对象。
我的队友们相信,这是非常糟糕的,并建议我应该使用DTO(数据传输对象)的,按照我的理解,将是一个POGO / POJO与粘贴域类的代码复制/之一。这似乎确实未干,我也看不到好处。 是不是有什么错误使用域对象为各类有规则物体不时? 我缺少DTO的意义呢?
Grails领域类是有些名不副实,因为应用程序的域层通常由持久和非持久化类的。 但是Grails领域的课总是执着。 你可以有非持久域(传统意义上的)类,但他们将不得不在SRC /常规或SRC / JAVA。 因为那时域层在应用程序分成两个地方可能会令人沮丧。 我们已经对非持久域类,如喜欢的事,请求static persistent = false
或类似的东西,但它尚未实现。
我认为,如果你想利用的领域类的非持久性特征(例如验证,依赖注入等),那么它的罚款,有一些类,可能是数据库支持的,但都没有。 你只需要记录,在代码或有某种约定,例如特殊的封装结构或命名约定。 如果你从来没有调用GORM方法,如save()
list()
findAllByFoo()
等等,那么将不会有任何的数据库访问。
至于DTO的去,他们可以是未干,但有一个插件,可以帮助-见http://grails.org/plugin/dto 。 它已经有一段时间没有更新了,但我敢肯定它仍然有效。 它有一个很好的功能,它会从语法一个持久域类的实例创建一个DTO实例domainObj as DTO
。 你需要保持类之间保持同步变化,但最初的DTO代通过脚本是自动的。
我认为你在正确的道路是。
1 - 你必须只创建一个类来照顾一个领域类的那一刻,你让你的模型更加耦合。 您创造更多的依赖关系,这显然是不好的。 你的目标应该是能够照顾自己。
2 -你的朋友都在谈论实际上是被称为模型贫血域模型 ,在那里你必须从你的程序的逻辑中分离数据和它最初由Martin Fowler作为反模式描述。 逻辑和数据之间的这种分离在过程编程很使用而不是在面向对象编程(OOP的目的是完全相反的)。
3 - 减少代码重用。
4 - 是很难进行测试,一旦你必须初始化从数据分离的逻辑。 同时,数据通过系统泄漏。
DTO是你可以使用,是肯定的。 但不建议您这样做,虽然。 它最初被设计为通过处理或层携带的数据(对象)。 然后,出于某种原因,人们开始使用它层之间,这是不值得的。 让你的程序更复杂的(一旦你拥有这些实体在您的应用程序传播),它允许全球访问。
你在做什么叫做富域模型,而且也没有使用它的问题。 但是,当然你要小心这一点。 如果你看到你的类承载了太多的责任,那么也许它的时间来设计另一个类来帮助(也许你打破了SRP原则)。
看看域对象是如何设计的Grails。 他们鼓励你写丰富的机型(验证,数据库事务处理等)。