La responsabilité unique peut ne pas être quelque chose qu'une seule fonction peut remplir.
class Location {
public int getX() {
return x;
}
public int getY() {
return y;
}
}
Cette classe peut casser le principe de responsabilité unique. Non pas parce qu'il a deux fonctions, mais si le code doit getX()
et getY()
doit satisfaire différentes parties prenantes qui peuvent exiger un changement. Si le vice-président, M. X envoie un mémo indiquant que tous les nombres doivent être exprimés en nombres à virgule flottante et que la directrice de la comptabilité, Mme Y, insiste sur le fait que tous les chiffres examinés par son service doivent rester des nombres entiers, indépendamment de ce que M. X pense bien, cette classe aurait intérêt à avoir une seule idée de qui est responsable, car les choses sont sur le point de devenir confuses.
Si SRP avait été suivi, il serait clair si la classe Location contribue aux éléments exposés par M. X et son groupe. Expliquez clairement à quoi la classe est responsable et vous saurez quelle directive aura une incidence sur cette classe. S'ils ont tous les deux un impact sur cette classe, elle a été mal conçue pour minimiser l'impact du changement. "Une classe ne devrait avoir qu'une seule raison de changer" ne signifie pas que la classe entière ne peut faire qu'une seule petite chose. Cela signifie que je ne devrais pas être capable de regarder la classe et de dire que M. X et Mme Y ont un intérêt pour cette classe.
Autre que des choses comme ça. Non, plusieurs méthodes conviennent. Donnez-lui simplement un nom qui précise quelles méthodes appartiennent à la classe et lesquelles ne le sont pas.
Le PÉR d'Oncle Bob concerne plus la loi de Conway que la loi de Curly . Oncle Bob préconise d'appliquer la loi de Curly (faire une chose) à des fonctions et non à des classes. SRP met en garde contre le mélange des raisons de changer ensemble. La loi de Conway stipule que le système suivra la manière dont les informations d'une organisation circulent. Cela conduit à suivre le PÉR parce que vous ne vous souciez pas de ce dont vous n'avez jamais entendu parler.
"Un module devrait être responsable devant un, et un seul acteur"
Robert C Martin - Architecture propre
Les gens continuent de vouloir que SRP traite de toutes les raisons pour limiter la portée. Il y a plus de raisons de limiter la portée que SRP. Je limite encore la portée en insistant pour que la classe soit une abstraction pouvant prendre un nom qui garantisse que regarder à l'intérieur ne vous surprendra pas .
Vous pouvez appliquer la loi de Curly aux cours. Vous êtes en dehors de ce dont parle Oncle Bob, mais vous pouvez le faire. Vous vous trompez lorsque vous commencez à penser que cela signifie une fonction. C'est comme penser qu'une famille ne devrait avoir qu'un seul enfant. Avoir plus d'un enfant ne l'empêche pas d'être une famille.
Si vous appliquez la loi de Curly à une classe, tout dans la classe devrait concerner une seule idée unificatrice. Cette idée peut être large. L'idée pourrait être la persistance. Si certaines fonctions utilitaires de journalisation sont présentes, elles sont clairement déplacées. Peu importe si M. X est le seul à s'intéresser à ce code.
Le principe classique à appliquer ici s'appelle Séparation des préoccupations . Si vous séparez toutes vos préoccupations, on pourrait faire valoir que ce qui reste à un endroit donné est une préoccupation. C'est ce que nous appelions cette idée avant que le film City Slickers de 1991 ne nous présente le personnage Curly.
C'est bon. C'est simplement que ce que l'Oncle Bob appelle une responsabilité n'est pas une préoccupation. Une responsabilité envers lui n'est pas une chose sur laquelle vous vous concentrez. C'est quelque chose qui peut vous forcer à changer. Vous pouvez vous concentrer sur une préoccupation tout en créant un code responsable pour différents groupes de personnes ayant différents programmes.
Peut-être que vous ne vous souciez pas de ça. Bien. Penser que le fait de «faire une chose» résoudra tous vos problèmes de conception montre un manque d'imagination de ce qu'une «chose» peut finir par être. Une autre raison de limiter la portée est l'organisation. Vous pouvez imbriquer plusieurs "une chose" dans d'autres "une chose" jusqu'à ce que vous ayez un tiroir pour ordures plein de tout. J'ai parlé à ce sujet avant
Bien entendu, la raison classique pour limiter la portée de la programmation orientée objet est que la classe contient des champs privés et que, plutôt que d'utiliser des accesseurs pour partager ces données, nous plaçons toutes les méthodes nécessitant ces données dans la classe où elles peuvent utiliser les données en privé. Nombreux sont ceux qui trouvent cela trop restrictif à utiliser comme limiteur de portée, car toutes les méthodes qui appartiennent à la même classe n'utilisent pas exactement les mêmes champs. J'aime m'assurer que toute idée qui a réuni les données soit la même que celle qui a rassemblé les méthodes.
La manière fonctionnelle de regarder ceci est que a.f(x)
et a.g(x)
sont simplement f a (x) et g a (x). Pas deux fonctions mais un continuum de paires de fonctions qui varient ensemble. Le a
n'a même pas besoin d'y avoir de données. Il pourrait tout simplement savoir comment vous savez qui f
et la g
mise en œuvre que vous allez utiliser. Les fonctions qui changent ensemble vont de pair. C'est bon vieux polymorphisme.
SRP n'est qu'une des nombreuses raisons pour limiter la portée. C'est un bon. Mais pas le seul.