Il s'agit d'une question sur le concept d'une fonction qui ne fait qu'une seule chose. Elle n'aura pas de sens sans quelques passages pertinents pour le contexte, je vais donc les citer ici. Ils apparaissent aux pages 37-38 :
Pour le dire autrement, nous voulons pouvoir lire le programme comme s'il s'agissait d'un ensemble de paragraphes TO, chacun d'entre eux décrivant le niveau d'abstraction actuel et faisant référence aux paragraphes TO suivants au niveau inférieur.
Pour inclure les mises en place et les démontages, nous incluons les mises en place, puis nous incluons le contenu de la page de test, et enfin nous incluons les démontages. Pour inclure les configurations, nous incluons la configuration de la suite s'il s'agit d'une suite, puis nous incluons la configuration normale.
Il s'avère très difficile pour les programmeurs d'apprendre à suivre cette règle et d'écrire fonctions qui restent à un seul niveau d'abstraction. Mais apprendre cette astuce est aussi très important. C'est la clé pour que les fonctions soient courtes et qu'elles fassent "une seule chose". Faire en sorte que le code se lise comme un ensemble descendant de paragraphes TO est une technique efficace pour pour maintenir un niveau d'abstraction cohérent.
Il donne ensuite l'exemple suivant de code médiocre :
public Money calculatePay(Employee e)
throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
et explique les problèmes qu'elle pose comme suit :
Cette fonction pose plusieurs problèmes. Tout d'abord, elle est volumineuse, et lorsque de nouvelles types d'employés sont ajoutés, elle augmentera. Deuxièmement, elle fait très clairement plus d'une chose. Troisièmement, elle viole le principe de la responsabilité unique7 (SRP) car il y a plus d'une raison pour laquelle elle raison pour laquelle il doit changer. Quatrièmement, il viole le principe d'ouverture et de fermeture8 (OCP) parce qu'il doit changer chaque fois que de nouveaux types sont ajoutés.
Maintenant mes questions.
Pour commencer, il est clair pour moi qu'il viole l'OCP, et il est clair pour moi que cela seul en fait une mauvaise conception. Cependant, j'essaie de comprendre chaque principe, et je ne vois pas très bien comment l'ASR s'applique. Plus précisément, la seule raison que je puisse imaginer pour que cette méthode change est l'ajout de nouveaux types d'employés. Il n'y a qu'un seul "axe de changement". Si les détails du calcul devaient changer, cela n'affecterait que les sous-méthodes telles que "calculateHourlyPay()"
De plus, si, dans un sens, il fait manifestement trois choses, ces trois choses se situent toutes au même niveau d'abstraction et peuvent toutes être regroupées dans un paragraphe d'OT identique à celui de l'exemple : Pour calculer la rémunération d'un employé, on calcule la rémunération à la commission si l'employé est à la commission, la rémunération horaire s'il est à l'heure, etc. . Ainsi, à part sa violation de l'OCP, ce code semble être conforme aux autres exigences de Martin en matière de code propre, même s'il soutient le contraire.
Quelqu'un peut-il m'expliquer ce que je rate ?
Merci.