1

いくつかのドメイン クラスに共通するメソッドがいくつかあります。レプリケートされるコードの量を減らしたいのですが、2 つの解決策が頭に浮かび

ました。1) 共通メソッドを baseDomain クラスに配置し、そこからメソッドをドメインに継承します
。ドメイン

が共通のプロパティを共有しない限り、継承はそのままにしておくべきだと考えていますが、よくわかりません。これらの方法の 1 つが他の方法よりも有益ですか? もう 1 つは Grails のベスト プラクティスに沿ったものですか?

たとえば、パラメーターに基づいて 2 つのドメイン インスタンスを比較するメソッド:

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

1 に答える 1

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。このようにして、複数の Mixin を実装して、必要なドメイン クラスに機能を追加できます。スーパー クラスを拡張したり、サービスに実装したりする必要はありません。compare(メソッドをこれよりももう少し洗練されたものにしたいと思うと思いますが、アイデアは得られます)

いくつかの潜在的な落とし穴:

1) 内のプライベート メソッドmixinが機能しないようです。

2) の循環依存関係を持つことも悪いです: MixinClassA は MixinClassA で混合する MixinClassB で混合します (あなたのセットアップでは、 が他の で混合されるmixinとは思いません)。mixinmixin

3)メソッドの衝突で何が起こるか忘れたので、おそらく実験する必要があります。例: ClassA には doStuff() メソッドがあり、doStuff() メソッドもある DoStuffMixin に混合されます。

4) として使用しているクラスでは、 を使用しているオブジェクトのインスタンスをmixin参照できることに注意してください。たとえば、上記の例では、 を削除してに置き換えることができます。実行時には、DomainA または DomainB のいずれかのインスタンスになります (これは mixin の非常に強力な部分だと思います)。thismixininstance1thisthis

これらは私が考えることができる大きな落とし穴です。

于 2012-04-12T15:49:51.300 に答える