常用域方法的继承或服务?

时间:2012-04-12 13:57:12

标签: inheritance grails grails-domain-class

我有一些在我的几个域类中很常见的方法。我希望减少复制代码的数量,并想到两个解决方案:

1)将常用方法放在baseDomain类中,并在我的域中继承它的方法
)2)Put我可以导入到我的域中的commonDomainMethodService中的常用方法

我认为除非域共享公共属性,否则我应该单独继承继承,但我不确定。这些方法中的一种比另一种更有益吗?是否还有一个符合Grails最佳实践的方法?

例如,一种基于参数比较两个域实例的方法:

int compareInstances(instance, otherInstance, propertyName){
    return //some logic to compare the instances based on the type of property
}

1 个答案:

答案 0 :(得分:3)

对于这种情况,我会使用MixinMixin ReadingFurther Mixin Reading

例如:

@Mixin(MyCompare)
class DomainA {
}

@Mixin(MyCompare)
class DomainB {
}

class MyCompare {

    def compare(instance1, instance2, propertyName) {
        instance1[propertyName] == instance2[propertyname]
    }
}

现在,DomainA和DomainB的所有实例都有compare方法。这样,您可以实现多个Mixins,以便为您想要的域类添加功能,而无需扩展超类或在服务中实现它。 (我假设你希望你的compare方法比这更复杂,但你明白了)

一些潜在的问题:

1)mixin内的私人方法似乎不起作用。

2)具有mixin的循环依赖性也很糟糕:MixinClassA混合在MixinClassB中,混合在MixinClassA中(对于你的设置,我认为你不会混入mixin其他mixin的)。

3)我忘记了方法碰撞会发生什么,所以你应该尝试一下。示例:ClassA有一个doStuff()方法,并在DoStuffMixin中混合,它也有一个doStuff()方法。

4)请记住,在您作为mixin使用的课程中,您可以引用this,它将是使用mixin的对象的实例。例如,在上面的示例中,您可以删除instance1并将其替换为this。在运行时this将是DomainA或DomainB的一个实例(我认为它是mixins中非常强大的一部分)。

这些是我能想到的重要问题。