359 votes

Instructions switch doivent toujours contenir une clause par défaut ?

Dans l'une de mes premières revues de code (un temps), on m'a dit que c'est une bonne pratique d'inclure une clause de défaut dans toutes les instructions switch. J'ai récemment souvenu de ce conseil mais ne peut pas se souvenir de la raison. Il semble assez étrange pour moi maintenant.

  1. Est-il une raison logique pour toujours, y compris une instruction par défaut?

  2. Est-ce dépendant d'une langue? Je ne me souviens pas quelle est la langue que j'utilisais à l'époque - peut-être que cela s'applique à certaines langues et pas à d'autres?

344voto

Vanwaril Points 2263

Commutateur de cas devrait presque toujours un default des cas.

Raisons de l'utilisation d'un default

1.Pour "attraper" une valeur inattendue

switch(type)
{
    case 1:
        //something
    case 2:
        //something else
    default:
        // unknown type! based on the language,
        // there should probably be some error-handling
        // here, maybe an exception
}

2. Pour gérer "par défaut" des actions, où c'est le cas pour un comportement particulier.

Vous voyez BEAUCOUP dans le menu programmes et scripts shell bash. Vous pouvez aussi le voir, quand une variable est déclarée en dehors de l'interrupteur de cas, mais pas initialisé, et chaque cas initialise à quelque chose de différent. Ici, le défaut doit initialiser trop de sorte que la ligne de code qui accède à la variable ne soulève pas une erreur.

3. Montrer à quelqu'un de lire votre code que vous avez couvert l'affaire.

variable = (variable == "value") ? 1 : 2;
switch(variable)
{
    case 1:
        // something
    case 2:
        // something else
    default:
        // will NOT execute because of the line preceding the switch.
}

C'était un exemple simplifié, mais le point est que quelqu'un qui lit le code ne doit pas se demander pourquoi variable ne peut pas être autre chose que 1 ou 2.


Le seul cas que je peux penser à ne PAS utiliser default est lorsque le commutateur est en train de vérifier quelque chose où son assez évident tous les autres alternatives peuvent être joyeusement ignoré

switch(keystroke)
{
    case 'w':
        // move up
    case 'a':
        // move left
    case 's':
        // move down
    case 'd':
        // move right
    // no default really required here
}

84voto

Jared Kells Points 1604

Non.

Et s'il n'y a pas d'action par défaut, le contexte est important. Et si vous vous souciez seulement de quelques valeurs?

Prenons l'exemple de la lecture de touches pour un jeu

 switch(a)
{
   case 'w':
     // Move Up
     break;
   case 's':
     // Move Down
     break;
   case 'a':
     // Move Left
     break;
   case 'd':
     // Move Right
     break;
}
 

Ajouter:

 default: // Do nothing
 

Est juste une perte de temps et augmente la complexité du code sans aucune raison.

47voto

Adrian Smith Points 6087

Je serais toujours utiliser une clause de défaut, quelle que soit la langue dans laquelle vous travaillez.

Les choses peuvent aller mal. Les valeurs ne seront pas ce que vous attendez, et ainsi de suite.

Ne voulant pas d'inclure une clause de défaut implique que vous êtes certain que vous savez l'ensemble des valeurs possibles. Si vous pensez que vous connaissez l'ensemble des valeurs possibles ensuite, si la valeur est en dehors de cet ensemble de valeurs possibles, vous souhaitez être informés de il - c'est certainement une erreur.

C'est la raison pour laquelle vous devriez toujours utiliser une clause de défaut et de jeter une erreur, par exemple en Java:

switch (myVar) {
   case 1: ......; break;
   case 2: ......; break;
   default: throw new RuntimeException("unreachable");
}

Il n'y a aucune raison d'inclure davantage d'informations que la simple "inaccessible" de la chaîne; s'il se produit réellement, vous allez avoir besoin de regarder la source et les valeurs des variables etc de toute façon, et à l'exception stacktrace comprendra que le numéro de ligne, donc pas besoin de perdre votre temps à écrire plus de texte dans le message d'exception.

16voto

Kurt Pattyn Points 1650

Dans ma société, nous avons écrire des logiciels pour l'Avionique et Défense de marché, et nous avons toujours inclure une instruction par défaut, parce que TOUS les cas dans une instruction switch doit être explicitement traitées (même si c'est juste un commentaire en disant: 'Ne rien faire'). Nous ne pouvons nous permettre le logiciel juste pour se conduisent mal ou tout simplement de crash sur inattendue (ou même ce que nous pensons impossible) de valeurs.

Il peut être discutée qu'un cas de défaut n'est pas toujours nécessaire, mais toujours exigeant, il est facilement vérifié par nos analyseurs de code.

11voto

Rado Points 141

Hm, avez-vous toujours une condition inconditionnelle dans vos ifs? Je ne pense pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X