Condividi tramite


Progettazione Enum

Annotazioni

Questo contenuto viene ristampato con il permesso di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms e Pattern per Librerie .NET Riutilizzabili, 2a Edizione. Tale edizione è stata pubblicata nel 2008 e il libro è stato completamente rivisto nella terza edizione. Alcune informazioni in questa pagina potrebbero non essere aggiornate.

Gli enum sono un tipo speciale di valore. Esistono due tipi di enumerazioni: enumerazioni semplici e enumerazioni di flag.

Le enumerazioni semplici rappresentano piccoli set chiusi di scelte. Un esempio comune dell'enumerazione semplice è un set di colori.

Le flag enum sono progettate per supportare operazioni bitwise sui valori di enumerazione. Un esempio comune di enumerazione dei flag è un elenco di opzioni.

✔️ DO usa un'enumerazione per parametri, proprietà e valori restituiti fortemente tipizzati che rappresentano set di valori.

✔️ È consigliabile usare un'enumerazione anziché le costanti statiche.

❌ NON usare un'enumerazione per i set aperti (ad esempio la versione del sistema operativo, i nomi dei tuoi amici e così via).

❌ NON specificare valori di enumerazione riservati destinati all'uso futuro.

È sempre possibile aggiungere valori all'enumerazione esistente in una fase successiva. Per altri dettagli sull'aggiunta di valori alle enumerazioni, vedere Aggiunta di valori alle enumerazioni. I valori riservati inquinano solo il set di valori reali e tendono a causare errori dell'utente.

❌ EVITARE di esporre pubblicamente le enumerazioni con un solo valore.

Una pratica comune per garantire un'estendibilità futura delle API C consiste nell'aggiungere parametri riservati alle firme dei metodi. Tali parametri riservati possono essere espressi come enumerazioni con un singolo valore predefinito. Questa operazione non deve essere eseguita nelle API gestite. L'overload dei metodi consente di aggiungere parametri nelle versioni future.

❌ NON includere valori sentinella nelle enumerazioni.

Anche se a volte sono utili per gli sviluppatori di framework, i valori di Sentinel creano confusione per gli utenti del framework. Vengono usati per tenere traccia dello stato dell'enum, anziché essere uno dei valori del set rappresentato dall'enum.

✔️ DO specificare un valore pari a zero per le enumerazioni semplici.

Valutare la possibilità di chiamare il valore come "Nessuno". Se tale valore non è appropriato per questa particolare enumerazione, al valore predefinito più comune per l'enumerazione deve essere assegnato il valore sottostante pari a zero.

✔️ CONSIDERARE l'uso di Int32 (impostazione predefinita nella maggior parte dei linguaggi di programmazione) come tipo sottostante di un'enumerazione, a meno che uno dei seguenti non sia vero:

  • ** L'enumerazione è di tipo flag e contiene più di 32 flag, oppure si prevede di averne di più in futuro.

  • Il tipo sottostante deve essere diverso rispetto Int32 a per facilitare l'interoperabilità con codice non gestito che prevede enumerazioni di dimensioni diverse.

  • Un tipo sottostante più piccolo comporta un notevole risparmio nello spazio. Se si prevede di usare l'enumerazione principalmente come argomento per il flusso di controllo, la dimensione incide poco. Il risparmio delle dimensioni potrebbe essere significativo se:

    • Si prevede che l'enumerazione venga usata come campo in una struttura o una classe istanziata molto frequentemente.

    • Si prevede che gli utenti creino matrici o raccolte di grandi dimensioni delle istanze di enumerazione.

    • Si prevede di serializzare un numero elevato di istanze dell'enumerazione.

Per l'uso in memoria, è importante sapere che gli oggetti gestiti sono sempre allineati a DWORD, quindi per ottimizzare l'uso della memoria con un'enumerazione più piccola, è necessario combinare efficacemente più enumerazioni o altre strutture di ridotte dimensioni in un'istanza, poiché la dimensione totale dell'istanza verrà sempre arrotondata a un multiplo di DWORD.

✔️ Nomina le enumerazioni di tipo flag con nomi plurali o frasi sostantive e quelle semplici con sostantivi singolari o frasi sostantive.

❌ NON estendere System.Enum direttamente.

System.Enum è un tipo speciale usato da CLR per creare enumerazioni definite dall'utente. La maggior parte dei linguaggi di programmazione fornisce un elemento di programmazione che consente di accedere a questa funzionalità. Ad esempio, in C# la enum parola chiave viene usata per definire un'enumerazione.

Progettazione di enumerazioni flag

✔️ APPLICARE l'oggetto System.FlagsAttribute alle enumerazioni dei flag. Non applicare questo attributo a semplici enumerazioni.

Devi usare le potenze di due per i valori di enumerazione del flag in modo che possano essere combinati liberamente usando l'operazione bitwise OR.

✔️ VALUTARE la possibilità di fornire valori di enumerazione speciali per le combinazioni di flag di uso comune.

Le operazioni bit per bit sono un concetto avanzato e non devono essere necessarie per attività semplici. ReadWrite è un esempio di valore speciale.

❌ EVITARE di creare enumerazioni di flag in cui determinate combinazioni di valori non sono valide.

❌ EVITARE di usare valori di enumerazione flag pari a zero a meno che il valore non rappresenti "tutti i flag vengono cancellati" e viene denominato in modo appropriato, come previsto dalle linee guida successive.

✔️ DO denominare il valore zero delle enumerazioni dei flag None. Per un'enumerazione flag, il valore deve sempre significare "tutti i flag sono cancellati".

Aggiunta di valori alle enumerazioni

È molto comune scoprire che è necessario aggiungere valori a un enum dopo che è già stato distribuito. Esiste un potenziale problema di compatibilità delle applicazioni quando il valore appena aggiunto viene restituito da un'API esistente, perché le applicazioni scritte in modo non corretto potrebbero non gestire correttamente il nuovo valore.

✔️ PRENDERE IN CONSIDERAZIONE l'aggiunta di valori alle enumerazioni, nonostante un rischio di compatibilità ridotto.

Se si hanno dati reali sulle incompatibilità dell'applicazione causate da aggiunte a un'enumerazione, è consigliabile aggiungere una nuova API che restituisca i valori nuovi e precedenti e deprecare l'API precedente, che dovrebbe continuare a restituire solo i valori precedenti. In questo modo si garantisce che le applicazioni esistenti rimangano compatibili.

© Porzioni 2005, 2009 Microsoft Corporation. Tutti i diritti riservati.

Ristampato dall'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms e Patterns for Reusable .NET Libraries, 2nd Edition di Krzysztof Cwalina e Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional come parte della Serie di sviluppo di Microsoft Windows.

Vedere anche