Les énumérations peuvent certainement rendre le code plus lisible. Il y a encore quelques points à surveiller (au moins en .net)
Étant donné que le stockage sous-jacent d'une énumération est un entier, la valeur par défaut sera zéro, vous devez donc vous assurer que 0 est une valeur par défaut raisonnable. (Par exemple, les structures ont tous les champs mis à zéro lors de leur création, il n'y a donc aucun moyen de spécifier une valeur par défaut autre que 0. Si vous n'avez pas de valeur 0, vous ne pouvez même pas tester l'énumération sans transtyper en int, ce qui serait mauvais style.)
Si vos énumérations sont privées pour votre code (jamais exposées publiquement), vous pouvez arrêter de lire ici.
Si vos énumérations sont publiées de quelque manière que ce soit dans du code externe et / ou sont enregistrées en dehors du programme, envisagez de les numéroter explicitement. Le compilateur les numérote automatiquement à partir de 0, mais si vous réorganisez vos énumérations sans leur donner de valeurs, vous pouvez vous retrouver avec des défauts.
Je peux légalement écrire
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Pour lutter contre cela, tout code qui consomme une énumération dont vous ne pouvez pas être certain (par exemple API publique) doit vérifier si l'énumération est valide. Vous faites cela via
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
Le seul inconvénient Enum.IsDefined
est qu'il utilise la réflexion et est plus lent. Il souffre également d'un problème de version. Si vous avez besoin de vérifier souvent la valeur d'énumération, vous feriez mieux de:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
Le problème de la gestion des versions est que l'ancien code ne sait peut-être que comment gérer les 2 énumérations que vous avez. Si vous ajoutez une troisième valeur, Enum.IsDefined sera true, mais l'ancien code ne peut pas nécessairement le gérer. Oups.
Les énumérations sont encore plus amusantes [Flags]
, et le code de validation est légèrement différent.
Je noterai également que pour la portabilité, vous devez utiliser l'appel ToString()
sur l'énumération, et l'utiliser Enum.Parse()
lors de leur lecture. Les deux ToString()
et Enum.Parse()
peuvent gérer[Flags]
ENUM est aussi bien, donc il n'y a aucune raison de ne pas les utiliser. Attention, c'est encore un autre piège, car maintenant vous ne pouvez même pas changer le nom de l'énumération sans éventuellement casser le code.
Donc, parfois, vous devez peser tout ce qui précède lorsque vous vous demandez: Puis-je m'en tirer avec juste un booléen?