Question rapide: Quand décidez-vous d'utiliser des propriétés (en C #) et quand décidez-vous d'utiliser des méthodes?
Nous sommes occupés à ce débat et avons trouvé des domaines dans lesquels il est discutable de savoir si nous devrions utiliser une propriété ou une méthode. Voici un exemple:
public void SetLabel(string text)
{
Label.Text = text;
}
Dans l'exemple, Label
est un contrôle sur une page ASPX. Existe-t-il un principe qui puisse régir la décision (dans ce cas) de faire de cela une méthode ou une propriété.
J'accepterai la réponse la plus générale et la plus complète, mais cela touche également à l'exemple que j'ai donné.
Extrait de la section Choix entre propriétés et méthodes des directives de conception pour le développement de bibliothèques de classes:
En général, les méthodes représentent des actions et les propriétés représentent des données. Les propriétés sont destinées à être utilisées comme des champs, ce qui signifie que les propriétés ne doivent pas être complexes en termes de calcul ni produire d'effets secondaires. Dans le cas contraire, envisagez d'utiliser une propriété plutôt qu'une méthode, car les développeurs moins expérimentés trouvent les propriétés plus faciles à utiliser.
Oui, si tout ce que vous faites est de définir et d’obtenir, utilisez une propriété.
Si vous faites quelque chose de complexe pouvant affecter plusieurs membres de données, une méthode est plus appropriée. Ou si votre getter prend des paramètres ou si votre setter prend plus d’un paramètre de valeur.
Au milieu se trouve une zone grise où la ligne peut être un peu floue. Il n'y a pas de règle absolue et différentes personnes seront parfois en désaccord sur le point de savoir si quelque chose doit être une propriété ou une méthode. L'important est simplement d'être (relativement) cohérent avec comment vous le faites (ou comment votre équipe le fait).
Ils sont en grande partie interchangeables, mais une propriété indique à l'utilisateur que la mise en œuvre est relativement "simple". Oh, et la syntaxe est un peu plus propre.
En règle générale, ma philosophie est que si vous commencez à écrire un nom de méthode qui commence par get ou set et prend zéro ou un paramètre (respectivement), il s'agit d'un candidat idéal pour une propriété.
Si vous définissez une propriété réelle de votre objet, vous utilisez une propriété.
Si vous effectuez une tâche/fonctionnalité, vous utilisez une méthode.
Dans votre exemple, il s'agit d'une propriété définie en cours de définition.
Si, toutefois, votre fonctionnalité était à AppendToLabel, vous utiliseriez une méthode.
Les propriétés sont un moyen d'injecter ou de récupérer des données d'un objet. Ils créent une abstraction sur les variables ou les données d'une classe. Ils sont analogues aux getters et setters de Java.
Les méthodes encapsulent une opération.
En général, j'utilise des propriétés pour exposer des bits de données, ou de petits calculs sur une classe, comme la taxe de vente. Qui est dérivé du nombre d'articles et de leur coût dans un panier.
J'utilise des méthodes lorsque je crée une opération, comme récupérer des données de la base de données. Toute opération comportant des pièces mobiles est candidate à une méthode.
Dans votre exemple de code, je l'envelopperais dans une propriété si je dois y accéder en dehors de sa classe contenant:
public Label Title
{
get{ return titleLabel;}
set{ titleLabel = value;}
}
Définir le texte:
Title.Text = "Properties vs Methods";
Si je ne définissais que la propriété Text du Label, voici comment je le ferais:
public string Title
{
get{ return titleLabel.Text;}
set{ titleLabel.Text = value;}
}
Définir le texte:
Title = "Properties vs Methods";
En recherchant par le biais de MSDN, j'ai trouvé une référence sur Propriétés vs Méthodes qui fournit d'excellentes instructions pour la création de méthodes:
- L'opération est une conversion, telle que
Object.ToString
.- L’opération est suffisamment coûteuse pour que vous souhaitiez communiquer avec le qu’ils devraient envisager de mettre en cache le résultat.
- L'obtention d'une valeur de propriété à l'aide de l'accesseur get aurait un effet observable effet secondaire.
- Appeler le membre deux fois de suite produit des résultats différents.
- L'ordre d'exécution est important. Notez que les propriétés d'un type doivent pouvoir être réglé et récupéré dans n’importe quel fichier ordre.
- Le membre est statique mais renvoie une valeur qui peut être modifiée.
- Le membre retourne un tableau. Les propriétés qui renvoient des tableaux peuvent être très trompeur. D'habitude c'est nécessaire de renvoyer une copie du tableau interne de sorte que l'utilisateur ne peut pas changer d'état interne. Ceci, couplé avec le fait qu'un utilisateur peut facilement supposons qu'il s'agisse d'une propriété indexée, conduit à un code inefficace.
Il suffit de regarder le nom même ... "Propriété". Qu'est-ce que ça veut dire? Le dictionnaire le définit à bien des égards, mais dans ce cas, "un attribut essentiel ou distinctif ou la qualité d'une chose" convient mieux.
Pensez au but de l'action. Modifiez-vous ou récupérez-vous "un attribut essentiel ou distinctif"? Dans votre exemple, vous utilisez une fonction pour définir une propriété d'une zone de texte. Cela semble un peu bête, n'est-ce pas?
Les propriétés sont vraiment des fonctions. Ils compilent tous pour getXXX () et setXXX (). Il les cache simplement dans le sucre syntaxique, mais c'est le sucre qui donne un sens sémantique au processus.
Pensez aux propriétés comme les attributs. Une voiture a beaucoup d'attributs. Couleur, MPG, Modèle, etc. Toutes les propriétés ne sont pas configurables, certaines sont calculables.
Pendant ce temps, une méthode est une action. GetColor devrait être une propriété. GetFile () devrait être une fonction. Une autre règle est que, si cela ne change pas l'état de l'objet, il devrait alors s'agir d'une fonction. Par exemple, CalculatePiToNthDigit (n) doit être une fonction, car elle ne modifie pas réellement l'état de l'objet Math auquel il est attaché.
C’est peut-être un peu difficile, mais il s’agit vraiment de décider quels sont vos objets et ce qu’ils représentent. Si vous ne pouvez pas déterminer s'il doit s'agir d'une propriété ou d'une fonction, cela n'a peut-être pas d'importance.
Symantiquement, les propriétés sont des attributs de vos objets . Les méthodes sont des comportements de votre objet.
L'étiquette est un attribut et il est plus logique d'en faire une propriété.
En termes de programmation orientée objet, vous devez avoir une idée claire de ce qui fait partie du comportement et de ce qui n’est qu’un attribut.
Voiture {couleur, modèle, marque}
Une voiture a des attributs de couleur, de modèle et de marque. Par conséquent, il n'est pas logique d'utiliser une méthode SetColor ou SetModel car, de manière symétrique, nous ne demandons pas à Car de définir sa propre couleur.
Donc, si vous mappez le cas propriété/méthode à l'objet de la vie réelle ou si vous le regardez d'un point de vue symantique, votre confusion disparaîtra vraiment.
Je préfère utiliser les propriétés pour ajouter/définir des méthodes avec 1 paramètre. Si les paramètres sont plus nombreux, utilisez des méthodes.
Les propriétés ne doivent être que simples et ne comporter qu'un seul support. Rien de plus et il devrait vraiment être déplacé vers une méthode. Le code complexe doit toujours être dans les méthodes.
J'utilise uniquement les propriétés pour l'accès aux variables, c'est-à-dire obtenir et définir des variables individuelles ou obtenir et définir des données dans des contrôles. Dès que tout type de manipulation de données est nécessaire/effectué, j'utilise des méthodes.
Un autre avantage non négligeable pour les propriétés est que la valeur de la propriété peut être vue dans Visual Studio lors du débogage.
Les propriétés sont vraiment belles car elles sont accessibles dans le concepteur visuel de visual studio, à condition qu’elles y aient accès.
Ils sont utilisés lorsque vous êtes simplement en train de paramétrer et d’obtenir une validation qui ne permet pas d’accéder à une quantité importante de code. Soyez prudent car la création d'objets complexes lors de la validation n'est pas simple.
Toute autre méthode est la méthode préférée.
Ce n'est pas qu'une question de sémantique. L'utilisation de propriétés inappropriées commence à provoquer des phénomènes étranges dans Visual Studio Visual Designer.
Par exemple, je recevais une valeur de configuration dans une propriété d'une classe. La classe de configuration ouvre en fait un fichier et exécute une requête SQL pour obtenir la valeur de cette configuration. Cela posait des problèmes dans mon application car le fichier de configuration était ouvert et verrouillé par Visual Studio lui-même plutôt que par mon application, car il lisait et écrivait la valeur de configuration (via la méthode setter). Pour résoudre ce problème, je devais simplement le changer en méthode.
En ce qui concerne la conception, les propriétés représentent des données ou des attributs d'objet de classe, tandis que les méthodes sont des actions ou des comportements d'objet de classe.
En mode .Net, l’utilisation des propriétés a d’autres implications:
Idées fausses (IMHO) sur l'utilisation des propriétés:
Dans l'exemple ci-dessous, cela aurait pu être écrit, avec plus de sens commercial comme:
public String Title
{
set { Label.Text = text; }
}
Voici un bon ensemble de guidelines pour savoir quand utiliser les propriétés par rapport aux méthodes de Bill Wagner
Les appels répétés au passeur (avec la même valeur) ne doivent donner aucune différence par rapport à un seul appel.
Le get ne doit pas renvoyer de référence aux structures de données internes (voir le point 23). Une méthode peut renvoyer une copie en profondeur et éviter ce problème.
* Tiré de ma réponse à une question en double.
C'est simple.
1: use property quand vous voulez que vos données soient validées avant d'être stockées dans le champ. Ainsi, de cette manière, la propriété fournit une encapsulation pour vos champs. Parce que si vous laissez vos champs, l'utilisateur final public peut attribuer toute valeur qui peut ou non être valide selon vos exigences professionnelles, par exemple si l'âge doit être supérieur à 18 ans. Par conséquent, avant que la valeur soit stockée dans le champ correspondant, nous devons en vérifier la validité. De cette façon, les propriétés représentent des données.
2: Utilisez la méthode lorsque vous souhaitez exécuter une action telle que vous fournissez des données en tant que paramètre et que votre méthode effectue un traitement sur la base des valeurs fournies et renvoie la valeur traitée en sortie. Ou vous voulez changer la valeur d'un champ par ce calcul. "De cette façon, la méthode représente une action".