2012-04-12 8 views
1

私はいくつかのドメインクラスで共通の方法をいくつか持っています。私は複製されたコードの量を減らしたいと思います:

1)一般的なメソッドをbaseDomainクラスに入れ、そこからメソッドを継承します
2)一般的なメソッドをcommonDomainMethodServiceに入れてください私のドメインにインポート

私は、ドメインが共通のプロパティを共有しない限り、継承を残すべきだと思っていますが、わかりません。これらの方法の1つは、他の方法よりも有益ですか? Grailsのベストプラクティスと一線を画していますか?例えば

パラメータに基づいて、2つのドメインのインスタンスを比較する方法:
一般的なドメインメソッドの継承またはサービス?

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

実装する必要のあるタイプのメソッドの例を挙げることはできますか? –

+2

それは本当にあなたが扱っているロジックの種類に依存します。問題のコードのいくつかを投稿すれば、_TON_を助けるでしょう。 – cdeszaq

+0

たとえば、ドメインの2つのインスタンスが提供され、パラメータとして提供されるプロパティに基づいてそれらを比較するメソッド。 – Weezle

答えて

3

その場合には、私は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を実装して、スーパークラスを拡張したり、サービスに実装することなく、必要なドメインクラスに機能を追加することができます。 mixin年代内のプライベートメソッドがないように見える

1):いくつかの潜在的な落とし穴(私はあなたのcompare方法はもう少し洗練されたこれ以上になりたいだろうと想定したいが、あなたのアイデアを得る)

作業。 mixinの循環依存持つ

2):)他mixin年代に混入S「sのも悪いですMixinClassAがMixinClassAをミックスMixinClassBをミックス(セットアップのために私はあなたがmixinだろうとは思わない」と。

3)メソッドの衝突で何が起こるのか忘れて、おそらく実験をするべきです。例:ClassAにはdoStuff()メソッドがあり、doStuffMixinにはdoStuff()メソッドもあります。

4)クラスであなたがmixinを使用しているオブジェクトのインスタンスになりますthisを参照することができますmixinとして使用しているということを覚えておいてください。たとえば、上記の例では、instance1を削除し、thisに置き換えることができます。実行時にthisはDomainAまたはDomainB(私はmixinsの非常に強力な部分だと感じている)のインスタンスになります。

これは私が考えることができる大きな問題です。

+0

うーん、もっと面白いことを学ぶ。読書を提供してくれてありがとう。 GrailsでMixinを使用しようとしたら、どんな問題があるのか​​知っていますか? – Weezle

関連する問題