Hat das Builder-Muster bei Verwendung einer Sprache, die benannte und optionale Argumente unterstützt, keinen praktischen Nutzen mehr?
Erbauer:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Optionale / benannte Argumente:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Paul Nikonowicz
quelle
quelle
Antworten:
Builder sind am nützlichsten, wenn Ihr Objekt viele Argumente / Abhängigkeiten benötigt, um nützlich zu sein, oder wenn Sie viele verschiedene Möglichkeiten zum Erstellen des Objekts zulassen möchten.
Ich kann mir vorstellen, dass jemand Objekte in einem 3D-Spiel wie diesem "bauen" möchte:
Ich würde argumentieren, dass dieses Beispiel mit den Builder-Methoden, die ich gerade erstellt habe, besser lesbar ist als mit optionalen Parametern:
Insbesondere müssen die durch die Builder-Methodennamen implizierten Informationen durch noch mehr Parameter ersetzt werden, und es ist viel einfacher, einen Parameter in einer Gruppe eng verwandter Parameter zu vergessen. Tatsächlich fehlt der Fragment-Shader, aber das würden Sie nicht bemerken, wenn Sie nicht wüssten, dass Sie danach suchen.
Wenn für die Konstruktion Ihres Objekts nur ein bis fünf Argumente erforderlich sind, muss das Builder-Muster nicht einbezogen werden, unabhängig davon, ob Sie / optionale Parameter angegeben haben oder nicht.
quelle
Zusätzlich zu dem, was Ixrec gesagt hat, ermöglichen es die Konstruktoren oder Methoden mit dem Namen parameters nicht, dass sich Ihr Objekt in einem Zustand befindet, in dem es noch geändert werden kann, bevor es erstellt wird. Dies ist das Schöne am Builder, wo Sie Teile seiner Konstruktion an verschiedene Methoden oder Klassen delegieren können:
Grundsätzlich können Sie Ihren Builder auch so lange um Ihr System herumwerfen, bis das endgültige Objekt erstellt werden kann. Auf diese Weise können Sie das Wissen verringern, das Ihr Builder-Consumer benötigt.
quelle
Es hängt davon ab, was Sie mit dem Builder machen.
Wenn Sie den Builder nur zum Festlegen (und Variieren) von Objekteigenschaften und zum (Aufschieben) der Objekterstellung verwenden, kann er durch benannte Parameter ersetzt werden.
Wenn Sie den Builder ersetzen, kann es sein, dass Sie den von @Ixrec erwähnten Kompromiss zwischen Lesbarkeit und Verwendung eingegangen sind (oder nicht, dies hängt davon ab, was Sie mit dem Builder tun).
Wenn Ihr Builder jedoch mehr als nur die Eigenschaften enthält und jeder Konstruktionsschritt logisch ist, kann er nicht ersetzt werden.
MockBuilder ist ein Beispiel, bei dem es nicht durch benannte Parameter ersetzt werden kann. Von der Seite:
quelle
Das Builder-Muster ist wichtig, wenn Sie mit unveränderlichen Objekten arbeiten. Die Arbeit mit unveränderlichen Objekten hat viele Vorteile, insbesondere, wenn Sie Ihr Programm in einer gleichzeitigen Umgebung (z. B. Threads) stabiler ausführen.
quelle
new Integer(42)
,new BigDecimal("42.000")
undnew String("foobar")
sind alle Konstrukteure zu immutables , die ... na ja, ein Baumeister unnötig für diese Fälle komplex sein würde. Ein Builder ist also nicht unbedingt für die Arbeit mit unveränderlichen Dateien erforderlich, wenn Konstruktoren genauso gut funktionieren können.