2011-10-26 23 views
7

Estoy recibiendo varios campos de bits del hardware.¿Cuáles son los pros y los contras de usar una enumeración de banderas?

Mi código fue originalmente:

public readonly byte LowByte; 

public bool Timer { get { return (LowByte & 1) == 1; } } 

Entonces me acordé de la enumeración banderas y estoy considerando cambiar a:

[Flags] 
public enum LowByteReasonValues : byte 
{ 
    Timer = 1, 
    DistanceTravelledExceeded = 2, 
    Polled = 4, 
    GeofenceEvent = 8, 
    PanicSwitchActivated = 16, 
    ExternalInputEvent = 32, 
    JourneyStart = 64, 
    JourneyStop = 128 
} 

public readonly LowByteReasonValues LowByte; 

public bool Timer { get { return (LowByte & LowByteReasonValues.Timer) == LowByteReasonValues.Timer; } } 

y así sucesivamente.

¿Cuál es la mejor práctica y cuáles son los pros y los contras de cada enfoque?

EDIT: Me interesa saber si existen diferencias prácticas entre los dos enfoques, especialmente en lo que respecta al rendimiento. No deseo solicitar una opinión sobre los estilos de codificación (a menos que provenga de las directrices de Microsoft) ya que eso vería la pregunta cerrada como no constructiva. Gracias.

+0

Trate de verlo desde el punto de vista del desarrollador que consume este código. Escribir pruebas unitarias es una buena manera de hacerlo; ejemplos de escritura (ejemplos de código) es otro. ¿De qué manera le permite a ese desarrollador escribir el código más claro? ¿De qué forma sería más intuitiva para el desarrollador del cliente? – TrueWill

Respuesta

1

Por lo menos, el segundo ejemplo tiene mejores semántica e indica el significado de los bits dentro del código. Hay alguna documentación dentro del código de para qué se usa el bit.

De lo contrario, según su primer ejemplo, tendrá que agregar comentarios ya que básicamente está mezclando números mágicos (bits), lo que hace que el código sea mucho más difícil de leer, especialmente por otra persona que no está familiarizada con él. Incluso si usted mismo mantendrá este código dentro de seis meses, le resultará difícil recordar para qué se usó el bit 5.

5

La tarde es la mejor práctica ya que hace que el código sea más legible

4

Si está utilizando .NET 4.0, ahora puede usar el método HasFlag para comprobar si una enumeración contiene un bit específico. Esto lo hace aún más legible que el método anterior de comprobación.

[Flags] 
public enum LowByteReasonValues : byte 
{ 
    Timer = 1, 
    DistanceTravelledExceeded = 2, 
    Polled = 4, 
    GeofenceEvent = 8, 
    PanicSwitchActivated = 16, 
    ExternalInputEvent = 32, 
    JourneyStart = 64, 
    JourneyStop = 128 
} 

public readonly LowByteReasonValues LowByte; 

public bool Timer 
{ 
    get 
    { 
    return (LowByte.HasFlag(LowByte.Timer)); 
    } 
} 

Más información en MSDN.

+0

Ooh ... gracias. Estoy usando .NET 4.0 pero esa función no había aparecido antes en mi radar. –

+0

Desafortunadamente, parece (de un comentario del usuario en la página de MSDN al menos) que es bastante lento. ¡Vergüenza! –

+0

@StephenKennedy: notado, pero solo me preocuparía si comienza a causar problemas y su código es extremadamente crítico para el rendimiento. No es necesario optimizar algo prematuramente. –

Cuestiones relacionadas