Progettazione di enum

Nota

Questo contenuto viene ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms and Patterns for Reusable .NET Libraries, 2nd Edition. Tale edizione è stata pubblicata nel 2008 e il libro è stato completamente rivisto nella terza edizione. Alcune informazioni in questa pagina potrebbero non essere aggiornate.

Le enumerazioni sono un tipo speciale di valore. Esistono due tipi di enumerazioni: enumerazioni semplici ed enumerazioni di flag.

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

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

✔️ USARE 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).

❌ DO NOT 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 sentinel 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'enumerazione anziché essere uno dei valori del set rappresentato dall'enumerazione.

✔️ 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 non sia true uno dei seguenti:

  • L'enumerazione è un'enumerazione flag e sono presenti più di 32 flag o si prevede di averne di più in futuro.

  • Il tipo sottostante deve essere diverso rispetto a Int32 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 che l'enumerazione venga usata principalmente come argomento per il flusso di controllo, la dimensione fa poca differenza. Il risparmio delle dimensioni potrebbe essere significativo se:

    • Si prevede che l'enumerazione venga usata come campo in una struttura o una classe di cui è stata creata un'istanza molto frequentemente.

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

    • Si prevede che un numero elevato di istanze dell'enumerazione venga serializzato.

Per l'utilizzo in memoria, tenere presente che gli oggetti gestiti sono sempre allineati a DWORD, quindi sono necessarie in modo efficace più enumerazioni o altre piccole strutture in un'istanza con cui comprimere un'enumerazione più piccola per fare la differenza, perché le dimensioni totali dell'istanza verranno sempre arrotondate a un valore DWORD.

✔️ CHIAMARE le enumerazioni flag con sostantivi o frasi sostantive plurali ed enumerazioni 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 parola chiave enum 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.

✔️ USARE le potenze di due per i valori di enumerazione del flag in modo che possano essere combinati liberamente usando l'operazione OR bit per bit.

✔️ 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.

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

Aggiunta di valore alle enumerazioni

È molto comune scoprire che è necessario aggiungere valori a un'enumerazione dopo che è già stata spedita. 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.

Parti protette da copyright © 2005, 2009 Microsoft Corporation. Tutti i diritti sono riservati.

Ristampato con l'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2a edizione di Krzysztof Cwalina and Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional nella collana Microsoft Windows Development Series.

Vedi anche