Recentemente, durante uma revisão de código, me deparei com um código escrito por um novo colega, que contém um padrão com um cheiro. Suspeito que as decisões de meu colega sejam baseadas em regras propostas pelo famoso livro Clean Code (e talvez por outros livros semelhantes).
Entendo que o construtor da classe é totalmente responsável pela criação de um objeto válido e que sua principal tarefa é a atribuição das propriedades (privadas) de um objeto. Obviamente, pode ocorrer que valores de propriedades opcionais possam ser definidos por outros métodos que não o construtor da classe, mas essas situações são bastante raras (embora não necessariamente erradas, desde que o restante da classe leve em consideração a opcionalidade dessa propriedade). Isso é importante, pois permite garantir que o objeto esteja sempre em um estado válido.
No entanto, no código que encontrei, a maioria dos valores de propriedades é realmente definida por outros métodos que não o construtor. Os valores resultantes dos cálculos são atribuídos a propriedades a serem usadas dentro de vários métodos particulares em toda a classe. Aparentemente, o autor usa propriedades de classe como se fossem variáveis globais que deveriam estar acessíveis em toda a classe, em vez de parametrizar esses valores para as funções que precisam delas. Além disso, os métodos da classe devem ser chamados em uma ordem específica, porque a classe não fará muito de outra maneira.
Suspeito que esse código tenha sido inspirado pelo conselho de manter os métodos curtos (<= 5 linhas de código), para evitar grandes listas de parâmetros (<3 parâmetros) e que os construtores não devem funcionar (como executar algum tipo de cálculo) essencial para a validade do objeto).
Agora, é claro, eu poderia argumentar contra esse padrão se puder provar que todos os tipos de erros indefinidos potencialmente surgem quando os métodos não são chamados em uma ordem específica. No entanto, prevejo que a resposta a isso incluirá validações que verificam que as propriedades devem ser configuradas quando os métodos são chamados e que precisam dessas propriedades.
No entanto, prefiro alterar completamente o código, para que a classe se torne uma cópia azul de um objeto real, em vez de uma série de métodos que devem ser chamados (proceduralmente) em uma ordem específica.
Eu sinto que o código que encontrei cheira. Na verdade, acredito que exista uma distinção bastante clara sobre quando salvar um valor em uma propriedade de classe e quando colocá-lo em um parâmetro para um método diferente de usar - eu realmente não acredito que eles possam ser alternativas um para o outro . Estou procurando as palavras para esta distinção.