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 namechamp et un String surnamechamp.
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 displayCompleteNameOnInvoicenom 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 getCompleteNamemé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 nameou surnamechamps 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 getCompleteNameen 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?
displayCompleteNameOnInvoicepeut simplement lever une exception si getCompleteNameretourne null, n'est-ce pas?