Di recente, durante una revisione del codice, mi sono imbattuto in un codice, scritto da un nuovo collega, che contiene uno schema con un odore. Sospetto che le decisioni del mio collega si basino su regole proposte dal famoso libro Clean Code (e forse anche da altri libri simili).
Comprendo che il costruttore della classe è interamente responsabile della creazione di un oggetto valido e che il suo compito principale è l'assegnazione delle proprietà (private) di un oggetto. Naturalmente potrebbe accadere che valori di proprietà opzionali possano essere impostati con metodi diversi dal costruttore della classe, ma tali situazioni sono piuttosto rare (sebbene non necessariamente errate, a condizione che il resto della classe tenga conto dell'opzionalità di tale proprietà). Questo è importante perché consente di assicurarsi che l'oggetto sia sempre in uno stato valido.
Tuttavia, nel codice che ho riscontrato, la maggior parte dei valori di proprietà sono effettivamente impostati con metodi diversi dal costruttore. I valori risultanti dai calcoli sono assegnati a proprietà da utilizzare all'interno di diversi metodi privati in tutta la classe. Apparentemente l'autore usa le proprietà della classe come se fossero variabili globali che dovrebbero essere accessibili in tutta la classe, invece di parametrizzare questi valori alle funzioni che ne hanno bisogno. Inoltre, i metodi della classe dovrebbero essere chiamati in un ordine specifico, perché la classe non farà molto diversamente.
Sospetto che questo codice sia stato ispirato dal consiglio di mantenere i metodi brevi (<= 5 righe di codice), per evitare grandi elenchi di parametri (<3 parametri) e che i costruttori non devono funzionare (come eseguire un calcolo di qualche tipo questo è essenziale per la validità dell'oggetto).
Ora, naturalmente, potrei presentare un ricorso contro questo modello se posso dimostrare che tutti i tipi di errori indefiniti sorgono potenzialmente quando i metodi non vengono chiamati in un ordine specifico. Tuttavia, prevedo che la risposta a questa sarà l'aggiunta di convalide che verificano che le proprietà debbano essere impostate una volta chiamati i metodi che richiedono l'impostazione di tali proprietà.
Preferirei piuttosto proporre di modificare completamente il codice, in modo che la classe diventi una stampa blu su un oggetto reale, piuttosto che una serie di metodi che dovrebbero essere chiamati (proceduralmente) in un ordine specifico.
Sento che il codice che ho incontrato ha un odore. In effetti, credo che esista una distinzione piuttosto chiara su quando salvare un valore in una proprietà di classe e quando inserirlo in un parametro per un metodo diverso da usare - Non credo davvero che possano essere alternative l'una all'altra . Sto cercando le parole per questa distinzione.