Diseñar enumeraciones de indicadores
Actualización: noviembre 2007
Las enumeraciones de indicadores se utilizan para enmascarar los campos de bits y hacer comparaciones bit a bit. Son el diseño correcto que utilizar cuando se pueden especificar varios valores de enumeración al mismo tiempo. Por ejemplo, puede combinar cualquiera de los valores de enumeración GenericUriParserOptions para configurar un analizador de identificadores de recursos uniformes (URI) genérico.
Utilice potencias al cuadrado para los valores de una enumeración de indicadores para que puedan combinarse libremente utilizando la operación OR bit a bit.
Nota importante: |
---|
Si no utiliza potencias al cuadrado o combinaciones de potencias al cuadrado, las operaciones bit a bit no funcionarán como se espera. |
Considere proporcionar valores de enumeración especiales para las combinaciones de indicadores usadas con frecuencia.
Combinar los valores de enumeración de los indicadores es una técnica intermedia que no debería ser un requisito para los desarrolladores que implementan escenarios comunes. Por ejemplo, la enumeración FileShare contiene el valor ReadWrite para especificar que un archivo compartido se puede abrir para lectura o escritura. Indica a los desarrolladores que pueden abrir un archivo compartido para lectura o escritura, y elimina la necesidad de que aprendan cómo especificar una combinación de valores de enumeración como un único valor.
Evite crear enumeraciones de indicadores cuando ciertas combinaciones de valores no son válidas.
Este problema indica normalmente que el significado de la enumeración no es lo bastante preciso. Considere dividir la enumeración en dos o más enumeraciones, cada uno con un conjunto más preciso de valores. Por ejemplo, considere la siguiente enumeración definida deficientemente.
<Flags()> _
Public Enum PurchaseTypes
SalePrice
RegularPrice
Book
CompactDisk
End Enum
[Flags]
public enum PurchaseTypes
{
SalePrice,
RegularPrice,
Book,
CompactDisk
}
El diseñador piensa utilizar esta enumeración con el método siguiente.
Public Overloads Function FindPriceForItem(ByVal title As String, ByVal purchase As PurchaseTypes) As Single
Return 0
End Function
public float FindPriceForItem(string title, PurchaseTypes purchase)
Al llamar a este método, el parámetro purchase especifica exactamente uno de los valores de SalePrice o de RegularPrice, y exactamente uno de los valores de Book o CompactDisk. Los desarrolladores no podrían determinar este requisito sin consultar la documentación o experimentar con el método. Un mejor enfoque consiste en separar los dos tipos de información, colocando cada uno en su propia enumeración, como se muestra en el ejemplo de código siguiente.
Public Enum ItemType
Book
CompactDisk
End Enum
Public Enum PriceType
SalePrice
RegularPrice
End Enum
public enum ItemType
{
Book,
CompactDisk
}
public enum PriceType
{
SalePrice,
RegularPrice,
}
La firma de método cambiaría entonces para reflejar este rediseño, como se muestra en el ejemplo de código siguiente.
Public Overloads Function FindPriceForItem(ByVal title As String, ByVal name As ItemType, ByVal price As PriceType) As Single
Return 0
End Function
public float FindPriceForItem(string title, ItemType name, PriceType price)
Evite establecer un valor de enumeración de indicadores en cero, a menos que el valor se utilice para indicar que se borran todos los indicadores. Un valor así se debería denominar apropiadamente como se explica en la instrucción siguiente.
Tenga en cuenta que esta instrucción sólo es para enumeraciones de indicadores. Las enumeraciones simples pueden y deberían utilizar el valor cero.
Asigne el nombre None al valor cero de enumeraciones de indicadores. Para una enumeración de indicadores, el valor siempre debe significar que se borran todos los indicadores.
Nota importante: |
---|
No utilice el valor de cero en una enumeración de indicadores para señalar ningún otro estado. No hay ninguna manera de comprobar que se está estableciendo explícitamente un indicador de valor cero, a diferencia de no establecer ningún indicador. |
Portions Copyright 2005 Microsoft Corporation. Reservados todos los derechos.
Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.
Para obtener más información sobre las directrices de diseño, consulte el libro titulado "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries" de Krzysztof Cwalina y Brad Abrams, publicado por Addison-Wesley, 2005.
Vea también
Conceptos
Agregar valores a enumeraciones
Otros recursos
Instrucciones de diseño de tipos
Instrucciones de diseño para desarrollar bibliotecas de clases