在grails域类中编写类方法的优缺点是什么?

时间:2012-12-24 03:28:34

标签: grails groovy grails-domain-class

在grails域类中编写类方法的优缺点是什么?我问,因为我经常看不到任何带有域类内部方法的grails项目,只有数据成员。这样做是否有缺点?

2 个答案:

答案 0 :(得分:2)

当一个域类(不仅仅是grails,而是一般的面向对象编程)时,这被称为anemic domain model。 Martin Fowler建议将域逻辑放入域类中以创建丰富的域模型。通过这样做,域类变得更聪明并且知道如何执行操作,而不是具有必须在域类上操作的另一个服务类。拥有丰富域模型的优点是该类封装了更多自己的行为,并且它更加自包含。另一方面,它确实使域类更复杂。虽然我认为域类不仅仅是一个业务对象。

在grails中,我倾向于尝试使用富域模型和使用服务的组合。关于何时方法应该在域类中以及何时应该在服务中,很难做出一个全面的陈述。但是,作为一般规则,如果操作很复杂并且需要多个协作者,我倾向于将其放在服务类中。如果该方法看起来应该是域类的行为,我会把它放在那里。

为了给出一个更具体的例子,我们来看一个Person类。

class Person {
  String firstName
  String lastName
  List<Person> friends
}

在我们的申请中,一个人可以说话。现在我可以拥有一个知道一个人如何谈话的TalkService。但在这种情况下,我认为talk是此人的核心行为,因此我会向talk添加Person方法。

假设我也有功能,我想找到所有朋友的朋友(二级朋友)。对我而言,这不是Person的核心行为,因此我将其委托给服务部门。

回顾一下,一般来说,当它是对象的核心行为时,我会向域类添加方法(例如,它是域方法),否则,我会把它放在服务中。

答案 1 :(得分:1)

在Java项目中,您必须具有代表模型的POJO类。 例如:Person,Invoice,Book,...

然后是服务层,其中包含用户进行一些数据库查询的接口,它接收模型的参数,还返回Model,还有控制器层负责重定向和注入您的服务。 / p>

在Grails中,使用服务器注入控制器非常容易

现在,我们什么时候需要在域类中使用方法?只有负责我们需要做什么的模型,例如,人X的年龄(从出生日期开始),发票中有多少项(从列表中),我们认为是只有当我们操纵当前对象的数据时才使用它。

例如,对于保存方法,您无法在模型中添加

PersonController:

def personService

def save() {
...
Person person = ...
personService.save(person);
...
}

这是更具进化性的