Cuando hablamos de Clean Code, una de las reglas básicas es utilizar nombres descriptivos que declaren la intención. Esto es trivial en métodos y variables, pero los constructores tienen un nombre fijo y único, y cuando empiezan a aparecer sobrecargas, esa imposibilidad de nombrarlos de forma expresiva penaliza la claridad y legibilidad del código. Es ahí donde Robert C. Martin sugiere en su libro Clean Code el uso de métodos de factoría y constructores privados.
El problema con la sobrecarga de constructores
A priori, la sobrecarga de constructores parece una solución práctica que nos permite declarar tantos como necesitemos y haciendo cualquier combinación de atributos, según las necesidades del código.
| |
Pero esta sobrecarga escala muy mal y penaliza la legibilidad y comprensión. No sabemos qué representa cada parámetro, son ambiguos y amplían la posibilidad de error aunque el programador invierta tiempo en repasar su definición antes de cada uso.
| |
Uso de métodos factoría
Los métodos de factoría (factory methods) son métodos estáticos con nombre, ayudan a resolver esta ambigüedad y expresar y definir de manera más clara qué se está creando. Para evitar totalmente la ambigüedad, los constructores pueden ser privados.
| |
| |
Ventajas clave
- Claridad: los nombres expresan la intención.
- Flexibilidad: se pueden devolver subtipos, instancias cacheadas, objetos inmutables, etc.
- Ocultan la complejidad: se centraliza la lógica de creación en un único punto.
- Evolución más sencilla: se puede ampliar el comportamiento sin romper constructores existentes.
Cuando es mejor usar un Builder
Si la clase cuenta con muchos parámetros, y/o muchos de ellos son opcionales y, además, queremos incluir una lógica de validación compleja y configuraciones combinatorias (valores de un atributo condicionados al valor de otro), los Builder pasan a ser la solución más potente e indicada.
Conclusiones
Para casos simples, un constructor normal está bien. Pero cuando tenemos varias formas de crear el mismo objeto o una lógica de inicialización con cierta complejidad, el uso de métodos de factoría o Builders se posicionan como una solución más clara. El objetivo final es que el código sea fácil de leer, más difícil de romper y más sencillo de extender.