Cuando se usa un lenguaje que admite argumentos con nombre y opcionales, ¿el patrón de construcción ya no tiene un uso práctico?
Constructor:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Argumentos opcionales / nombrados:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Paul Nikonowicz
fuente
fuente
Respuestas:
Los constructores son más útiles cuando su objeto necesita muchos argumentos / dependencias para ser útil, o si desea permitir muchas formas diferentes de construir el objeto.
Fuera de mi cabeza, puedo imaginar que alguien quiera "construir" objetos en un juego 3D como este:
Yo diría que este ejemplo es más legible con los métodos de creación que he creado justo ahora que con los parámetros opcionales:
En particular, la información implícita en los nombres de los métodos de creación debe reemplazarse por más parámetros, y es mucho más fácil olvidarse de un parámetro en un grupo de parámetros estrechamente relacionados. De hecho, falta el sombreador de fragmentos, pero no lo notarías a menos que supieras buscarlo.
Por supuesto, si su objeto solo requiere de uno a cinco argumentos para construir, no hay necesidad de involucrar el patrón de construcción, ya sea que haya nombrado o no parámetros opcionales.
fuente
Además de lo que dijo Ixrec, los constructores o los parámetros nombrados por el método no le permitirán tener su objeto en un estado por construir en el que aún pueda modificarse antes de construirlo. Esta es la belleza del generador, donde puede delegar partes de su construcción a diferentes métodos o clases juntas:
Básicamente, también puede lanzar su constructor alrededor de su sistema hasta que esté listo para construir el objeto final, lo que le permite disminuir la cantidad de conocimiento que su constructor-consumidor necesita tener.
fuente
Depende de lo que esté haciendo con el constructor.
Si está utilizando el generador solo para establecer (y variar) las propiedades del objeto y (diferir) la creación del objeto, se puede reemplazar con parámetros con nombre.
Al reemplazar el constructor, es posible que tenga el compromiso de legibilidad / uso que mencionó @Ixrec (o puede que no lo tenga, depende de lo que esté haciendo con el constructor).
Sin embargo, si su constructor hace más que simplemente mantener las propiedades y cada paso de construcción involucra lógica, no puede ser reemplazado.
MockBuilder es un ejemplo en el que no se puede reemplazar con parámetros con nombre. De la página:
fuente
El patrón de construcción es esencial cuando se trabaja con objetos inmutables. Hay muchos beneficios al trabajar con objetos inmutables, especialmente al hacer que su programa sea más robusto al ejecutarse en un entorno concurrente (es decir, subprocesos)
fuente
new Integer(42)
,new BigDecimal("42.000")
ynew String("foobar")
son todos los constructores a inmutables que ... bueno, un constructor sería innecesariamente compleja para estos casos. Por lo tanto, un constructor no es esencial para trabajar con inmutables cuando los constructores pueden funcionar igual de bien.