Recentemente durante una revisione del codice mi sono imbattuto in codice, scritto da un nuovo collega, che contiene un motivo con un odore. Sospetto che le decisioni del mio collega siano basate su regole proposte dal famoso libro del Codice Pulito (e forse anche da altri libri simili).
Ho capito che il costruttore di classi è interamente responsabile della creazione di un oggetto valido e che il suo compito principale è l'assegnazione delle proprietà (private) di un oggetto. Potrebbe naturalmente accadere che i valori di proprietà opzionali possano essere impostati con metodi diversi dal costruttore di classi, ma tali situazioni sono piuttosto rare (sebbene non necessariamente errate, a condizione che il resto della classe tenga conto dell'opportunità di tale proprietà). Questo è importante perché consente di garantire che l'oggetto sia sempre in uno stato valido.
Tuttavia, nel codice che ho incontrato, la maggior parte dei valori di proprietà sono effettivamente impostati da altri metodi rispetto al costruttore. I valori che risultano dai calcoli sono assegnati alle proprietà da utilizzare all'interno di diversi metodi privati in tutta la classe. L'autore utilizza apparentemente le proprietà di 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 altrimenti.
Sospetto che questo codice sia stato ispirato dal consiglio di mantenere i metodi brevi (< = 5 linee di codice), per evitare elenchi di parametri di grandi dimensioni (< 3 parametri) e che i costruttori non devono lavorare (come eseguire un calcolo di qualche tipo che è essenziale per la validità dell'oggetto).
Ora naturalmente potrei argomentare contro questo modello se posso dimostrare che tutti i tipi di errori non definiti possono sorgere quando i metodi non vengono chiamati in un ordine specifico. Tuttavia, prevedo che la risposta a questo sarà l'aggiunta di convalide che verificano che le proprietà devono essere impostate una volta che i metodi sono chiamati che hanno bisogno di quelle proprietà da impostare.
Preferirei piuttosto proporre di cambiare 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 odora. In effetti, credo che esista una distinzione abbastanza chiara su quando salvare un valore in una proprietà di classe e quando metterlo in un parametro per un metodo diverso da usare - non credo davvero che possano essere alternativi tra loro . Sto cercando le parole per questa distinzione.