Czy podczas używania języka, który obsługuje argumenty nazwane i opcjonalne, wzorzec konstruktora nie ma już praktycznego zastosowania?
Budowniczy:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Argumenty opcjonalne / nazwane:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Paweł Nikonowicz
źródło
źródło
Odpowiedzi:
Konstruktory są najbardziej przydatne, gdy twój obiekt potrzebuje wielu argumentów / zależności, aby być użytecznym lub jeśli chcesz pozwolić na wiele różnych sposobów konstruowania obiektu.
Z czubka mojej głowy mogę sobie wyobrazić, że ktoś może chcieć „budować” obiekty w takiej grze 3D:
Argumentowałbym, że ten przykład jest bardziej czytelny dzięki metodom konstruktora, które właśnie stworzyłem, niż byłoby to z opcjonalnymi parametrami:
W szczególności informacje sugerowane przez nazwy metod konstruktora muszą zostać zastąpione jeszcze większą liczbą parametrów i o wiele łatwiej jest zapomnieć o jednym parametrze w grupie ściśle powiązanych parametrów. W rzeczywistości brakuje shadera fragmentów, ale nie zauważyłbyś tego, gdybyś nie wiedział, jak go szukać.
Oczywiście, jeśli twój obiekt wymaga tylko jednego do pięciu argumentów do skonstruowania, nie ma potrzeby angażowania wzorca konstruktora, niezależnie od tego, czy podałeś / nie parametry opcjonalne.
źródło
Oprócz tego, co powiedział Ixrec, konstruktory lub metody o nazwie parametry nie pozwolą ci ustawić obiektu w stanie, który ma zostać zbudowany, w którym można go jeszcze zmodyfikować przed jego zbudowaniem. To jest piękno Konstruktora, w którym możesz przekazać części jego konstrukcji innym metodom lub klasom:
Zasadniczo możesz także ominąć konstruktora wokół systemu, dopóki nie będzie on gotowy do zbudowania ostatecznego obiektu, co pozwoli ci zmniejszyć ilość wiedzy, którą musi posiadać konstruktor-konsument.
źródło
To zależy od tego, co robisz z konstruktorem.
Jeśli używasz konstruktora tylko do ustawiania (i zmieniania) właściwości obiektu i (odraczania) tworzenia obiektu, można go zastąpić nazwanymi parametrami.
Zastępując konstruktor, możesz mieć kompromis w zakresie czytelności / użytkowania, o którym wspomniał @Ixrec (lub może go nie mieć, zależy to od tego, co robisz z konstruktorem).
Jeśli jednak konstruktor nie tylko zachowuje właściwości, a każdy etap budowy wymaga logiki, nie można go zastąpić.
MockBuilder to przykład, w którym nie można go zastąpić nazwanymi parametrami. Ze strony:
źródło
Wzorzec konstruktora jest niezbędny podczas pracy z niezmiennymi obiektami. Istnieje wiele korzyści z pracy z niezmiennymi obiektami, szczególnie w zwiększaniu niezawodności programu w środowisku współbieżnym (tj. Wątkach)
źródło
new Integer(42)
,new BigDecimal("42.000")
inew String("foobar")
są konstruktorzy do immutables że ... dobrze, konstruktor byłyby niepotrzebnie skomplikowane dla tych przypadkach. Konstruktor nie jest więc niezbędny do pracy z niezmiennym, gdy konstruktory mogą równie dobrze działać.