Compartir a través de


Diseño de enumeraciones

Nota:

Este contenido se reimprime con permiso de Pearson Education, Inc. de Directrices de diseño de frameworks: Convenciones, expresiones y patrones para bibliotecas reutilizables de .NET, 2ª edición. Esa edición fue publicada en 2008, y el libro ha sido totalmente revisado en la tercera edición. Parte de la información de esta página puede estar obsoleta.

Las enumeraciones son un tipo especial de tipo de valor. Hay dos tipos de enumeraciones: enumeraciones simples y enumeraciones de banderas.

Las enumeraciones simples representan pequeños conjuntos cerrados de opciones. Un ejemplo común de la enumeración simple es un conjunto de colores.

Las enumeraciones de marca están diseñadas para admitir operaciones bit a bit en los valores de enumeración. Un ejemplo común de una enumeración de banderas es una lista de opciones.

✔️ USE una enumeración para escribir de forma segura parámetros, propiedades y valores devueltos que representan conjuntos de valores.

✔️ Prefiera usar una enumeración en lugar de constantes estáticas.

❌ NO use una enumeración para conjuntos abiertos (como la versión del sistema operativo, los nombres de sus amigos, etc.).

❌ NO proporcione valores de enumeración reservados destinados a su uso futuro.

Siempre puede agregar valores a la enumeración existente en una fase posterior. Consulte Agregar valores a enumeraciones para obtener más información sobre cómo agregar valores a enumeraciones. Los valores reservados simplemente contaminan el conjunto de valores reales y tienden a provocar errores de usuario.

❌ EVITE exponer públicamente enumeraciones con un solo valor.

Una práctica habitual para garantizar la extensibilidad futura de las API de C es agregar parámetros reservados a firmas de método. Estos parámetros reservados se pueden expresar como enumeraciones con un único valor predeterminado. Esto no se debe hacer en las API administradas. La sobrecarga de métodos permite agregar parámetros en futuras versiones.

❌ NO incluya valores centinelas en enumeraciones.

Aunque a veces son útiles para los desarrolladores de marcos, los valores de Sentinel son confusos para los usuarios del marco. Se usan para realizar un seguimiento del estado de la enumeración en lugar de ser uno de los valores del conjunto representado por la enumeración.

✔️ Proporcione un valor de cero en enumeraciones simples.

Considere la posibilidad de llamar al valor algo parecido a "None". Si este valor no es adecuado para esta enumeración concreta, se debe asignar el valor predeterminado más común a la enumeración el valor subyacente de cero.

✔️ CONSIDERE la posibilidad de usar Int32 (el valor predeterminado en la mayoría de los lenguajes de programación) como el tipo subyacente de una enumeración a menos que se cumpla alguno de los siguientes valores:

  • La enumeración es una enumeración de marca y usted tiene más de 32 marcas, o espera tener más en el futuro.

  • El tipo subyacente debe ser diferente que Int32 para facilitar la interoperabilidad con código no administrado que espera enumeraciones de tamaño diferente.

  • Un tipo subyacente más pequeño daría como resultado un ahorro considerable en el espacio. Si espera que la enumeración se use principalmente como argumento para el flujo de control, el tamaño importa poco. El ahorro de tamaño puede ser significativo si:

    • Se espera que la enumeración se use como un campo en una estructura o clase con instancias muy frecuentes.

    • Se espera que los usuarios creen grandes matrices o colecciones de las instancias de enumeración.

    • Se espera que se serialicen un gran número de instancias de la enumeración.

Para el uso en memoria, tenga en cuenta que los objetos administrados siempre están alineados con DWORD, por lo que, en la práctica, necesita varias enumeraciones u otras estructuras pequeñas en una instancia con las que empaquetar una enumeración más pequeña y así obtener una diferencia relevante, ya que el tamaño total de la instancia siempre se va a redondear a DWORD.

✔️ ASIGNE nombres que tengan sustantivos en plural o sintagmas nominales para las enumeraciones de marca. Para las enumeraciones simples, los nombres deben tener sustantivos en singular o sintagmas nominales.

❌ No extiendas System.Enum directamente.

System.Enum es un tipo especial utilizado por CLR para crear enumeraciones definidas por el usuario. La mayoría de los lenguajes de programación proporcionan un elemento de programación que proporciona acceso a esta funcionalidad. Por ejemplo, en C# se usa la enum palabra clave para definir una enumeración.

Diseño de enumeraciones de marca

✔️ APLIQUE System.FlagsAttribute a las enumeraciones de marca. No aplique este atributo a enumeraciones simples.

✔️ USE potencias de dos para los valores de las enumeraciones de marca. Así, se podrán combinar libremente mediante la operación OR bit a bit.

✔️ CONSIDERE la posibilidad de proporcionar valores de enumeración especiales para las combinaciones de marcas que se usan habitualmente.

Las operaciones bit a bit son un concepto avanzado y no deben ser necesarias para tareas sencillas. ReadWrite es un ejemplo de este valor especial.

❌ EVITE crear enumeraciones de marca en las que determinadas combinaciones de valores no sean válidas.

❌ EVITE el uso de valores de cero en las enumeraciones de marca, a menos que el valor represente que "todas las marcas están borradas" y tenga un nombre correcto, según lo indicado por la siguiente guía.

✔️ ASIGNE este nombre al valor de cero de las enumeraciones de marca: None. Para una enumeración de marca, el valor siempre debe significar "todas las marcas están borradas".

Agregar valor a enumeraciones

Es muy habitual descubrir que necesita agregar valores a una enumeración después de que ya la haya enviado. Hay un posible problema de compatibilidad de aplicaciones cuando se devuelve el valor recién agregado de una API existente, ya que es posible que las aplicaciones mal escritas no controlen el nuevo valor correctamente.

✔️ CONSIDERE la posibilidad de agregar valores a enumeraciones, a pesar de un riesgo de compatibilidad pequeño.

Si tiene datos reales sobre las incompatibilidades de la aplicación causados por adiciones a una enumeración, considere la posibilidad de agregar una nueva API que devuelva los valores nuevos y antiguos, y dejar de usar la API antigua, que debe seguir devolviendo solo los valores antiguos. Esto garantizará que las aplicaciones existentes sigan siendo compatibles.

© Partes 2005, 2009 de Microsoft Corporation. Todos los derechos reservados.

Reimpreso con permiso de Pearson Education, Inc. de Framework Design Guidelines: Convenciones, Idiomas y Patrones para Bibliotecas .NET Reusables, 2ª Edición por Krzysztof Cwalina y Brad Abrams, publicado el 22 de octubre de 2008 por Addison-Wesley Professional como parte de la Serie Desarrollo de Microsoft Windows.

Consulte también