Enums certamente podem tornar o código mais legível. Ainda há algumas coisas a serem observadas (pelo menos em .net)
Como o armazenamento subjacente de uma enum é um int, o valor padrão será zero, portanto, verifique se 0 é um padrão sensato. (Por exemplo, estruturas têm todos os campos definidos como zero quando criados, portanto, não há como especificar um padrão diferente de 0. Se você não tiver um valor 0, não poderá nem testar a enum sem converter para int, o que seria estilo ruim.)
Se sua enumeração é privada ao seu código (nunca exposta publicamente), você pode parar de ler aqui.
Se suas enumerações forem publicadas de alguma forma no código externo e / ou salvas fora do programa, considere numerá-las explicitamente. O compilador os numera automaticamente de 0, mas se você reorganizar suas enumerações sem fornecer valores, poderá acabar com defeitos.
Eu posso escrever legalmente
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Para combater isso, qualquer código que consuma uma enumeração que você não pode ter certeza (por exemplo, API pública) precisa verificar se a enumeração é válida. Você faz isso via
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
A única ressalva Enum.IsDefined
é que ele usa reflexão e é mais lento. Ele também sofre de um problema de versão. Se você precisar verificar o valor da enumeração com frequência, seria melhor o seguinte:
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;
}
A questão do controle de versão é que o código antigo pode saber apenas como lidar com as 2 enumerações que você possui. Se você adicionar um terceiro valor, Enum.IsDefined será verdadeiro, mas o código antigo não pode necessariamente lidar com isso. Ops.
Há ainda mais diversão que você pode fazer com [Flags]
enumerações, e o código de validação para isso é um pouco diferente.
Também observarei que, para portabilidade, você deve usar call ToString()
no enum e usá-lo Enum.Parse()
ao lê-los novamente. Ambos ToString()
e Enum.Parse()
podem lidar com[Flags]
enum é assim, então não há nenhuma razão para não usá-los. Veja bem, é mais uma armadilha, porque agora você não pode nem mudar o nome da enum sem possivelmente quebrar o código.
Então, às vezes você precisa ponderar tudo isso acima quando se perguntar: Posso fugir com apenas um bool?