Recientemente, durante una revisión de código, me encontré con 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 reglas propuestas por el famoso libro Clean Code (y quizás también por otros libros similares).
Entiendo 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 propiedad opcionales se puedan establecer por métodos distintos al constructor de la clase, pero tales situaciones son bastante raras (aunque no necesariamente incorrectas, 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 propiedad se establecen en realidad por otros 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. Aparentemente, el autor 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 para las funciones que los necesitan. Además, los métodos de la clase deben llamarse en un orden específico, porque de lo contrario la clase no hará mucho.
Sospecho que este código se inspiró en los consejos para mantener los métodos cortos (<= 5 líneas de código), para evitar listas de parámetros grandes (<3 parámetros) y que los constructores no deben trabajar (como realizar algún tipo de cálculo) eso es esencial para la validez del objeto).
Ahora, por supuesto, podría presentar un caso en contra de este patrón si puedo demostrar que todo tipo de errores indefinidos potencialmente surgen cuando los métodos no se invocan en un orden específico. Sin embargo, predigo que la respuesta a esto será agregar validaciones que verifiquen que las propiedades deben establecerse una vez que se invocan los métodos que necesitan que se establezcan esas propiedades.
Sin embargo, preferiría proponer cambiar completamente el código, de modo que la clase se convierta en una copia original 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 lo use un método diferente; realmente no creo que puedan ser alternativas entre sí . Estoy buscando las palabras para esta distinción.