Je rencontre souvent ce problème, en particulier en Java, même s’il s’agit d’un problème général de programmation orientée objet. Autrement dit, le fait de lever une exception révèle un problème de conception.
Supposons que j'ai une classe qui a un String name
champ et un String surname
champ.
Ensuite, il utilise ces champs pour composer le nom complet d'une personne afin de l'afficher sur un type de document, par exemple une facture.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Maintenant, je veux renforcer le comportement de ma classe en générant une erreur si le displayCompleteNameOnInvoice
nom est appelé avant que le nom ait été attribué. Cela semble une bonne idée, n'est-ce pas?
Je peux ajouter un code d'exception à la getCompleteName
méthode. Mais de cette façon, je viole un contrat «implicite» avec l'utilisateur de la classe. En général, les getters ne sont pas supposés lancer des exceptions si leurs valeurs ne sont pas définies. Ok, ce n’est pas un getter standard car il ne renvoie pas un seul champ, mais du point de vue de l’utilisateur, la distinction peut être trop subtile pour y penser.
Ou je peux jeter l'exception de l'intérieur displayCompleteNameOnInvoice
. Mais pour le faire, je dois tester directement name
ou surname
champs et ce faisant, je violeriez l'abstraction représentée par getCompleteName
. C'est la responsabilité de cette méthode de vérifier et de créer le nom complet. Il pourrait même décider, en se basant sur d’autres données, que cela suffit dans certains cas surname
.
Ainsi, la seule possibilité semble changer la sémantique de la méthode getCompleteName
en composeCompleteName
, ce qui suggère un comportement plus «actif» et, avec lui, la capacité de lancer une exception.
Est-ce la meilleure solution de conception? Je recherche toujours le meilleur équilibre entre simplicité et exactitude. Existe-t-il une référence de conception pour ce problème?
displayCompleteNameOnInvoice
peut simplement lever une exception si getCompleteName
retourne null
, n'est-ce pas?