Lors d'une récente révision de code, on m'a demandé de mettre default
cas dans tous les fichiers partout où le bloc switch
est utilisé, même s'il n'y a rien à faire dans default
. Cela signifie que je dois mettre le cas default
et n'y écrire rien.
Est-ce la bonne chose à faire? À quoi cela servirait-il?
Il semble qu'il y ait trois cas où une instruction default
n'est pas nécessaire:
aucun autre cas n'est laissé, car il existe un ensemble limité de valeurs qui entrent le switch case
. Mais cela pourrait changer avec le temps (intentionnellement ou accidentellement), et il serait bon d'avoir un default case
si quelque chose change _ vous pouvez vous connecter ou avertir l'utilisateur d'une valeur erronée.
vous savez comment et où le switch case
sera utilisé et quelles valeurs le saisiront. Encore une fois, cela pourrait changer et un traitement supplémentaire pourrait être nécessaire.
d'autres cas ne nécessitent aucun traitement spécial. Si tel est le cas, je pense que vous êtes invité à ajouter un default case
, car il s'agit d'un style de codage accepté et il rend votre code plus lisible.
Les deux premiers cas sont basés sur des hypothèses. Donc (en supposant que vous travaillez dans une équipe pas si petite que vous ayez régulièrement des révisions de code), vous ne pouvez pas vous permettre de faire ces hypothèses. Vous ne savez pas qui va travailler avec votre code ou appeler des fonctions/invoquer des méthodes dans votre code. De même, vous devrez peut-être travailler avec le code de quelqu'un d'autre. Le fait d'avoir le même style de codage facilitera le traitement du code de quelqu'un (y compris le vôtre).
Est-ce la bonne chose à faire? À quoi cela servirait-il?
Il n'est pas rare que les normes de codage d'entreprise exigent un cas par défaut pour toutes les instructions switch
. Une des raisons en est qu'il permet aux lecteurs de trouver facilement la fin du switch
. Une autre raison, probablement meilleure, est que cela vous fait réfléchir une seconde à ce que votre code devrait faire lorsque la condition ne correspond pas à vos attentes. Quelle que soit la raison de l'exigence, s'il s'agit d'une norme d'entreprise, vous devez la suivre, sauf s'il y a une raison hermétique de ne pas le faire.
Si vous pensez que votre switch
inclut des cas pour chaque condition possible, alors une bonne chose à faire est de mettre une instruction assert
dans le cas par défaut. De cette façon, lorsque quelqu'un modifie le code et ajoute par inadvertance une condition que votre switch
ne couvre pas, il frappe le assert
et se rend compte qu'il doit traiter cette partie du code.
Si votre switch
ne couvre que quelques-unes des conditions possibles, mais rien de spécial ne doit être fait pour les autres, vous pouvez laisser le cas par défaut vide. C'est une bonne idée d'ajouter un commentaire dans ce cas pour indiquer que le cas par défaut est intentionnellement vide car les conditions qui le rencontrent n'ont besoin d'aucun travail.
Si vous "basculez" sur le type d'énumération pure, il est dangereux d'avoir un repli par défaut. Lorsque vous ajouterez ultérieurement des valeurs au type d'énumération, le compilateur mettra en surbrillance les commutateurs avec de nouvelles valeurs non couvertes. Si vous avez une clause par défaut, le compilateur restera silencieux et vous risquez de le manquer.
À bien des égards, cette question est la même que celle souvent posée Ai-je besoin d'une clause else
à la fin d'une if
/else if
échelle qui couvre toutes les options .
La réponse est, syntaxiquement parlant, non. Mais il y a cependant un ...
Une clause default
peut être présente pour (au moins) deux raisons:
otherwise
à partir d'un cas. Il n'y a aucune raison de ne pas les inclure dans le code source.Ma philosophie est toujours assez simple - évaluer le pire des deux scénarios et opter pour le plus sûr. Dans le cas d'une clause else
ou default
vide, les pires options sont:
Trop dramatique? Peut-être ... mais alors mon logiciel a le potentiel de tuer des gens en cas de problème. Je préfère ne pas prendre ce risque.
En passant, les directives MISRA-C {voir le profil d'affiliation} recommandent une clause default
pour chaque switch
Java ne vous oblige pas à avoir une instruction 'par défaut' mais c'est bonne pratique d'en avoir une tout le temps, même si le code n'est jamais accessible (pour le moment). Voici quelques raisons:
En ayant une clause par défaut inaccessible, vous montrez au lecteur de votre code que vous avez pris en compte les valeurs et savez ce que vous faites. Vous autorisez également les modifications futures, par exemple: une nouvelle valeur d'énumération est ajoutée, le commutateur ne doit pas ignorer silencieusement la nouvelle valeur; vous pouvez y lancer une exception ou faire autre chose.
Pour attraper une valeur inattendue (au cas où vous n'activez pas une énumération) qui est transmise - elle peut être supérieure ou inférieure à ce que vous attendiez, par exemple.
Pour gérer les actions "par défaut" - où les commutateurs sont pour un comportement spécial. Par exemple, une variable peut être déclarée en dehors du commutateur mais pas initialisée et chaque cas l'initialise à quelque chose de différent. La valeur par défaut dans ce cas pourrait l'initialiser à une valeur par défaut afin que le code immédiatement après le commutateur ne génère pas d'erreur/ne génère pas d'exception.
Même si vous décidez de ne rien mettre dans la valeur par défaut (aucune exception, journalisation, etc.), même un commentaire pour dire que vous avez pensé que la valeur par défaut ne se produira jamais peut aider à la lisibilité de votre code; mais cela se résume à des préférences personnelles.
J'ajouterais également que cela dépend de la philosophie de la langue que vous utilisez. Dans Erlang par exemple, où il s'agit d'une approche courante pour "le laisser planter", vous ne définiriez pas de cas par défaut mais laisser votre instruction case
déclencher une erreur si une situation se produisait qui n'était pas prise en charge.
Vous devriez toujours avoir un défaut sauf si vous avez couvert de manière prouvée et permanente tous les cas. Cela ne coûte rien et c'est une assurance contre le non-respect de votre relevé de commutateur dans un programme en évolution.
Si vous êtes vraiment sûr de ne vous soucier d'aucun autre cas, la valeur par défaut: break; // ne vous en souciez pas, mais la valeur par défaut devrait être quelque chose comme default: throw new Error ("valeur inattendue");
De la même manière, vous ne devez jamais "supprimer" une construction de cas non triviale sans ajouter de commentaire à l'effet que vous avez l'intention de supprimer. Java s'est trompé celui-ci au stade de la conception.