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
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
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".
public ForTheBar(Foo foo, bool shouldIGrommit)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
return bar.BeFooed();
}
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.
public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
if (shouldIDoodle)
{
bar.BeDoodled();
}
return bar.BeFooed();
}
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.