Pour moi, le code passe-partout est évidemment mauvais. Cependant, j'ai rencontré un développeur qui affiche une résistance dans toute tentative de réduction du passe-partout. J'ai réalisé que je n'avais pas d'argument facilement formé et bien pensé après l'horreur que j'ai développée pour lui au fil du temps.
Pour que je puisse former un argument convaincant en faveur de moins de passe-partout, quels sont les contre-arguments? En d'autres termes, quels sont les arguments (le cas échéant) en faveur du passe-partout?
(Je veux dire ce que je pense être généralement entendu par passe-partout, mais un bon exemple est celui des getters et setters en Java.)
Réponses:
Une chose importante à retenir est que le code est généralement réduit en supprimant le contexte inutile. Si le compilateur peut comprendre quelque chose, l'argument va, il n'est pas nécessaire de l'écrire explicitement.
Et ce serait formidable si seul le compilateur était destiné à le lire. Mais rappelez-vous que "les programmes doivent être écrits pour que les gens puissent les lire, et accessoirement pour que les machines s'exécutent". (Ironiquement, cette citation provient d'un manuel consacré à l'une des langues les plus difficiles à lire pour les êtres humains ordinaires, en grande partie à cause de sa lourdeur excessive.)
Ce qui peut vous sembler ennuyeux et répétitif pendant que vous écrivez peut être un contexte précieux pour quelqu'un d'autre qui vient un an (ou cinq) plus tard et doit maintenir votre code.
WRT l'exemple Java en particulier, je conviens que c'est un bon exemple de mauvais passe-partout, car il peut être remplacé par quelque chose qui est à la fois plus court et plus facile à lire, et aussi plus flexible: Propriétés. Mais cela ne signifie pas que tous les éléments syntaxiques passe-partout de tous les langages sont aussi inutiles que les getters et setters de Java et C ++.
la source
Un argument en faveur du code passe-partout est que si vous le changez en un seul endroit, cela n'affecte qu'un seul flux du code. Cela doit être mis en balance avec le fait que le plus souvent, vous voulez en fait qu'un changement affecte chaque morceau de code qui l'utilise. Mais j'ai vu de rares exemples qui soutiennent l'argument.
Disons que vous avez un morceau de code qui dit
Ceci est utilisé à environ 2 endroits dans votre code.
Un jour, quelqu'un arrive et dit "ok, dans ce chemin seulement, nous voulons que vous grommitiez le bar avant de le faire."
Et vous pensez "bien c'est simple".
Ensuite, votre utilisateur ajoute de nouvelles fonctionnalités et vous estimez qu'il s'intègre bien avec FooTheBar. Et vous leur demandez consciencieusement si vous devez Grommit ce bar avant de vous Foo et ils disent "non, pas cette fois".
Il vous suffit donc d'appeler la méthode ci-dessus.
Mais alors votre utilisateur dit "ok, attendez, dans le troisième cas, nous voulons que vous griffonniez la barre avant d'appeler BeFooed."
Pas de problème, vous pensez, je peux le faire.
Soudain, votre code devient de moins en moins standard. Vous auriez peut-être dû accepter les deux lignes de code répétées. À présent, vous auriez trois morceaux de code, chacun de 2 à 3 lignes de long et ne semblant plus très répétés.
Tout cela étant dit, je contrerais cela avec "ce n'est pas un cas courant, et quand cela se produit, vous pouvez refactoriser".
Un autre argument que j'ai récemment entendu est que le code standard peut parfois vous aider à naviguer dans le code. L'exemple dont nous parlions était où nous avions supprimé des tonnes de code de mappage passe-partout et l'avons remplacé par AutoMapper. Maintenant, a-t-on soutenu, parce que tout est basé sur des conventions, vous ne pouvez pas dire "Où est cette propriété définie" à l'IDE et vous attendre à ce qu'il sache.
J'ai vu des gens discuter de choses similaires à propos des conteneurs IoC.
Je ne dis pas que je suis d'accord avec eux, mais c'est quand même un argument valable.
la source
L'évolution de l'efficacité
Vous commencez par ceci:
alors vous vous débarrassez de tout ce passe-partout ennuyeux et le mettez dans une fonction:
createFieldHtml( id, label )
c'est bien, je me sauve tellement de lignes!
createFieldHtml( id, label, defaultValue )
oui, j'ai aussi besoin d'une valeur par défaut, facile à ajouter.
createFieldHtml( id, label, defaultValue, type )
cool, je peux aussi l'utiliser pour les cases à cocher
createFieldHtml( id, label, defaultValue, type, labelFirst )
Le concepteur UX a déclaré que l'étiquette doit être après la case à cocher.
createFieldHtml( id, label, defaultValue, type, labelFirst, isDate )
il rend maintenant un sélecteur de date en cas de besoin. Hm .. les params deviennent un peu incontrôlables
createFieldHtml( id, label, defaultValue, type, labelFirst, isDate, containerCssClasses )
il y avait ce seul cas où je dois ajouter des classes CSS
createFieldHtml( id, label, defaultValue, type, labelFirst, isDate, containerCssClasses, fieldCssClasses, disabled, clearAfter, helpText, uploadPath )
aaaaaaaaaaaaaaaaaaaaa
En défense du passe-partout
J'ai du mal à mettre cela en mots parce que c'est vraiment quelque chose que j'ai remarqué récemment, alors je vais faire une liste:
Récemment, je me suis toujours demandé ceci:
puis-je copier et coller dans un autre projet sans rien changer? si oui, c'est bien d'encapsuler ou de mettre dans une bibliothèque, si non: c'est l'heure du passe-partout.
Ceci est très opposé à la perception générale selon laquelle le passe-partout est du code copier-coller. Pour moi, le passe-partout concerne le copier-coller, mais il faut toujours le modifier un tout petit peu.
Mise à jour : je viens de tomber sur un article donnant à mon exemple ci-dessus un vrai nom: "anti-pattern trop SEC".
C'est une lecture courte et intéressante, vous pouvez trouver l'article ici: Anti-Pattern Too Dry
la source
Je méprise le code passe-partout, mais pouvoir supprimer le code passe-partout ne signifie pas toujours que c'est la meilleure façon de procéder.
Le cadre WPF a des propriétés de dépendance , ce qui implique une quantité insensée de code passe-partout. Pendant mon temps libre, j'ai étudié une solution qui réduit considérablement la quantité de code à écrire. Plus d'un an plus tard, je continue d'améliorer cette solution et j'ai encore besoin d'étendre ses fonctionnalités ou de corriger des bugs.
Quel est le problème? C'est formidable pour apprendre de nouvelles choses et explorer des solutions alternatives, mais ce n'est probablement pas la meilleure décision commerciale .
Le cadre WPF est bien documenté. Il documente correctement comment écrire votre code passe-partout. Tenter de supprimer ce code passe-partout est un bon exercice, et quelque chose qui vaut vraiment la peine d'être exploré, mais atteindre le même niveau de `` polissage '' que celui proposé par msdn prend beaucoup de temps, ce que nous n'avons pas toujours.
la source
Le problème avec le passe-partout est qu'il viole SEC. En substance, lorsque vous écrivez un passe-partout, vous répétez le même code (ou un code très similaire) dans un certain nombre de classes. Lorsque ce code doit être modifié, il n'est pas du tout certain que le développeur se souvienne de tous les endroits où le code a été répété. Cela conduit à des bogues où d'anciennes API ou d'anciennes méthodes sont utilisées.
Si vous refactorisez le passe-partout dans une bibliothèque commune ou une classe parente, il vous suffit de modifier le code au même endroit lorsque votre API change. Plus important encore, lorsque des changements inattendus se produisent, le code se casse en un seul endroit et vous permet de savoir exactement ce que vous devez corriger pour que tout fonctionne à nouveau. C'est de loin préférable à un scénario où un changement entraîne des échecs dans des dizaines, voire des centaines de classes.
la source
Je vais prendre un tact différent. La cohérence dans le développement est l'une des caractéristiques les plus importantes de la conception de logiciels, c'est un outil essentiel pour rendre les applications extensibles et maintenables, mais peut être difficile à réaliser lors de la gestion d'une équipe sur plusieurs sites, langues et fuseaux horaires.
Si elle est atteinte, la cohérence rend le code beaucoup plus accessible "une fois que vous en avez vu un, vous les avez tous vus", beaucoup moins cher à maintenir et à refactoriser, mais surtout, beaucoup plus facile à étendre. Lorsque vous écrivez une bibliothèque qui nécessite un passe-partout, ainsi que la puissance de votre bibliothèque, vous avez également donné au développeur:
Lorsque les consommateurs de votre bibliothèque maîtrisent l'instanciation, ils peuvent facilement créer des méthodes privées / d'extension, des classes parentes ou même des modèles pour implémenter le code passe-partout.
la source
Le seul vrai problème avec le code passe-partout est que lorsque vous y trouvez un bogue, vous devez le réparer partout où vous l'utilisez plutôt qu'au seul endroit que vous avez réutilisé .
la source