Récemment, lors d'une revue de code, je suis tombé sur du code, écrit par un nouveau collègue, qui contient un motif avec une odeur. Je soupçonne que les décisions de mon collègue sont basées sur des règles proposées par le célèbre livre Clean Code (et peut-être aussi par d'autres livres similaires).
Je crois comprendre que le constructeur de classe est entièrement responsable de la création d'un objet valide et que sa tâche principale est l'attribution des propriétés (privées) d'un objet. Il peut bien sûr arriver que des valeurs de propriété facultatives puissent être définies par des méthodes autres que le constructeur de classe, mais de telles situations sont plutôt rares (bien que pas nécessairement fausses, à condition que le reste de la classe prenne en compte le caractère facultatif d'une telle propriété). C'est important, car cela permet de s'assurer que l'objet est toujours dans un état valide.
Cependant, dans le code que j'ai rencontré, la plupart des valeurs de propriété sont réellement définies par d'autres méthodes que le constructeur. Les valeurs qui résultent des calculs sont affectées aux propriétés à utiliser dans plusieurs méthodes privées de la classe. L'auteur utilise apparemment les propriétés de classe comme s'il s'agissait de variables globales qui devraient être accessibles dans toute la classe, au lieu de paramétrer ces valeurs pour les fonctions qui en ont besoin. De plus, les méthodes de la classe doivent être appelées dans un ordre spécifique, car la classe ne fera pas grand-chose autrement.
Je soupçonne que ce code a été inspiré par les conseils pour garder les méthodes courtes (<= 5 lignes de code), pour éviter les grandes listes de paramètres (<3 paramètres) et que les constructeurs ne doivent pas faire de travail (comme effectuer un calcul quelconque) c'est essentiel pour la validité de l'objet).
Maintenant, bien sûr, je pourrais plaider contre ce modèle si je peux prouver que toutes sortes d'erreurs non définies peuvent survenir lorsque les méthodes ne sont pas appelées dans un ordre spécifique. Cependant, je prédis que la réponse à cela va être l'ajout de validations qui vérifient que les propriétés doivent être définies une fois les méthodes appelées qui nécessitent que ces propriétés soient définies.
Je préférerais cependant proposer de changer complètement le code, de sorte que la classe devienne un imprimé bleu vers un objet réel, plutôt qu'une série de méthodes qui devraient être appelées (procéduralement) dans un ordre spécifique.
Je sens que le code que j'ai rencontré sent. En fait, je crois qu'il existe une distinction assez claire quant au moment de sauvegarder une valeur dans une propriété de classe et quand la mettre dans un paramètre pour une méthode différente à utiliser - je ne crois pas vraiment qu'ils puissent être des alternatives les uns aux autres . Je cherche les mots pour cette distinction.