2012-11-10 1 views
0

Possible en double:
What does the single responsibility principle mean for validationsur la "Responsabilité unique" et la pratique de codage pour la validation de l'objet

Cas A: Valider objet -> Envoyer à la méthode -> Méthode suppose objet valide -> La méthode s'exécute
Cas B: Envoyer à la méthode -> Méthode vérifie la validité de l'objet -> La méthode s'exécute UNIQUEMENT SI valide

Dans le cas A, I peut avoir la méthode responsable d'une tâche (exécuter). Cependant, je peux accidentellement passer un objet invalide. (Bien sûr, je peux éviter cela avec un codage soigneux, mais c'est le cœur de ma question ...)

Dans le cas B, la méthode ne s'exécutera jamais sur un objet invalide, mais elle doit être responsable non seulement de l'exécution son code mais aussi la validation de l'objet. N'est-ce pas une sorte de violation de la «responsabilité unique»?

MERCI!

+1

Si la validation n'est pas évidente (plus de 2/3 lignes de codes) que je préfère personnellement passer à une autre méthode. Si la validation est partagée entre différentes méthodes de classes, je la déplacerais vers une autre classe. Je lance une application excpetion pour signaler des problèmes de validation. Le principe de la responsabilité unique concerne les classes et non les méthodes. –

+0

En toute justice, je préfère utiliser le SRP à des méthodes aussi, le code est beaucoup plus maintenable de cette façon. Une méthode qui obtient des choses à partir de DB, met à jour les stats, etc. Les petites méthodes impliquent SRP et vous voulez plusieurs méthodes clairement définies au lieu de deux ou trois béhémots. – MikeSW

Répondre

1

La meilleure pratique de codage serait

Cas C: Les objets sont valables par la construction ce qui signifie qu'il est impossible de construire une instance non valide, et toute transition de méthodes à un état valide lorsque appelé dans un état valide.

Dans ce cas, l'objet lui-même est responsable de sa validité, et tous les contrôles supplémentaires sont juste là pour échouer rapidement si l'objet n'est pas à la hauteur de ses garanties.


Par exemple, avec une liste chaînée, vous pourriez avoir des passants et des récepteurs en vérifiant que la liste est bien formée, mais il y a beaucoup de potentiellement chacun et vous donc nécessairement double emploi. Si la liste-liée est elle-même responsable de sa propre validité, ses opérations create/add/remove/concatenate/copy conservent toutes la validité, alors une seule classe est impliquée et cela a un travail plus facile puisqu'elle a un accès privilégié aux particuliers.

+0

Pour extraire une "règle" de ce que Mike a dit: Les objets DOIVENT être TOUJOURS dans un état valide. Ensuite, les méthodes ont seulement besoin de vérifier null. Pour les cas où vous devez passer des primitives (string, integer etc) qui ont des règles, mieux vaut en faire un objet de valeur. Cela simplifiera les choses et leur donnera une signification sémantique. La chaîne peut signifier tout, mais "Email" indique ce que vous devez savoir sur cette valeur – MikeSW

+0

@MikeSW, et "TOUJOURS" signifie chaque fois que l'on peut y accéder, donc dans un environnement multithread, les mutateurs et accesseurs pour l'état étant seulement mutés fonctionner en exclusion mutuelle, et dans un environnement monothread entre les appels d'instances d'autres classes. –

Questions connexes