158 votes

Propriétés et méthodes

Question rapide : Quand décide-t-on d'utiliser les propriétés (en C#) et quand décide-t-on d'utiliser les méthodes ?

Nous sommes en train de mener ce débat et nous avons trouvé certains domaines où l'on peut se demander si l'on doit utiliser une propriété ou une méthode. En 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 ce contrôle une méthode ou une propriété ?

J'accepterai la réponse la plus générale et la plus complète, mais qui touche également à l'exemple que j'ai donné.

2 votes

-1 cette question a déjà été posée et répondue auparavant : stackoverflow.com/questions/164527/

0 votes

Les avantages et les inconvénients de la méthode/du champ/de la propriété peuvent donner lieu à de longs débats ; quelques utilisations générales des propriétés : lorsque vous voulez des champs privés/protégés mais que vous voulez en même temps les exposer. Une autre utilisation est d'avoir non seulement des déclarations mais aussi des expressions (actions si vous voulez) même if() (conformément à MSDN). Mais c'est délicat car l'utilisateur n'est pas toujours conscient du coût de traitement derrière l'accès à une variable (propriété) (c'est-à-dire que le code n'est pas disponible) et pour des raisons de rigueur, il faudrait évaluer la propriété. Oh, et un "bonus", vous ne pouvez pas utiliser de pointeurs avec les propriétés.

0 votes

Malgré le -1 donné ci-dessus, j'ai trouvé ce fil plus enrichissant que l'autre... c'est ça le pouvoir du vote

169voto

Ken Browning Points 15689

De la Choisir entre les propriétés et les méthodes section des Directives de conception pour le développement des bibliothèques de classe :

En général, les méthodes représentent des actions et les propriétés des données. Les propriétés sont destinées à être utilisées comme des champs, ce qui signifie qu'elles ne doivent pas être complexes sur le plan informatique ni produire d'effets secondaires. Lorsque cela n'enfreint pas les directives suivantes, 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.

4 votes

Bien que je sois d'accord avec la plupart de ces propos, je ne pense pas que la partie concernant les effets secondaires soit correcte. Par exemple, "Couleur" est souvent une propriété d'un objet, et elle a des effets secondaires évidents (changer la couleur d'un objet). Changer les propriétés a l'effet secondaire évident de changer l'état de l'objet.

48 votes

Mystere Man changer de couleur est l'effet désiré et non un effet secondaire. L'effet secondaire est quelque chose qui n'est pas prévu dans l'action primaire.

2 votes

@Mystere Man : Définitivement, le changement de couleur n'est pas un effet secondaire, je suis tout à fait d'accord avec cette réponse.

64voto

cletus Points 276888

Oui, si tout ce que vous faites est d'obtenir et de fixer, utilisez une propriété.

Si vous faites quelque chose de complexe qui peut 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 frontière peut être un peu floue. Il n'y a pas de règle absolue et différentes personnes ne seront pas toujours d'accord sur la question de savoir si un élément doit être une propriété ou une méthode. L'important est simplement d'être (relativement) cohérent avec la façon dont les méthodes sont utilisées. usted le faire (ou comment votre équipe le fait).

Ils sont largement interchangeables, mais une propriété signale à l'utilisateur que l'implémentation est relativement "simple". Oh et la syntaxe est un peu plus propre.

D'une manière 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), c'est un candidat de choix pour une propriété.

1 votes

Voté à la baisse. Ce n'est pas correct. La complexité d'un getter ou setter est encapsulée dans le code du getter / setter. La complexité n'est pas du tout pertinente, pas plus que le fait qu'elle "affecte plusieurs membres de données". Il est vrai que les paramètres non standard ou multiples nécessitent une méthode, mais autrement, cette réponse n'est pas exacte.

0 votes

La première phrase explique tout. Bravo.

14voto

Chuck Conway Points 10293

Les propriétés sont un moyen d'injecter ou de récupérer des données dans un objet. Elles créent une abstraction sur les variables ou les données d'une classe. Elles sont analogues aux getters et setters de Java.

Les méthodes encapsulent une opération.

En général, j'utilise les propriétés pour exposer des éléments de données uniques ou de petits calculs sur une classe, comme la taxe de vente. Qui est dérivée du nombre d'articles et de leur coût dans un panier d'achat.

J'utilise des méthodes lorsque je crée une opération, comme récupérer des données dans la base de données. Toute opération qui comporte des parties mobiles est susceptible de faire l'objet d'une méthode.

Dans votre exemple de code, je l'envelopperais dans une propriété si j'avais besoin d'y accéder en dehors de la classe qui la contient :

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Mise en place du texte :

Title.Text = "Properties vs Methods";

Si je devais uniquement définir la propriété Text de l'étiquette, voici comment je procéderais :

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Mise en place du texte :

Title = "Properties vs Methods";

12voto

Robin Day Points 39440

Si vous définissez une propriété réelle de votre objet, vous utilisez une propriété.

Si vous effectuez une tâche ou une 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 d'ajouter une étiquette à une étiquette, vous utiliseriez une méthode.

9voto

Erik Funkenbusch Points 53436

Il suffit de regarder le nom même... "Propriété". Que signifie-t-il ? Le dictionnaire le définit de plusieurs façons, mais dans ce cas, "un attribut ou une qualité essentielle ou distinctive d'une chose" est la meilleure définition.

Pensez à l'objectif de l'action. Modifiez-vous ou récupérez-vous en fait "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 stupide, n'est-ce pas ?

Les propriétés sont vraiment des fonctions. Elles se résument toutes à getXXX() et setXXX(). Elles sont simplement cachées par du sucre syntaxique, mais c'est ce sucre qui donne un sens sémantique au processus.

Pensez aux propriétés comme à des attributs. Une voiture a de nombreux attributs. Couleur, MPG, modèle, etc. Toutes les propriétés ne sont pas paramétrables, certaines sont calculables.

En revanche, une Méthode est une action. GetColor devrait être une propriété. GetFile() doit être une fonction. Une autre règle empirique est que si elle ne change pas l'état de l'objet, elle doit être une fonction. Par exemple, CalculatePiToNthDigit(n) doit être une fonction, car elle ne modifie pas réellement l'état de l'objet Math auquel elle est attachée.

Je m'égare peut-être un peu, mais il s'agit en fait de décider quels sont vos objets et ce qu'ils représentent. Si vous n'arrivez pas à déterminer s'il doit s'agir d'une propriété ou d'une fonction, le choix n'a peut-être pas d'importance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X