Recientemente, durante una revisión del código, encontré un código, escrito por un nuevo colega, que contiene un patrón con olor. Sospecho que las decisiones de mi colega se basan en las reglas propuestas por el famoso libro Clean Code (y quizás también por otros libros similares).
Tengo entendido que el constructor de la clase es completamente responsable de la creación de un objeto válido y que su tarea principal es la asignación de las propiedades (privadas) de un objeto. Por supuesto, podría ocurrir que los valores de las propiedades opcionales se puedan establecer mediante métodos distintos al constructor de la clase, pero estas situaciones son bastante raras (aunque no necesariamente erróneas, siempre que el resto de la clase tenga en cuenta la opcionalidad de dicha propiedad). Esto es importante porque permite garantizar que el objeto esté siempre en un estado válido.
Sin embargo, en el código que encontré, la mayoría de los valores de las propiedades se establecen en realidad por métodos distintos al constructor. Los valores que resultan de los cálculos se asignan a las propiedades que se utilizarán dentro de varios métodos privados en toda la clase. El autor aparentemente usa las propiedades de la clase como si fueran variables globales que deberían ser accesibles en toda la clase, en lugar de parametrizar estos valores a las funciones que los necesitan. Además, los métodos de la clase deben llamarse en un orden específico, porque la clase no hará mucho de lo contrario.
Sospecho que este código se ha inspirado en el consejo de mantener los métodos cortos (< = 5 líneas de código), para evitar grandes listas de parámetros (< 3 parámetros) y que los constructores no deben trabajar (como realizar un cálculo de algún tipo que es esencial para la validez del objeto).
Ahora, por supuesto, podría argumentar en contra de este patrón si puedo demostrar que potencialmente todos los tipos de errores indefinidos surgen cuando los métodos no se llaman en un orden específico. Sin embargo, predigo que la respuesta a esto será la adición de validaciones que verifiquen que las propiedades deben establecerse una vez que se llaman los métodos que necesitan que esas propiedades estén establecidas.
Sin embargo, me gustaría proponer cambiar por completo el código, de modo que la clase se convierta en una copia impresa de un objeto real, en lugar de una serie de métodos que deberían llamarse (de manera procesal) en un orden específico.
Siento que el código que encontré huele. De hecho, creo que existe una distinción bastante clara en cuanto a cuándo guardar un valor en una propiedad de clase y cuándo ponerlo en un parámetro para que se use un método diferente. Realmente no creo que puedan ser alternativas entre sí. . Estoy buscando las palabras para esta distinción.