L'apprentissage Principe de Responsabilité Unique avec C#
Je suis en train d'apprendre le Principe de Responsabilité Unique (SRP), mais il est assez difficile car j'ai un énorme, difficile à comprendre quand et ce que je dois retirer d'une classe et où je devrais mettre/organiser.
J'ai été googler autour de certains matériaux et des exemples de code, mais la plupart des matériaux que j'ai trouvé, au lieu de le rendre plus facile à comprendre, il était difficile à comprendre.
Par exemple si j'ai une liste d'Utilisateurs et à partir de cette Liste que j'ai un
la classe de Contrôle, qui fait beaucoup de choses comme Envoyer une salutation et
au revoir d'un message lorsqu'un utilisateur vient de sortir/, vérifier la météo de l'utilisateur
doit être capable de saisir ou pas, et le coup de lui, de recevoir des commandes de l'utilisateur et des messages, etc.
À partir de l'exemple que vous n'avez pas besoin de beaucoup pour comprendre que je fais déjà trop dans une classe, mais pourtant je ne suis pas assez clair sur la manière de répartir et de les réorganiser par la suite.
Si je comprends la SRP, je voudrais avoir une classe pour rejoindre un canal, pour le salut et au revoir, une classe pour la vérification de l'utilisateur, une classe pour la lecture les commandes, non ?
Mais où et comment puis-je utiliser le coup de pied par exemple ?
J'ai la vérification de la classe donc je suis sûr que j'aurais de toute sorte de vérification de l'utilisateur en y incluant le temps ou pas l'utilisateur devrait être expulsé.
De sorte que le coup de pied de fonction serait à l'intérieur du canal de rejoindre la classe et d'être appelé si la vérification échoue ?
Par exemple:
public void UserJoin(User user)
{
if (verify.CanJoin(user))
{
messages.Greeting(user);
}
else
{
this.kick(user);
}
}
Apprécierais si vous les gars pourrait me prêter un coup de main ici avec facile à comprendre, C# matériaux qui sont en ligne et gratuit ou en me montrant comment j'allais être le fractionnement de la citée en exemple et, si possible, des exemples de codes, des conseils, etc.
- pendant que vous êtes sur ce sujet, jetez aussi un oeil à l'injection de dépendance. c'est une bonne idée de définir des interfaces et ensuite utiliser un conteneur IoC à découpler votre comportement de l'utilisateur de la logique. mais, c'est sans doute beaucoup trop à apprendre à la fois
- en.wikipedia.org/wiki/Solid_(objet oriented_design)
- Je pense que cette question serait d'obtenir de meilleures réponses sur les programmeurs.se
- Je pense que oui si la réponse est juste au sujet de la discussion, mais il n'est pas seulement cela.
- Plutôt intéressant qui, de nouveau, quelqu'un a voté pour fermé ce sans aucune raison apparente(après le vote de proximité a été effacé au début) peut-être qu'il est vraiment énervé avec cette question 🙁 désolé pour qui aurait encore envie de comprendre pourquoi vous avez voulu fermer si mal, hâte de votre commentaire.
Vous devez vous connecter pour publier un commentaire.
Commençons par ce qui ne Principe De Responsabilité Unique (SRP) signifie réellement:
Une classe ne doit avoir qu'une seule raison de changer.
Effectivement cela signifie que chaque objet (classe) doit avoir une seule responsabilité, si une classe a plus d'un responsable de ces responsabilités, le tempo ne peut pas être exécuté de façon autonome, c'est à dire des changements dans l'un peut influencer ou même de briser l'autre dans une mise en oeuvre particulière.
Un must read pour ce qui est de la source elle-même (pdf chapitre de "Le Développement Logiciel Agile, Principes, Modèles et Pratiques"): Le Principe De Responsabilité Unique
Avoir dit que, vous devez concevoir vos classes si elles idéalement une chose et faire une chose bien.
D'abord penser à ce que les “entités” vous avez, dans votre exemple, je peux voir
User
etChannel
et le moyen par lequel ils communiquent (“messages"). Ces entités entretiennent des relations les uns avec les autres:Cela conduit naturellement à la suite de la liste des fonctionnalités:
canal
SRP est un concept important, mais doit à peine se tenir par lui-même – tout aussi important pour votre conception est la Inversion De Dépendance Principe (DIP). De les intégrer dans la conception rappelez-vous que votre particulier dans les implémentations de la
User
,Message
etChannel
entités dépendent d'une abstraction ou de l'interface, plutôt que la mise en œuvre concrète. Pour cette raison, nous commençons avec la conception d'interfaces qui ne sont pas les classes de béton:Ce que cette liste ne nous dit pas, est pour quelle raison ces fonctionnalités sont exécutées. Nous sommes mieux de mettre la responsabilité de “pourquoi” (gestion des utilisateurs et de contrôle) dans une entité distincte – de cette façon, le
User
etChannel
entités n'ont pas de changer de si le “pourquoi” du changement. Nous pouvons utiliser le modèle de stratégie et DI ici et peut avoir n'importe quelle mise en œuvre concrète deIChannel
dépendent d'unIUserControl
entité qui nous donne le "pourquoi".Vous voyez que, dans la conception ci-dessus SRP n'est même pas proche de la perfection, c'est à dire un
IChannel
est toujours dépendante du abstractionsIUser
etIMessage
.À la fin, on devrait s'efforcer de souplesse, faiblement couplées, la conception, mais il y a toujours des compromis à être réalisés, et les zones grises également selon l'endroit où vous attendre votre demande de changement.
PRS prises à la extrême à mon avis, conduit à de très souples, mais aussi fragmenté et complexe de code qui pourrait ne pas être aussi facile à comprendre que plus simple mais un peu plus étroitement couplé code.
En fait, si deux responsabilités sont toujours devrait changer dans le même temps, vous avez sans doute ne doit pas les séparer en différentes classes que cela entraînerait, pour citer Martin, à une "odeur de la Complexité Inutile". Il en est de même pour les responsabilités qui ne changent jamais, le comportement est invariant, et il n'est pas nécessaire de le découper.
L'idée principale ici est que vous devez faire un appel de jugement où vous voyez des responsabilités/comportement peut être modifié de façon autonome dans l'avenir, dont le comportement est co-dépendants les uns des autres et changera toujours à la même époque ("lié à la hanche") et dont le comportement ne changera jamais, en premier lieu.
grey areas also depending on where you expect your application to change.
Je suis un peu confus ici, seriez-vous capable de peut-être détailler un peu plus ?In fact if two responsibilities are always expected to change at the same time
Par vous dire que l'abstraction peut être tenue fonctions qui fini par aller hors site à partir de ses fins ?J'ai passé un très bon moment d'apprentissage de ce principe. Il m'a été présentée dans trois petites, des bouchées de pièces:
Code qui répond à ces critères répond à l'Unique Principe de Responsabilité.
Dans votre code ci-dessus,
UserJoin ne pas s'acquitter de la SRP; il est en train de faire deux choses à savoir, à l'accueil de l'utilisateur si ils peuvent se joindre, ou de les rejeter si elles ne le peuvent pas. Il pourrait être préférable à une réorganisation de la méthode:
Fonctionnellement, ce n'est pas différent du code posté. Cependant, ce code est plus facile à maintenir; que si une nouvelle règle d'entreprise est venu vers le bas qui, en raison de la récente cybersécurité des attaques, vous souhaitez enregistrer les rejetés adresse IP de l'utilisateur? Il vous suffit de modifier la méthode de RejectUser. Que faire si vous voulez afficher des messages supplémentaires sur la connexion de l'utilisateur? Juste méthode de mise à jour GreetUser.
SRP dans mon expérience maintenable code. Et maintenable code a tendance à aller un long chemin vers la réalisation de l'autre, les éléments SOLIDES.
Ma recommandation est de commencer par la base: ce choses avez-vous? Vous avez mentionné plusieurs choses comme
Message
,User
,Channel
, etc. Au-delà de la simple choses, vous avez également comportements qui appartiennent à votre choses. Quelques exemples de comportements:Remarque que c'est juste une façon de le regarder. Vous pouvez résumé de l'une de ces comportements jusqu'à ce que l'abstraction ne veut rien dire et tout! Mais, une couche d'abstraction ne fait généralement pas mal.
À partir d'ici, il y a deux écoles de pensée dans la programmation orientée objet: encapsulation complète et unique responsabilité. Le premier, de vous conduire à encapsuler tous les comportements liés à l'intérieur de son propriétaire de l'objet (ce qui inflexible de la conception, tandis que le second ne vous le conseille (résultant en couplage lâche et souple).
Je voudrais aller sur, mais il est tard et j'ai besoin de dormir un peu... je suis ce qui en fait une communauté post, si quelqu'un peut finir ce que j'ai commencé et d'améliorer ce que j'ai eu jusqu'à présent...
Heureux d'apprendre!