Conception d'énumérations

Remarque

Ce contenu est réimprimé avec l’autorisation de Pearson Education, Inc. à partir des Instructions de conception d’une infrastructure : conventions, idiomes et modèles des bibliothèques réutilisables .NET, 2ème édition. Cette édition a été publiée en 2008, et le livre a été entièrement révisé dans la troisième édition. Certaines informations de cette page peuvent être obsolètes.

Les énumérations sont un type de valeur spécial. Il existe deux types d’énumérations : des énumérations simples et des énumérations d’indicateurs.

Les énumérations simples représentent de petits ensembles de choix fermés. Un exemple courant de l’énumération simple est un ensemble de couleurs.

Les énumérations d’indicateurs sont conçues pour prendre en charge les opérations au niveau du bit sur les valeurs d’énumération. Un exemple courant de l’énumération des indicateurs est une liste d’options.

✔️ UTILISEZ une énumération pour taper fortement des paramètres, des propriétés et des valeurs de retour qui représentent des ensembles de valeurs.

✔️ PRIVILÉGIEZ l’utilisation d’une énumération au lieu de constantes statiques.

❌ N’utilisez PAS d’énumération pour les jeux ouverts (par exemple, la version du système d’exploitation, les noms de vos amis, etc.).

❌ NE fournissez PAS de valeurs d’énumération réservées destinées à une utilisation ultérieure.

Vous pouvez toujours simplement ajouter des valeurs à l’énumération existante à un stade ultérieur. Pour plus d’informations sur l’ajout de valeurs à des énumérations, consultez Ajout de valeurs à des énumérations. Les valeurs réservées polluent simplement l’ensemble de valeurs réelles et ont tendance à entraîner des erreurs utilisateur.

❌ ÉVITEZ d’exposer publiquement des énumérations avec une seule valeur.

Une pratique courante pour garantir l’extensibilité future des API C consiste à ajouter des paramètres réservés aux signatures de méthode. Ces paramètres réservés peuvent être exprimés sous forme d’énumérations avec une valeur par défaut unique. Cette opération ne doit pas être effectuée dans les API managées. La surcharge de méthode permet d’ajouter des paramètres dans les versions ultérieures.

❌ N’INCLUEZ PAS les valeurs sentinelles dans les énumérations.

Bien qu’elles soient parfois utiles pour les développeurs d’infrastructure, les valeurs sentinelles sont déroutantes pour les utilisateurs de l’infrastructure. Elles sont utilisées pour suivre l’état de l’énumération plutôt que d’être l’une des valeurs de l’ensemble représenté par l’énumération.

✔️ FOURNISSEZ une valeur de zéro sur des énumérations simples.

Envisagez d’appeler la valeur « None », ou un nom du même genre. Si une telle valeur n’est pas appropriée pour cette énumération particulière, la valeur par défaut la plus courante pour l’énumération doit être affectée à la valeur sous-jacente de zéro.

✔️ ENVISAGEZ d’utiliser Int32 (la valeur par défaut dans la plupart des langages de programmation) comme type sous-jacent d’énumération, sauf si l’un des éléments suivants est vrai :

  • L’énumération est une énumération d’indicateurs et vous avez plus de 32 indicateurs, ou vous vous attendez à avoir plus à l’avenir.

  • Le type sous-jacent doit être différent de Int32 pour une interopérabilité plus simple avec du code non managé qui attend des énumérations de taille différente.

  • Un type sous-jacent plus petit entraînerait des économies substantielles dans l’espace. Si vous attendez que l’énumération soit utilisée principalement comme argument pour le flux de contrôle, la taille fait peu de différence. Les économies de taille peuvent être importantes si :

    • Vous vous attendez à ce que l’énumération soit utilisée comme champ dans une structure ou une classe très fréquemment instanciée.

    • Vous vous attendez à ce que les utilisateurs créent de grands tableaux ou collections d’instances d’énumération.

    • Vous vous attendez à ce qu’un grand nombre d’instances de l’énumération soient sérialisées.

Pour une utilisation en mémoire, n’oubliez pas que les objets managés sont toujours alignés avec DWORD, de sorte que vous avez effectivement besoin de plusieurs énumérations ou d’autres petites structures d’une instance pour empaqueter une énumération plus petite afin de faire une différence, car la taille totale de l’instance va toujours être arrondie à un DWORD.

✔️ NOMMER les énumérations d’indicateur avec des noms ou des phrases de noms pluriels et les énumérations simples avec des noms ou des phrases de noms singuliers.

❌ NE PAS étendre System.Enum directement.

System.Enum est un type spécial utilisé par le CLR pour créer des énumérations définies par l’utilisateur. La plupart des langages de programmation fournissent un élément de programmation qui vous donne accès à cette fonctionnalité. Par exemple, en C#, le mot clé enum est utilisé pour définir une énumération.

Conception d’énumérations d’indicateurs

✔️ APPLIQUEZ le System.FlagsAttribute aux énumérations d’indicateurs. N’appliquez pas cet attribut à des énumérations simples.

✔️ UTILISEZ les puissances de deux pour les valeurs d’énumération d’indicateur afin qu’elles puissent être combinées librement à l’aide de l’opération OU au niveau du bit.

✔️ ENVISAGEZ de fournir des valeurs d’énumération spéciales pour les combinaisons couramment utilisées d’indicateurs.

Les opérations au niveau du bit sont un concept avancé et ne doivent pas être requises pour les tâches simples. ReadWrite est un exemple de cette valeur spéciale.

❌ ÉVITEZ de créer des énumérations d’indicateurs dans lesquelles certaines combinaisons de valeurs ne sont pas valides.

❌ ÉVITEZ d’utiliser des valeurs d’énumération d’indicateur de zéro, sauf si la valeur représente « tous les indicateurs sont effacés » et est nommée de manière appropriée, comme indiqué par la directive suivante.

✔️ NOMMEZ la valeur zéro des énumérations d’indicateurs None. Pour une énumération d’indicateur, la valeur doit toujours signifier « tous les indicateurs sont effacés ».

Ajout de valeur à des énumérations

Il est très courant de découvrir que vous devez ajouter des valeurs à une énumération une fois que vous l’avez déjà expédié. Il existe un problème potentiel de compatibilité d’application lorsque la valeur nouvellement ajoutée est retournée par une API existante, car les applications mal écrites peuvent ne pas gérer correctement la nouvelle valeur.

✔️ ENVISAGEZ d’ajouter des valeurs à des énumérations, malgré un petit risque de compatibilité.

Si vous avez des données réelles sur les incompatibilités d’application provoquées par des ajouts à une énumération, envisagez d’ajouter une nouvelle API qui retourne les nouvelles valeurs et les anciennes valeurs, et de déprécier l’ancienne API, qui doit continuer à retourner uniquement les anciennes valeurs. Cela garantit que vos applications existantes restent compatibles.

Portions © 2005, 2009 Microsoft Corporation. Tous droits réservés.

Réimprimé avec l’autorisation de Pearson Education, Inc. et extrait de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition par Krzysztof Cwalina et Brad Abrams, publié le 22 octobre 2008 par Addison-Wesley Professional dans le cadre de la série sur le développement Microsoft Windows.

Voir aussi