Compartilhar via


Design de enumeração

Observação

Esse conteúdo é reimpresso por permissão da Pearson Education, Inc. das Diretrizes de Design da Estrutura: Convenções, Idiomas e Padrões para Bibliotecas .NET Reutilizáveis, 2ª Edição. Essa edição foi publicada em 2008, e desde então o livro foi totalmente revisado na terceira edição. Algumas das informações nesta página podem estar desatualizadas.

Enumerações são um tipo especial de valor. Há dois tipos de enumerações: enumerações simples e enumerações de sinalizador.

Enumerações simples representam pequenos conjuntos fechados de opções. Um exemplo comum da enumeração simples é um conjunto de cores.

As enumerações de sinalizador foram projetadas para dar suporte a operações bit a bit nos valores de enumeração. Um exemplo comum da enumeração de sinalizadores é uma lista de opções.

✔️ USE uma enumeração para parâmetros, propriedades e valores retornados fortemente tipados que representam conjuntos de valores.

✔️ Favoreça o uso de uma enumeração em vez de constantes estáticas.

❌ NÃO use uma enumeração para conjuntos abertos (como a versão do sistema operacional, nomes de seus amigos etc.).

❌ NÃO forneça valores de enumeração reservados destinados a uso futuro.

Você sempre pode simplesmente adicionar valores à enumeração existente em um estágio posterior. Consulte Como adicionar valores a Enums para obter mais detalhes sobre como adicionar valores a enums. Os valores reservados apenas poluem o conjunto de valores reais e tendem a levar a erros do usuário.

❌ EVITE expor publicamente enumerações com apenas um valor.

Uma prática comum para garantir a extensibilidade futura de APIs C é adicionar parâmetros reservados às assinaturas de método. Esses parâmetros reservados podem ser expressos como enumerações com um único valor padrão. Isso não deve ser feito em APIs gerenciadas. A sobrecarga de método permite adicionar parâmetros em versões futuras.

❌ NÃO inclua valores sentinelas em enumerações.

Embora às vezes sejam úteis para desenvolvedores de estrutura, os valores sentinel são confusos para os usuários da estrutura. Eles são usados para acompanhar o estado da enumeração em vez de serem um dos valores do conjunto representado pela enumeração.

✔️ O DO fornece um valor de zero em enumerações simples.

Considere chamar o valor como "Nenhum". Se esse valor não for apropriado para essa enumeração específica, o valor padrão mais comum para a enumeração deverá ser atribuído ao valor subjacente de zero.

✔️ CONSIDERE o uso Int32 (o padrão na maioria das linguagens de programação) como o tipo subjacente de uma enumeração, a menos que qualquer um dos seguintes seja verdadeiro:

  • A enumeração é uma enumeração de sinalizadores e você tem mais de 32 sinalizadores ou espera ter mais no futuro.

  • O tipo subjacente precisa ser diferente do que Int32 para facilitar a interoperabilidade com código não gerenciado esperando enumerações de tamanho diferente.

  • Um tipo subjacente menor resultaria em uma economia substancial no espaço. Se você espera que o enum seja usado principalmente como um argumento no fluxo de controle, o tamanho fará pouca diferença. A redução de tamanho poderá ser significativa se:

    • Você espera que o enum seja usado como um campo em uma estrutura ou classe instanciada com muita frequência.

    • Você espera que os usuários criem grandes matrizes ou coleções das instâncias de enumeração.

    • Você espera que um grande número de instâncias da enumeração seja serializado.

Para uso na memória, lembre-se de que os objetos gerenciados são sempre alinhados por DWORD, portanto, você precisa efetivamente de várias enumerações ou outras estruturas pequenas em uma instância para empacotar uma enumeração menor para fazer a diferença, pois o tamanho total da instância sempre será arredondado para um DWORD.

✔️ NOMEIE enumerações de sinalizador com substantivos plurais ou frases substantivas e enumerações simples com substantivos singulares ou frases substantivas.

❌ NÃO estenda System.Enum diretamente.

System.Enum é um tipo especial usado pelo CLR para criar enumerações definidas pelo usuário. A maioria das linguagens de programação fornece um elemento de programação que fornece acesso a essa funcionalidade. Por exemplo, em C#, a enum palavra-chave é usada para definir uma enumeração.

Como projetar enumerações de sinalizador

✔️ APLIQUE System.FlagsAttribute para enumerações de sinalizador. Não aplique esse atributo a enumerações simples.

✔️ USE poderes de dois para os valores de enumeração de sinalizador para que possam ser combinados livremente usando a operação OR bit a bit.

✔️ CONSIDERE fornecer valores de enumeração especiais para combinações de sinalizadores comumente usadas.

As operações bit a bit são um conceito avançado e não devem ser necessárias para tarefas simples. ReadWrite é um exemplo desse valor especial.

❌ EVITE criar enumerações de sinalizador em que determinadas combinações de valores são inválidas.

❌ EVITE usar valores de enumeração de sinalizador iguais a zero, a menos que o valor represente "todos os sinalizadores estão limpos" e esteja com o nome apropriado, conforme prescrito pela próxima diretriz.

✔️ NOMEIE o valor zero de enumerações de sinalizador None. Para uma enumeração de sinalizador, o valor deve sempre significar "todos os sinalizadores estão limpos".

Adicionando valor a Enums

É muito comum descobrir que você precisa adicionar valores a um enum depois de já tê-lo enviado. Há um possível problema de compatibilidade do aplicativo quando o valor recém-adicionado é retornado de uma API existente, pois aplicativos mal gravados podem não manipular o novo valor corretamente.

✔️ CONSIDERE a adição de valores a enumes, apesar de um pequeno risco de compatibilidade.

Se você tiver dados reais sobre incompatibilidades de aplicativo causadas por adições a uma enumeração, considere adicionar uma nova API que retorna os valores novos e antigos e preterir a API antiga, que deve continuar retornando apenas os valores antigos. Isso garantirá que seus aplicativos existentes permaneçam compatíveis.

Partes © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.

Reimpresso por permissão da Pearson Education, Inc. de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition de Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 pela Addison-Wesley Professional como parte da série Microsoft Windows Development Series.

Consulte também