Spesso mi imbatto in questo problema, specialmente in Java, anche se penso che sia un problema generale di OOP. Ovvero: sollevare un'eccezione rivela un problema di progettazione.
Supponiamo di avere una classe con un campo String name
e un campo String surname
.
Quindi utilizza questi campi per comporre il nome completo di una persona per visualizzarla su una sorta di documento, ad esempio una fattura.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Ora voglio rafforzare il comportamento della mia classe generando un errore se il displayCompleteNameOnInvoice
viene chiamato prima che il nome sia stato assegnato. Sembra una buona idea, vero?
Posso aggiungere un codice di aumento delle eccezioni al metodo getCompleteName
.
Ma in questo modo sto violando un contratto "implicito" con l'utente della classe; in generale, i getter non devono generare eccezioni se i loro valori non sono impostati. Ok, questo non è un getter standard dal momento che non restituisce un singolo campo, ma dal punto di vista dell'utente la distinzione potrebbe essere troppo sottile per pensarci.
O posso lanciare l'eccezione dall'interno di displayCompleteNameOnInvoice
. Ma per farlo dovrei testare direttamente i campi name
o surname
e così facendo violerei l'astrazione rappresentata da getCompleteName
. È compito di questo metodo controllare e creare il nome completo. Potrebbe persino decidere, basando la decisione su altri dati, che in alcuni casi sia sufficiente il surname
.
Quindi l'unica possibilità sembra cambiare la semantica del metodo getCompleteName
in composeCompleteName
, che suggerisce un comportamento più 'attivo' e, con esso, la possibilità di lanciare un'eccezione.
Questa è la soluzione di design migliore? Sono sempre alla ricerca del miglior equilibrio tra semplicità e correttezza. C'è un riferimento al design per questo problema?