Je semble voir cela assez souvent dans mon code et dans d'autres. Il n'y a rien à ce sujet qui semble horriblement mal, mais cela m'énerve car il semble que cela peut être mieux fait. Je suppose qu'une déclaration de cas peut avoir un peu plus de sens, mais souvent la variable est un type qui ne fonctionne pas bien ou pas du tout avec les déclarations de cas (selon la langue)
If variable == A
if (Flag == true)
doFooA()
else
doFooA2
else if variable == B
if (Flag == true)
doFooB()
else
doFooB2
else if variable == C
if (Flag == true)
doFooC()
else
doFooC2
Il semble qu'il existe plusieurs façons de «factoriser» cela, comme 2 ensembles de if-elses, où un ensemble gère lorsque Flag == true.
Existe-t-il un "bon moyen" de prendre cela en compte, ou peut-être que lorsque cet algorithme if-else se produit, cela signifie généralement que vous faites quelque chose de mal?
code-quality
TruthOf42
la source
la source
if (Flag == true)
plutôt que justeIf (Flag)
? Si vous pensez queIf (Flag == true)
c'est mieux, pourquoi pasif ((Flag == true) == true)
?Réponses:
Il pourrait être manipulé avec polymorphisme.
Chaque fois que vous avez un tas de vérifications if / else sur le type de quelque chose, vous pouvez envisager de centraliser la vérification if / else dans une méthode d'usine, puis d'appeler doFoo () de manière polymorphe. Mais cela pourrait être excessif pour une solution unique.
Vous pouvez peut-être créer une carte clé / valeur où la clé est var / flag et la valeur est la fonction elle-même.
la source
Plusieurs if imbriqués augmentent la complexité cyclomatique du code. Jusqu'à récemment, avoir plusieurs points de sortie dans une fonction était considéré comme un mauvais code structuré, mais maintenant, tant que le code est simple et court , vous pouvez le faire, ce qui rend le code trivial à lire:
la source
une autre option consiste à combiner if et basculer. Ce n'est pas supérieur à votre technique imbriquée si, mais peut réduire le nombre de tests en double (si le commutateur est optimisé pour une table de saut).
la source
Eh bien, il y a toujours ça ...
Mais franchement, je pense que le code d'origine n'est pas à moitié mauvais en premier lieu.
la source
Utiliser le polymorphisme et un
rule
tableauOu comme
mike30
suggéré: si les conditions de la règle peuvent facilement former une clé, une carte de hachage est la meilleure solution.la source