Las enumeraciones ciertamente pueden hacer que el código sea más legible. Todavía hay algunas cosas a tener en cuenta (al menos en .net)
Debido a que el almacenamiento subyacente de una enumeración es un int, el valor predeterminado será cero, por lo que debe asegurarse de que 0 sea un valor predeterminado razonable. (Por ejemplo, las estructuras tienen todos los campos establecidos en cero cuando se crean, por lo que no hay forma de especificar un valor predeterminado que no sea 0. Si no tiene un valor 0, ni siquiera puede probar la enumeración sin convertir a int, que sería mal estilo)
Si sus enumeraciones son privadas para su código (nunca se exponen públicamente), puede dejar de leer aquí.
Si sus enumeraciones se publican de alguna manera en código externo y / o se guardan fuera del programa, considere numerarlas explícitamente. El compilador los numera automáticamente desde 0, pero si reorganiza sus enumeraciones sin darles valores, puede terminar con defectos.
Puedo escribir legalmente
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Para combatir esto, cualquier código que consuma una enumeración de la que no pueda estar seguro (por ejemplo, API pública) debe verificar si la enumeración es válida. Lo haces a través de
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
La única advertencia Enum.IsDefined
es que usa la reflexión y es más lento. También sufre un problema de versiones. Si necesita verificar el valor de enumeración a menudo, sería mejor lo siguiente:
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;
}
El problema del control de versiones es que el código antiguo solo puede saber cómo manejar las 2 enumeraciones que tiene. Si agrega un tercer valor, Enum.IsDefined será verdadero, pero el código antiguo no necesariamente puede manejarlo. Whoops
Puede hacer incluso más diversión con las [Flags]
enumeraciones, y el código de validación para eso es ligeramente diferente.
También voy a señalar que para la portabilidad, debe utilizar la llamada ToString()
en la enumeración, y el uso Enum.Parse()
al leerlos de nuevo. Tanto ToString()
y Enum.Parse()
puedo manejar [Flags]
enumeración es así, así que no hay razón para no usarlos. Eso sí, es otra trampa, porque ahora ni siquiera puedes cambiar el nombre de la enumeración sin posiblemente romper el código.
Entonces, a veces necesitas sopesar todo lo anterior cuando te preguntas ¿Puedo salirte con la suya?