Remplacement d'instructions if imbriquées
Cela est lié à un chapitre de beau code.
Et dans ce chapitre que j'ai lu sur le imbriquée if
s.
L'auteur parlait profondément imbriqués if
s en tant que créateur de bugs et moins lisible.
Et il parlait de remplacement imbriquée if
s avec case
états et des tables de décision.
Quelqu'un peut-il illustrer comment faire pour supprimer imbriquée if
s avec case
(select case
) et des tables de décision ?
Vous devez vous connecter pour publier un commentaire.
Bien, pas directement la réponse à votre question, puisque vous poser des questions sur l'interrupteur de cas, les déclarations, mais ici, c'est une question semblable.
Inverser l'instruction “if” afin de réduire la nidification
Cela parle de remplacement si imbriquées avec garde-états, que revenir plus tôt, au lieu d'progressivement la vérification de plus en plus de choses avant de s'installer sur une valeur de retour.
Un exemple, j'ai toujours essayer de faire est de remplacer fortement imbriquée si comme ça (en fait ce n'est pas trop mauvais, mais je les ai vus jusqu'à 8 ou 9 niveaux de profondeur dans la nature):
avec ceci:
J'ai aussi essayer de garder les actions de la plus petite possible (les appels de fonction sont les meilleurs pour cela) pour garder l'instruction switch compressé (si vous n'avez pas à aller de quatre pages à l'avance pour voir la fin de celui-ci).
Des tables de décision, je crois, sont simplement en définissant des indicateurs indiquant les mesures qui doivent être prises plus tard. Le "plus tard" est simple séquençage des actions basées sur ces drapeaux. J'ai peut-être tort (il ne sera pas la première ou la dernière fois :-).
Un exemple serait la sortie de la phase de mise au point peut être compliqué si depuis, ses actions sont très simples):
Comment sur enchaîné fi?
Remplacer
avec
C'est un peu comme instruction switch pour des conditions complexes.
Faire de l'état dans les booléens, puis d'écrire expression booléenne pour chaque cas.
Si le code était:
On peut l'écrire comme:
Pour des tables de décision, voir ma réponse à cette question, ou, mieux encore, lire le chapitre 18 dans Code Complet 2.
Vous pouvez juste briser une fois une partie de l'échec de la validation par exemple.
Des tables de décision où vous magasin de la logique conditionnelle dans une structure de données plutôt que dans le code lui-même.
Ainsi, au lieu de cela (à l'aide de @Pax exemple):
vous faire quelque chose comme ceci:
Si les possibilités d'
i
ne sont pas à faible numérotés entiers puis vous pouvez créer une table de recherche au lieu d'accéder directement à lai
ème élément de laactions
tableau.Cette technique devient beaucoup plus utile que imbriquée
if
s ouswitch
états lorsque vous avez une décision à prendre sur plusieurs dizaines de valeurs possibles.Si et instructions de commutation ne sont pas purement OO. Elles sont conditionnées une logique procédurale, mais faire un très bon travail! Si vous souhaitez supprimer ces états pour un plus OO approche, combiner l '"État" et "Descripteur" patterns.
Vous pouvez également envisager d'utiliser le Modèle visiteur.
Si imbriquées sont l'équivalent de l'opérateur logique ET
Code équivalent:
Dans les deux cas, lorsqu'une expression renvoie la valeur faux, l'expression ultérieure ne sera pas évaluée. Par exemple, si la condition1 est faux, la fonction() ne sera pas appelé, et condition3 ne sera pas évalué.
function(2)
ne fonctionnera pas sicondition1
est faux, dans le deuxième exemple tous les 3 fonctions de s'exécuter, ce qui peut affecter les performances.Un autre exemple certains langages permettent est-ce