Definisce esplicitamente valori enum, anche se il valore predefinito è lo stesso?

4

Ci sono momenti in cui i valori di enum sono importanti: non è necessario che siano unici, hanno anche bisogno di avere valori specifici. In questi casi, i valori dovrebbero essere esplicitamente definiti, anche se coincidono con i valori predefiniti? Un esempio:

enum Car {
    DeLorean = 0,
    Lada = 1
};

Immagina che per qualsiasi ragione la tua applicazione presuma che DeLorean e Lada abbiano quei valori specifici. Per inciso, sono uguali ai valori predefiniti, ma ciò significa che non è più necessario utilizzare definizioni esplicite?

Lasciandoli impliciti mi fa sentire a disagio. Mi sembra che averli esplicitamente definiti stia comunicando ai futuri programmatori che i valori specifici sono importanti e aiuta a prevenire errori come questo:

enum Car {
    Dacia,
    DeLorean,
    Lada
};

Nell'esempio sopra, un altro programmatore che non è a conoscenza della restrizione menzionata introduce un nuovo valore enum e, volendo mantenere il codice in ordine, lo mette in ordine alfabetico. Tuttavia, DeLorean e Lada ora hanno valori numerici diversi e un bug potenzialmente silenzioso è stato introdotto.

Il mio ragionamento mi sembra corretto (ovviamente), ma il team di revisione del codice per una società con cui lavoravo non era d'accordo. Mi sbaglio?

    
posta Paul 23.10.2014 - 18:01
fonte

6 risposte

6

Questo è molto un giudizio, ma sono d'accordo con te sul fatto che i valori espliciti sono la strada da percorrere, oltre a un commento all'inizio che spiega il significato dei valori espliciti.

Come esempio di un progetto importante che lo sta facendo in questo modo, guarda la serializzazione AST di Clang. Usa un enum enorme per definire i codici per tutti i suoi nodi AST e l'enum ha valori espliciti.

Detto questo, condivido anche l'opinione del team di architettura che toccare il vecchio codice che funziona quando ci sono cose più importanti da fare non è la migliore idea.

Non mi piace la soluzione di compromesso, però. Non aggiunge nulla.

    
risposta data 23.10.2014 - 18:25
fonte
2

Se si memorizzano o trasmettono tali valori, devono essere specifici. Normalmente si definirà il protocollo in un file di intestazione condiviso da entrambe le parti. Se hai un qualche tipo di meccanismo di versioning, non sarà un grosso problema. Ma è sempre meglio essere espliciti. Sono un fan di 'say what you mean' nel codice. Non costa nulla e il tuo codice è molto più leggibile.

Ma per i moduli interni e le API in cui i valori enum non sono memorizzati, i valori predefiniti sono perfetti. Comunica che il valore dell'enum stesso non è importante. Ciò che è importante è ciò che significano questi valori e il fatto che si sta utilizzando una digitazione più strong per chiarire cosa sta utilizzando il codice e aiutare a prevenire l'utilizzo di valori non validi dalla vena.

    
risposta data 26.10.2014 - 02:22
fonte
1

Considera enum class di C ++ 11; consente a te e alla tua azienda di eliminare la necessità di valori espliciti rimuovendo i bug sottili che enum ha.

    
risposta data 23.10.2014 - 19:24
fonte
0

Nel nuovo codice, se fa parte del sistema o dei requisiti aziendali che una determinata enumerazione è uguale a un valore specifico, deve essere sicuramente esplicita, commentata e documentata. In caso contrario, si consiglia un incubo di manutenzione.

L'unico fattore nel tuo scenario che mi indurrebbe a rendere esplicite tali enumerazioni è il fatto che si tratta di codice vecchio da una base di codice funzionante e altre attività potrebbero avere la priorità.

    
risposta data 24.10.2014 - 01:11
fonte
0

Con l'enumerazione, ci sono tre filosofie che funzionano, e una che non lo fa

  1. Valore indipendente - usa valori predefiniti per TUTTE le opzioni con i valori sottostanti irrilevanti
  2. Sequenza specifica: definisce il primo valore lasciando tutti gli altri come incrementi
  3. Valore specifico: specifica i valori per TUTTE le opzioni e il valore è importante (ad es. ID messaggio di comunicazione)

Quello che non fa

  1. Alcuni specificati - alcuni valori sono specificati e alcuni non sono

L'opzione (4) è deprecata da MISRA C (e altri standard di questo tipo) ... allo stesso modo, il purista in me domanda perché (2) dovrebbe essere necessario (diverso da quello predefinito = 0) ma ci sono probabilmente motivi legittimi per questo.

Ovviamente, dove viene specificato un valore, allora ci dovrebbe essere una documentazione adeguata per spiegare perché!

IMHO è piuttosto pericoloso affidarsi alla conoscenza del valore sottostante di un'enumerazione, e ancora di più di assumere una sequenza - i problemi che si possono ottenere nell'incremento e decremento di un tipo enum ...

    
risposta data 24.10.2014 - 14:05
fonte
0

È puramente una chiamata di linee guida per la codifica del software (chiamata alla conformità del processo).

i valori enumerati sono cruciali per molti algoritmi e dovrebbero essere gestiti con la massima cura. Un'altra opzione di utilizzo è che è meglio che il nome della costante di enumerazione trasmetta il valore tramite il nome stesso per chiarire la comprensione.

Esempio:

enum retries {
    RETRY_ZERO,
    RETRY_ONE,
    RETRY_TWO,
    RETRY_THREE
};
    
risposta data 24.10.2014 - 18:45
fonte

Leggi altre domande sui tag