Ich würde sagen, bleib bei der Art und Weise, wie du es vorher getan hast. Die Anzahl der Parameter in Ihrem Beispiel ist nicht viel, aber die Alternativen sind viel schrecklicher.
Karte - Es gibt die Effizienzsache, die Sie erwähnt haben, aber das größere Problem hier sind:
- Anrufer wissen nicht, was sie Ihnen senden sollen, ohne auf etwas
anderes zu verweisen ... Haben Sie Javadocs, in denen genau angegeben ist, welche Schlüssel und
Werte verwendet werden? Wenn Sie dies tun (was großartig ist), ist es auch kein Problem, viele Parameter zu haben.
- Es wird sehr schwierig, verschiedene Argumenttypen zu akzeptieren. Sie können Eingabeparameter entweder auf einen einzelnen Typ beschränken oder Map <String, Object> verwenden und alle Werte umwandeln. Beide Optionen sind die meiste Zeit schrecklich.
Wrapper-Objekte - dies verschiebt nur das Problem, da Sie das Wrapper-Objekt zuerst füllen müssen - anstatt direkt zu Ihrer Methode, wird es zum Konstruktor des Parameterobjekts. Ob das Verschieben des Problems angemessen ist oder nicht, hängt von der Wiederverwendung des Objekts ab. Zum Beispiel:
Würde es nicht verwenden: Es würde nur einmal beim ersten Aufruf verwendet werden, also viel zusätzlicher Code für 1 Zeile ...?
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
SomeObject i = obj2.callAnotherMethod(a, b, c, h);
FinalResult j = obj3.callAFinalMethod(c, e, f, h, i);
}
Darf es benutzen: Hier kann es ein bisschen mehr. Erstens können die Parameter für 3 Methodenaufrufe berücksichtigt werden. es kann auch 2 andere Zeilen an sich ausführen ... so wird es in gewissem Sinne zu einer Zustandsvariablen ...
{
AnObject h = obj.callMyMethod(a, b, c, d, e, f, g);
e = h.resultOfSomeTransformation();
SomeObject i = obj2.callAnotherMethod(a, b, c, d, e, f, g);
f = i.somethingElse();
FinalResult j = obj3.callAFinalMethod(a, b, c, d, e, f, g, h, i);
}
- Builder-Muster - Dies ist aus meiner Sicht ein Anti-Muster. Der wünschenswerteste Mechanismus zur Fehlerbehandlung besteht darin, früher und nicht später zu erkennen. Mit dem Builder-Muster werden Aufrufe mit fehlenden (vom Programmierer nicht berücksichtigt) obligatorischen Parametern von der Kompilierungszeit zur Laufzeit verschoben. Wenn der Programmierer absichtlich null oder ähnliches in den Slot einfügt, ist dies natürlich Laufzeit, aber einige Fehler früher zu erkennen, ist ein viel größerer Vorteil für Programmierer, die sich weigern, die Parameternamen der von ihnen aufgerufenen Methode zu überprüfen. Ich finde es nur angemessen, wenn es um eine große Anzahl optionaler Parameter geht, und selbst dann ist der Nutzen bestenfalls marginal. Ich bin sehr gegen das "Muster" des Bauherrn.
Das andere, was die Leute vergessen zu berücksichtigen, ist die Rolle der IDE bei all dem. Wenn Methoden Parameter haben, generieren IDEs den größten Teil des Codes für Sie, und die roten Linien erinnern Sie daran, was Sie bereitstellen / festlegen müssen. Wenn Sie Option 3 verwenden, verlieren Sie diese vollständig. Jetzt ist es an dem Programmierer, es richtig zu machen, und es gibt keine Hinweise während der Codierungs- und Kompilierungszeit ... der Programmierer muss es testen, um es herauszufinden.
Darüber hinaus haben die Optionen 2 und 3, wenn sie unnötig weit verbreitet sind, aufgrund der großen Menge an doppeltem Code, die sie generieren, langfristige negative Auswirkungen auf die Wartung. Je mehr Code vorhanden ist, desto mehr muss gewartet werden, desto mehr Zeit und Geld wird für die Wartung aufgewendet.