【问题标题】:Inheritance or Service for common Domain methods?公共领域方法的继承或服务?
【发布时间】:2012-04-12 13:57:12
【问题描述】:

我有一些在我的几个域类中通用的方法。我想减少重复代码的数量,我想到了两个解决方案:

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

我想我应该不理会继承,除非域共享公共属性,但我不确定。这些方法中的一种是否比另一种更有益?是否更符合 Grails 最佳实践?

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

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

【问题讨论】:

  • 你能举例说明你需要实现的方法类型吗?
  • 这真的取决于你正在处理什么样的逻辑。如果您可以发布一些有问题的代码,这将有助于 TON.
  • 例如,提供一个域的两个实例并根据也作为参数提供的属性比较它们的方法。

标签: inheritance grails grails-domain-class


【解决方案1】:

对于这种情况,我会使用 Mixin: Mixin 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 方法。通过这种方式,您可以实现多个 Mixin 以向您想要的域类添加功能,而无需扩展超类或在服务中实现它。 (我假设您希望您的 compare 方法比这更复杂一点,但您明白了)

一些潜在的陷阱:

1) mixin 中的私有方法似乎不起作用。

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

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

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

这些是我能想到的大问题。

【讨论】:

  • 哦,学习更多的好东西。感谢提供阅读。在尝试将 Mixin 与 Grails 一起使用时,您是否知道任何问题?
猜你喜欢
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2015-12-30
  • 2021-11-12
  • 2011-03-25
  • 2020-07-14
  • 2014-11-24
  • 1970-01-01
相关资源
最近更新 更多