Conception des propriétés

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.

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. Elles doivent être considérées comme des champs intelligents. Elles ont la syntaxe d’appel des champs et la flexibilité des méthodes.

✔️ CRÉEZ des propriétés uniquement get si l’appelant ne doit pas être en mesure de modifier la valeur de la propriété.

Gardez à l’esprit 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 uniquement get.

❌ NE FOURNISSEZ PAS de propriétés uniquement set ou de propriétés définies uniquement avec le setter disposant d’une accessibilité plus importante 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 la 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 le suivre par le nom que vous auriez donné à la propriété. Par exemple, AppDomain a une méthode appelée SetCachePath au lieu d’avoir une propriété uniquement set appelée CachePath.

✔️ FOURNISSEZ des valeurs par défaut raisonnables à toutes les propriétés, pour veiller à ce que les valeurs par défaut n’entraînent pas une faille de sécurité ni une inefficacité du code.

✔️ AUTORISEZ les propriétés à être définies 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 être non valides compte tenu 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 soient réellement utilisées ensemble par l’objet.

✔️ CONSERVEZ la valeur précédente si le setter d’une propriété lève une exception.

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

Les getters de propriétés doivent être des opérations simples et ils ne doivent pas avoir de conditions préalables. Si un getter peut lever une exception, il doit probablement être remanié en tant que méthode. Notez que cette règle ne s’applique pas aux indexeurs, pour lesquels nous attendons des exceptions suite à 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 tableaux.

Les propriétés indexées sont couramment appelées des indexeurs. Les indexeurs doivent être utilisés uniquement dans les API qui donnent accès à des éléments dans une collection logique. Par exemple, une chaîne est une collection 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 les 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, déterminez 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 commencer le nom de la méthode par Get ou Set.

❌ ÉVITEZ les indexeurs dont les types de paramètres sont autres que System.Int32, System.Int64, System.String, System.Object ou 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 commencer le nom de la méthode par Get ou Set.

✔️ UTILISEZ le nom Item pour les propriétés indexées, sauf s’il existe un meilleur nom évident (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 sémantiquement équivalentes.

❌ NE FOURNISSEZ PAS plusieurs familles d’indexeurs surchargés dans un seul type.

Le compilateur C# applique cette règle.

❌ N’UTILISEZ PAS de propriétés indexées personnalisées.

Le compilateur C# applique cette règle.

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

Il s’avère parfois utile de fournir un événement qui informe l’utilisateur des modifications apportées à la valeur d’une propriété. Par exemple, System.Windows.Forms.Control déclenche un événement TextChanged suite à la modification de la valeur de sa propriété Text.

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

S’il existe un scénario approprié dans lequel un utilisateur doit savoir à quel moment une propriété d’un objet évolue, l’objet doit déclencher un événement de notification de modification pour la propriété.

Toutefois, il est peu probable que cette surcharge soit nécessaire pour déclencher de tels événements pour des API basiques comme des types ou collections de base. Par exemple, List<T> ne déclenche pas de tels événements lorsqu’un nouvel élément est ajouté à la liste et que la propriété Count change.

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

Si la valeur d’une propriété change par le biais d’une force externe (d’une autre manière qu’en appelant des méthodes sur l’objet), des événements de déclenchement indiquent au développeur que la valeur est en train de changer et qu’elle a changé. La propriété Text d’un contrôle de zone de texte en est un bon exemple. Lorsque l’utilisateur tape du texte dans un TextBox, la valeur de la propriété change automatiquement.

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