我有一些在我的几个域类中很常见的方法。我希望减少复制代码的数量,并想到两个解决方案:
1)将常用方法放在baseDomain类中,并在我的域中继承它的方法
)2)Put我可以导入到我的域中的commonDomainMethodService中的常用方法
我认为除非域共享公共属性,否则我应该单独继承继承,但我不确定。这些方法中的一种比另一种更有益吗?是否还有一个符合Grails最佳实践的方法?
例如,一种基于参数比较两个域实例的方法:
int compareInstances(instance, otherInstance, propertyName){
return //some logic to compare the instances based on the type of property
}
答案 0 :(得分:3)
对于这种情况,我会使用Mixin
:Mixin Reading和Further 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中非常强大的一部分)。
这些是我能想到的重要问题。