Partage via


Conception de propriété

Remarque

Ce contenu est réimprimé avec l’autorisation de Pearson Education, Inc. tiré de Lignes directrices de conception de framework : Conventions, Idiomes et Modèles pour les bibliothèques .NET réutilisables, 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.

Bien que les propriétés soient techniquement très similaires aux méthodes, elles sont très différentes en termes de scénarios d’utilisation. Ils doivent être considérés comme des champs intelligents. Elles ont la syntaxe d'appel des champs et la flexibilité des méthodes.

✔️ Créez des propriétés get-only si l’appelant ne doit pas être en mesure de modifier la valeur d'une propriété.

N’oubliez pas que si le type de la propriété est un type de référence mutable, la valeur de la propriété peut être modifiée même si la propriété est get-only.

❌ Ne fournissez pas de propriétés uniquement configurables ou de propriétés où le setter a une accessibilité plus large que le getter.

Par exemple, n’utilisez pas de propriétés avec un setter public et un getter protégé.

Si le getter de propriété ne peut pas être fourni, implémentez plutôt la fonctionnalité en tant que méthode. Envisagez de commencer le nom de la méthode par Set et de continuer par ce que vous auriez appelé la propriété. Par exemple, AppDomain a une méthode appelée SetCachePath au lieu d’avoir une propriété set-only appelée CachePath.

✔️ Fournissez des valeurs par défaut sensibles pour toutes les propriétés, ce qui garantit que les valeurs par défaut n’entraînent pas de trou de sécurité ou de code terriblement inefficace.

✔️ DO autorise la définition des propriétés dans n’importe quel ordre, même si cela entraîne un état temporaire non valide de l’objet.

Il est courant que deux propriétés ou plus soient liées à un point où certaines valeurs d’une propriété peuvent ne pas être valides en fonction des valeurs d’autres propriétés sur le même objet. Dans ce cas, les exceptions résultant de l’état non valide doivent être reportées jusqu’à ce que les propriétés liées entre elles soient réellement utilisées ensemble par l’objet.

✔️ Conservez la valeur précédente si un mutateur de propriété lève une exception.

❌ Évitez de lever des exceptions à partir de getters de propriétés.

Les getters de propriété doivent être des opérations simples et ne doivent pas avoir de prérequis. Si un getter peut lever une exception, il doit probablement être repensé pour être une méthode. Notez que cette règle ne s’applique pas aux indexeurs, où nous attendons des exceptions en raison de la validation des arguments.

Conception de Propriétés Indexées

Une propriété indexée est une propriété spéciale qui peut avoir des paramètres et qui peut être appelée avec une syntaxe spéciale similaire à l’indexation de tableau.

Les propriétés indexées sont couramment appelées indexeurs. Les indexeurs doivent être utilisés uniquement dans les API qui fournissent l’accès aux éléments d’une collection logique. Par exemple, une chaîne est un ensemble de caractères, et l’indexeur sur System.String a été ajouté pour accéder à ses caractères.

✔️ ENVISAGEZ d’utiliser des indexeurs pour fournir l’accès aux données stockées dans un tableau interne.

✔️ ENVISAGEZ de fournir des indexeurs sur des types représentant des collections d’éléments.

❌ ÉVITEZ d’utiliser des propriétés indexées avec plusieurs paramètres.

Si la conception nécessite plusieurs paramètres, reconsidérer si la propriété représente vraiment un accesseur à une collection logique. Si ce n’est pas le cas, utilisez plutôt des méthodes. Envisagez de démarrer le nom de la méthode avec Get ou Set.

❌ÉVITEz les indexeurs avec des types de paramètres autres que System.Int32, , System.Int64System.String, , System.Objectou une énumération.

Si la conception nécessite d’autres types de paramètres, réévaluez fortement si l’API représente vraiment un accesseur à une collection logique. Si ce n’est pas le cas, utilisez une méthode. Envisagez de démarrer le nom de la méthode avec Get ou Set.

✔️ Utilisez le nom Item pour les propriétés indexées, sauf s’il existe un nom évidemment meilleur (par exemple, consultez la propriété Chars[] sur System.String).

En C#, les indexeurs sont par défaut nommés Item. IndexerNameAttribute peut être utilisé pour personnaliser ce nom.

❌ Ne fournissez pas à la fois un indexeur et des méthodes qui sont sémantiquement équivalentes.

❌ Ne fournissez pas plus d'un ensemble d'indexeurs surchargés dans un même type.

Cela est appliqué par le compilateur C#.

❌ N’utilisez PAS les propriétés indexées non définies.

Cela est appliqué par le compilateur C#.

Événements de notification de modification de propriété

Parfois, il est utile de fournir un événement informant l’utilisateur des modifications apportées à une valeur de propriété. Par exemple, System.Windows.Forms.Control déclenche un TextChanged événement après la modification de la valeur de sa Text propriété.

✔️ ENVISAGEZ de déclencher des événements de notification de modification lorsque les valeurs de propriété dans les API de haut niveau (généralement les composants du concepteur) sont modifiées.

S’il existe un bon scénario pour qu’un utilisateur sache quand une propriété d’un objet change, l’objet doit déclencher un événement de notification de modification pour la propriété.

Toutefois, il est probablement inutile de déclencher ces événements pour des API de bas niveau telles que les types de base ou les collections. Par exemple, List<T> ne déclenche pas de tels événements lorsqu’un nouvel élément est ajouté à la liste et que la Count propriété change.

✔️ ENVISAGEZ de déclencher des événements de notification de modification lorsque la valeur d’une propriété change via des forces externes.

Si une valeur de propriété change via une force externe (autrement qu’en appelant des méthodes sur l’objet), déclenchez des événements indiquant au développeur que la valeur change et a changé. Un bon exemple est la Text propriété d’un contrôle de zone de texte. Lorsque l’utilisateur tape du texte dans un TextBox, la valeur de propriété change automatiquement.

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

Réimprimé par l’autorisation de Pearson Education, Inc. tiré de Framework Design Guidelines : Conventions, Idioms et Patterns pour les bibliothèques .NET réutilisables, 2e édition par Krzysztof Cwalina et Brad Abrams, publié le 22 octobre 2008 par Addison-Wesley Professional dans le cadre de la Série de développement Microsoft Windows.

Voir aussi