2016-12-01 1 views
0

J'ai un interrupteur dans lequel je vérifie une propriété de quelque sorte et si le contrôle donne une valeur spécifique, je veux vérifier une autre valeur, donc je l'ai fait quelque chose comme ceci:est l'interrupteur sans interruption une mauvaise pratique?

switch(property_A) 
{ 
case NA: 
    if(value_0 == property_B) 
     property_A = value_a; 
    else if(value_1 == property_B) 
     property_A = value_b; 
case value_0: 
... 
break; 
case value_1: 
... 
break; 
} 

Alors, je sais que ce résout mon problème, mais je ne sais pas si c'est une bonne idée ou peut-être devrais-je changer cela? mais pas assez

+1

Si vous essayez de sauter à la casse après préformage ce qui est dans 'NA ', ça ne marchera pas. – StoryTeller

+1

Il est courant de permettre à un cas de «tomber» dans le cas suivant. Cependant, ce que vous faites ne "vérifie pas une autre valeur". Si vous modifiez la valeur activée et que vous voulez lancer le 'switch' depuis le début, vous avez besoin d'une boucle. –

+2

Voulez-vous que le code dans 'case value_o' s'exécute si vous frappez le 'case NA'? – nos

Répondre

4

Cela dépend de ce que vous voulez faire. Si vous arrivez au cas NA, sans le mot-clé break, le cas value_0 sera exécuté après la fin de l'une des deux branches if. Donc, si c'est le comportement que vous voulez, c'est OK de ne pas utiliser break, mais je ne pense pas que ce soit ce que vous vouliez faire.

Je vous suggère simplement de déplacer l'instruction if - else au-dessus du switch et de supprimer le cas NA. De cette façon, vous allez d'abord affecter les données correctes à property_A et ensuite vous pouvez faire ce que vous voulez avec le switch.

EDIT: Comme Jack Deethpoints out, si vous avez omis la déclaration break sur le but, il est une bonne idée d'ajouter un commentaire que vous avez fait.

3

La convention est d'ajouter un commentaire explicitement dire futur-vous et tous les autres mainteneurs que vous avez prévu le fallthough et vous n'avez pas accidentellement omis le break;.

switch(foo) { 
case 1: 
    bar(); 
    // fallthrough 
case 2: 
    baz(); 
    break; 
case 3: 
    fizzbuzz(); 
} 

Si vous utilisez 17 C++ ou vous pouvez ensuite utiliser l'attribut [[fallthrough]] pour éviter un avertissement du compilateur:

switch(foo) { 
case 1: 
    bar(); 
    [[fallthrough]] 
case 2: 
    baz(); 
    break; 
case 3: 
    fizzbuzz(); 
} 
+1

J'ai en effet ajouté un commentaire, mais je voulais savoir si c'est une mauvaise pratique même avec un commentaire – CIsForCookies

2

Les informations complémentaires fournies dans les commentaires à la question indiquent que ce qui est wANTED est pas ce qui est écrit dans la question:

switch(property_A) 
{ 
    case NA: 
    if(value_0 == property_B) 
     property_A = value_a; 
    else if(value_1 == property_B) 
     property_A = value_b; 
    // here, we fallthrough into the code for value_0 
    // but you want to switch on the new value instead 
    case value_0: 
    ... 
    break; 
} 

ce que vous dites que vous voulez réellement est de mettre property_A si elle était initialement NA, puis sautez sur l'étiquette correcte. Dans ce cas, l'affectation doit être en dehors de l'instruction switch. Vous pouvez le faire avec un goto à la fin de l'affaire NA, mais je vous recommande de traiter seulement avec le NA avant que le commutateur:

if (property_A==NA) 
    property_A = (value_0 == property_B) ? value_a 
       : (value_1 == property_B) ? value_b 
       : NA; 

switch (property_A) { 
    case value_0: 
    ... 
    break; 
    case NA: 
    // we get here only if none of the replacement conditions 
    // matched, outside the 'case' 
}