2011-10-26 10 views
7

Ricevo diversi campi bit dall'hardware.Quali sono i pro e i contro dell'uso di una flag enum?

Il mio codice era in origine:

public readonly byte LowByte; 

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

poi mi sono ricordato l'enum bandiere e sto pensando di cambiare 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; } } 

e così via.

che è meglio la pratica e che cosa se ne sono i pro ei contro di ogni approccio?

EDIT: Sono interessato a sapere se ci sono differenze pratiche tra i due approcci, in particolare per quanto riguarda le prestazioni. Non desidero sollecitare un'opinione sugli stili di codifica (a meno che non provenga da linee guida Microsoft) in quanto ciò renderebbe la domanda chiusa come non costruttiva. Grazie.

+0

Provate a guardarlo dal punto di vista dello sviluppatore che consuma questo codice. Scrivere test di unità è un buon modo per farlo; gli esempi di scrittura (esempi di codice) sono un altro. In che modo lo sviluppatore può scrivere il codice più chiaro? In che modo sarebbe più intuitivo per lo sviluppatore del cliente? – TrueWill

risposta

1

Per lo meno, il tuo secondo esempio ha la semantica migliori e indica il significato dei bit all'interno del codice. C'è una certa documentazione nel codice di ciò per cui viene usato il bit.

Altrimenti, in base al primo esempio, sarà necessario aggiungere commenti poiché si stanno basando sui numeri magici (bit), il che rende il codice molto più difficile da leggere, specialmente da un'altra persona che non ha familiarità con esso. Anche se tu stesso manterrai questo codice per sei mesi lungo la strada, potresti trovare difficile ricordare per quale motivo è stato usato il bit 5.

5

il secondo è migliore prassi dal momento che rende il codice più leggibile

4

Se si utilizza .NET 4.0, è ora possibile utilizzare il metodo HasFlag per verificare se un enum contiene un po 'particolare. Ciò lo rende ancora più leggibile rispetto al precedente metodo di controllo.

[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)); 
    } 
} 

Ulteriori informazioni su MSDN.

+0

Ooh ... grazie. Sto usando .NET 4.0 ma quella funzione non era mai arrivata sul mio radar. –

+0

Sfortunatamente sembrerebbe (da un commento utente sulla pagina MSDN almeno) che è piuttosto lento. Vergogna! –

+0

@StephenKennedy: notato, ma mi preoccuperei solo se inizia a causare problemi e il codice è estremamente critico. Non c'è bisogno di ottimizzare prematuramente nulla. –

Problemi correlati