Essayons de comprendre pourquoi la SEC est important, et puis on peut comprendre d'où la rupture de la règle est raisonnable:
SEC devrait être utilisé pour éviter la situation où les deux morceaux de code sont conceptuellement à faire le même travail, donc à chaque fois que vous modifiez le code dans un seul endroit, vous devez changer le code à l'autre endroit. Si la même logique est en deux endroits distincts, alors vous devez toujours vous rappeler de changer la logique dans les deux endroits, ce qui peut être source d'erreurs. Cela peut s'appliquer à n'importe quelle échelle. Il peut être une application complète qui est dupliqué ou il peut être une valeur constante. Il ne peut également pas être n'importe quel code à répétition, il peut juste être une répétition de ce principe. Vous devez vous demander "Si je devais faire un changement dans un endroit, je serais forcément besoin de faire un équivalent de changement quelque part d'autre?". Si la réponse est "oui", alors le code est en train de violer SÈCHE.
Imaginez que vous avez une ligne comme ceci dans votre programme:
cost = price + price*0.10 // account for sales tax
et quelque part d'autre dans votre programme, vous avez une ligne similaire:
x = base_price*1.1; // account for sales tax
Si les changements de taxe de vente, vous allez avoir besoin de changer à la fois de ces lignes. Il n'y a presque pas de code à répétition ici, mais le fait que si vous apportez une modification dans un endroit, il nécessite un changement dans un autre lieu est ce qui rend le code SÈCHE pas. Ce qui est plus, il peut être très difficile de se rendre compte que vous avez à faire le changement dans les deux endroits. Peut-être que votre unité de tests de l'attraper, mais peut-être pas, afin de se débarrasser de la duplication est important. Peut-être que vous feriez le facteur de la valeur de la taxe de vente séparée en une constante qui peut être utilisé dans plusieurs endroits:
cost = price + price*sales_tax;
x = base_price*(1.0+sales_tax);
ou peut-être créer une fonction d'abstraction encore plus:
cost = costWithTax(price);
x = costWithTax(base_price);
De toute façon, il est très probable à être en vaut la peine.
Alternativement, vous pouvez avoir un code qui ressemble beaucoup, mais n'est-ce pas violer SEC:
x = base_price * 1.1; // add 10% markup for premium service
Si vous deviez changer la façon dont la taxe de vente est calculé, vous ne voulez pas modifier la ligne de code, de sorte qu'il n'est pas en répétant à toute logique.
Il y a aussi des cas où le fait d'avoir à faire le même changement dans de multiples lieux de est bien. Par exemple, vous avez peut-être un code comme ceci:
a0 = f(0);
a1 = f(1);
Ce code n'est pas SÈCHE en quelques manières. Par exemple, si vous modifiez le nom de la fonction f
, vous aurez à changer deux endroits. Vous pourriez peut-être rendre le code plus SEC par la création d'une petite boucle et en tournant a
dans un tableau. Toutefois, cette duplication n'est pas une grosse affaire. Tout d'abord, les deux modifications sont très proches, et si la modification accidentelle de l'un sans changer l'autre est peu probable. Deuxièmement, si vous êtes dans un langage compilé, puis le compilateur sera très probablement le problème de toute façon. Si vous n'êtes pas dans un langage compilé, puis j'espère que vos tests unitaires attraper.
Il y a beaucoup de bonnes raisons pour faire de votre code SEC, mais il y a de nombreuses bonnes raisons de ne pas également.