Inheritance 通用域方法的继承还是服务?
我有一些在我的一些域类中通用的方法。我想减少复制代码的数量,于是想到了两种解决方案:Inheritance 通用域方法的继承还是服务?,inheritance,grails,grails-domain-class,Inheritance,Grails,Grails Domain Class,我有一些在我的一些域类中通用的方法。我想减少复制代码的数量,于是想到了两种解决方案:1)将通用方法放在baseDomain类中,并在我的域中继承它的方法2)将通用方法放在commonDomainMethodService中,我可以将其导入到我的域中我认为应该不使用继承,除非域共享公共属性,但我不确定。这些方法中的一种比另一种更有益吗?还有一个符合Grails最佳实践吗?例如,一个基于参数比较两个域实例的方法: int compareInstances(instance, otherInstanc
1)将通用方法放在baseDomain类中,并在我的域中继承它的方法
2)将通用方法放在commonDomainMethodService中,我可以将其导入到我的域中
我认为应该不使用继承,除非域共享公共属性,但我不确定。这些方法中的一种比另一种更有益吗?还有一个符合Grails最佳实践吗?
例如,一个基于参数比较两个域实例的方法:
int compareInstances(instance, otherInstance, propertyName){
return //some logic to compare the instances based on the type of property
}
在这种情况下,我将使用一个
Mixin
:和
例如:
@Mixin(MyCompare)
class DomainA {
}
@Mixin(MyCompare)
class DomainB {
}
class MyCompare {
def compare(instance1, instance2, propertyName) {
instance1[propertyName] == instance2[propertyname]
}
}
现在,DomainA和DomainB的所有实例都将有您的compare
方法。通过这种方式,您可以实现多个mixin以向您想要的域类添加功能,而无需扩展超类或在服务中实现它。(我假设你希望你的compare
方法比这个复杂一点,但你明白了)
一些潜在的陷阱:
1) mixin
中的私有方法似乎不起作用
2) 有一个循环依赖的mixin
也是不好的:MixinClassA在MixinClassB中混合,而MixinClassB在MixinClassA中混合(对于您的设置,我认为您不会在其他mixin
中有mixin的混合)
3) 我忘记了方法冲突会发生什么,所以您可能应该进行实验。示例:ClassA有一个doStuff()方法,并与DoStuffMixin混合,后者也有一个doStuff()方法
4) 请记住,在用作mixin
的类中,可以引用this
,它将是使用mixin
的对象的实例。例如,在上面的示例中,您可以删除instance1
,并将其替换为this
。在运行时,这个
将是DomainA或DomainB的一个实例(我觉得它是mixin中非常强大的一部分)
这些是我能想到的最大难题。你能举个例子说明你需要实现的方法类型吗?这取决于你处理的逻辑类型。如果您可以发布一些有问题的代码,这将非常有帮助。例如,一个方法提供了一个域的两个实例,并根据一个属性(也作为参数提供)对它们进行比较。Ooo,更值得学习的groovy优点。谢谢你提供阅读材料。你知道在Grails中使用Mixin时会遇到什么问题吗?