Mi capita spesso di imbattermi in questo problema, soprattutto in Java, anche se penso che sia un problema OOP generale. Cioè: sollevare un'eccezione rivela un problema di progettazione.
Supponiamo che io abbia una classe che ha un String name
campo e un String surname
campo.
Quindi utilizza quei campi per comporre il nome completo di una persona al fine di visualizzarlo 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 lanciando un errore se displayCompleteNameOnInvoice
viene chiamato prima che il nome sia stato assegnato. Sembra una buona idea, vero?
Posso aggiungere un getCompleteName
metodo per aumentare le eccezioni al metodo. Ma in questo modo sto violando un contratto "implicito" con l'utente della classe; in generale i getter non dovrebbero generare eccezioni se i loro valori non sono impostati. Ok, questo non è un getter standard poiché non restituisce un singolo campo, ma dal punto di vista dell'utente la distinzione potrebbe essere troppo sottile per pensarci.
Oppure posso generare l'eccezione dall'interno di displayCompleteNameOnInvoice
. Ma per fare ciò dovrei testare direttamente name
o surname
campi e così facendo violerei l'astrazione rappresentata da getCompleteName
. È responsabilità di questo metodo verificare e creare il nome completo. Potrebbe persino decidere, basando la decisione su altri dati, che in alcuni casi è sufficiente il surname
.
Quindi l'unica possibilità sembra cambiare la semantica del metodo getCompleteName
a composeCompleteName
, che suggerisce un comportamento più 'attivo' e, con essa, la capacità di un'eccezione.
È questa la migliore soluzione di design? Sono sempre alla ricerca del miglior equilibrio tra semplicità e correttezza. Esiste un riferimento di progettazione per questo problema?
displayCompleteNameOnInvoice
può semplicemente generare un'eccezione se getCompleteName
ritorna null
, no?