Java-Konfiguration / Parameterübergabe Design

8

Oft muss ich Objekte mit konfigurierbaren Funktionen erstellen.

Angenommen, ich erstelle ein DateIterator . Die konfigurierbare (n) Option (en) können sein, ob das geschlossene Intervall [start, end] oder das offene Intervall [start, end) iteriert werden soll.

  • (1) Die meiner Meinung nach unpräzise Lösung - beschränkt auf nur eine true / false Konfigurationsoption
%Vor%
  • (2) Die typsichere Enum-Methode - in der Regel ein bisschen sperrig
%Vor%
  • (3) Der unkonventionelle Versuch - nett, aber nicht zu geradlinig
%Vor%
  • (4) Der Vererbungsansatz - oft übertrieben
%Vor%

Dazu kommen einige Alternativen, die ich als unterlegen betrachte, wie die integer-basierte Konfiguration new DateIterator(Interval.OPEN_END); oder die eigenschaftsbasierte Konfiguration.

Gibt es noch andere Ansätze? Welchen Ansatz bevorzugen Sie?

    
Johan Sjöberg 29.08.2011, 12:32
quelle

2 Antworten

6

Ich würde sagen, dass das Builder-Muster hier sinnvoll ist:

%Vor%

Auf diese Weise kann Ihr tatsächlicher DateIterator unveränderlich sein, während der von DateIterator.builder() zurückgegebene Builder die Konfiguration ausführt.

    
Sean Patrick Floyd 29.08.2011, 12:41
quelle
1

Obwohl es keine gute Antwort gibt, und es ist weitgehend eine Frage des Geschmacks, folge ich der folgenden Faustregel, mit viel Platz für Ausnahmen, um zu viel Engineering zu vermeiden:

  1. Wenn die einzige Konfiguration, die Sie haben, ein "Parameter" ist, einen festen Satz nimmt und das Verhalten ändert (wie in Ihrem Beispiel), gehen Sie mit Unterklassen. Es kann zwar überentwickelt sein, aber wenn viele Methoden in Ihrer Klasse mit einem "if (this.parameter == x) ... else if (this.parameter == y) .." beginnen, wird der Code unlesbar gemacht.
  2. Wenn Ihr Parameter kein fester Satz ist, sondern ein String oder eine Zahl, und Sie BENÖTIGEN, dass die Klasse richtig funktioniert, setzen Sie sie in den Konstruktor. Wenn es nicht obligatorisch ist, mag ich Lösungsnummer (3), den unkonventionellen Versuch: )
  3. Wenn Sie mehr als einen Parameter in einem festen Satz haben (wie START_OPEN_ENDED und STOP_OPEN_ENDED), kann das Erstellen von Unterklassen bedeuten, dass für jede Permutation eine Unterklasse erstellt wird. In diesem Fall sollte eine Kapselung in Betracht gezogen werden. Zum Beispiel (ich würde es in diesem speziellen Fall wahrscheinlich nicht tun, aber es ist ein gutes Beispiel), erstellen Sie eine einzelne Klasse DateComparator, mit einer Unterklasse für Open-Ende, und kapseln Sie einen DateComparator für den Anfang und einen für das Ende, mit nur einer DateIterator.

Auch dies ist die Faustregel, die ich benutze, in keiner Weise zwingend, und oft finde ich mich nicht wörtlich, sie zu respektieren.

    
Simone Gianni 29.08.2011 12:43
quelle