2012-04-12 10 views
1

Ich habe einige Methoden, die in einigen meiner Domain-Klassen üblich sind. Ich möchte die Menge an repliziert Code reduzieren und zwei Lösungen in den Sinn kommen:

1) Setzen Sie die gängigen Methoden in eine BaseDomain-Klasse und erben die Methoden davon in meinen Domänen
2) Setzen Sie die gängigen Methoden in einem commonDomainMethodService, die ich kann Import in meine Domänen

Ich denke, ich sollte Vererbung allein lassen, es sei denn, die Domänen teilen gemeinsame Eigenschaften, aber ich bin mir nicht sicher. Ist eine dieser Methoden vorteilhafter als die andere? Ist eines mehr im Einklang mit Grails Best Practices?

Zum Beispiel ein Verfahren, das zwei Domain-Instanzen basierend auf einem Parameter vergleicht:
Vererbung oder Service für Common Domain-Methoden?

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

Können Sie ein Beispiel für die Art der Methode angeben, die Sie implementieren müssen? –

+2

Es hängt wirklich davon ab, mit welcher Logik Sie es zu tun haben. Wenn Sie etwas von dem fraglichen Code veröffentlichen könnten, würde es _TON_ helfen. – cdeszaq

+0

Zum Beispiel eine Methode, die zwei Instanzen einer Domäne bereitstellt und diese basierend auf einer Eigenschaft vergleicht, die ebenfalls als Parameter bereitgestellt wird. – Weezle

Antwort

3

Für diesen Fall würde ich ein Mixin verwenden: Mixin Reading und Further Mixin Reading

Zum Beispiel:

@Mixin(MyCompare) 
class DomainA { 
} 

@Mixin(MyCompare) 
class DomainB { 
} 

class MyCompare { 

    def compare(instance1, instance2, propertyName) { 
     instance1[propertyName] == instance2[propertyname] 
    } 
} 

Jetzt haben alle Instanzen von DomainA und DomainB Ihre compare Methode. Auf diese Weise können Sie mehrere Mixins implementieren, um den gewünschten Domänenklassen Funktionalität hinzuzufügen, ohne dass eine Superklasse erweitert oder in einen Service implementiert werden muss. (Ich würde davon ausgehen, dass Sie Ihre compare Methode wollen würde ein wenig anspruchsvoller als dies zu sein, aber Sie erhalten die Idee)

Einige mögliche Gotchas:

1) private Methoden innerhalb mixin ‚s scheinen nicht Arbeit.

2) eine zirkuläre Abhängigkeit von mixin mit 's ist auch schlecht: MixinClassA in MixinClassB mischt, die in MixinClassA mischt (für das Setup Ich glaube nicht, Sie mixin haben würden' s Mischen in anderen mixin ‚s).

3) Ich vergesse, was mit einer Methode Kollision passiert, so dass Sie wahrscheinlich experimentieren sollten. Beispiel: ClassA hat eine doStuff() -Methode und mischt DoStuffMixin, die auch über eine doStuff() -Methode verfügt.

4) Denken Sie daran, dass Sie in einer Klasse, die Sie als mixin verwenden, auf this verweisen können, die die Instanz des Objekts sein wird, das die mixin verwendet. Zum Beispiel im obigen Beispiel könnten Sie die instance1 entfernen und durch this ersetzen. Zur Laufzeit this wird entweder eine Instanz von DomainA oder DomainB (was ich fühle, ist ein sehr mächtiger Teil von Mixins).

Das sind die großen Probleme, die ich mir vorstellen kann.

+0

Ooo, mehr groovige Güte zu lernen. Danke für die Bereitstellung der Lesung. Kennst du irgendwelche Probleme beim Mixin mit Grails? – Weezle