web-dev-qa-db-fra.com

Les propriétés calculées en lecture seule C #, devraient-elles être des méthodes?

J'ai plusieurs entités qui ont calculé des champs dessus, comme TotalCost. En ce moment, je les ai toutes comme propriétés mais je me demande si elles devraient être des méthodes. Existe-t-il une norme C # pour cela?

public class WorkOrder
{
    public int LaborHours { get; set; }
    public decimal LaborRate { get; set; }

    // Should this be LaborCost()?
    public decimal LaborCost
    {
        get
        {
            return LaborHours * LaborRate;
        }
    }
}
47
Jim Mitchener

Il est acceptable d'utiliser des propriétés calculées plutôt que des méthodes, tant que le calcul ne prend pas de temps notable

Voir Consignes d'utilisation de la propriété

54
Thomas Levesque

Je pense que les méthodes devraient effectuer des actions sur l'objet, généralement changer l'état de l'objet. Les propriétés doivent refléter l'état actuel de l'objet même si la propriété est calculée. Vous devez donc conserver vos propriétés OMI.

15
Cellfish

Je pense qu'ils devraient tous être des propriétés. Tant qu'il ne change pas l'état de l'objet, je suis cool avec lui en tant que propriété.

De plus, si j'utilise votre classe pour la liaison de données (WPF, etc.), je peux alors me lier directement à votre propriété sans avoir à modifier/étendre la classe.

7
Tim Ridgely

S'ils sont a) légers et b) n'ont pas d'effets secondaires, je leur ferais des propriétés.

La légèreté est un peu floue bien sûr, mais la règle de base est la suivante: si jamais je dois m'inquiéter d'appeler une propriété (que ce soit dans une boucle ou ailleurs), cela devrait éventuellement être une méthode.

3
Michael Stum

Je les laisserais comme propriétés. Mais il n'y a pas de raison "standard" de faire les choses d'une manière ou d'une autre. Si vous êtes seul, faites ce que vous préférez. Si vous faites partie d'une équipe, suivez les conventions suivies par le reste de votre équipe.

1
Billy ONeal

À mon avis, c'est une préférence; c'est ce que tu veux faire. Je fais des propriétés dans la plupart des cas, sauf s'il y a une logique impliquée. De plus, si vous devez passer des paramètres pour changer la fonctionnalité, alors évidemment une méthode s'appliquerait ...

0
Brian Mains

Cela dépend, si vos "propriétés" deviennent des mammouths et nécessitent toute une série de logiques commerciales, elles ne devraient pas être des propriétés, il devrait y avoir une méthode. L'exemple que vous avez publié semble correct d'être une propriété. Pas de façon standard de le faire, allez-y avec votre instinct; s'il semble qu'il doit faire beaucoup, vous avez probablement besoin d'une méthode.

0
JonH

Si une propriété est particulièrement coûteuse à calculer, je pourrais la changer en une méthode GetWwhat (). Cela sert d'indication à quiconque utilise ma classe que cette valeur nécessite un travail important pour arriver, et l'appelant doit mettre en cache la valeur plutôt que d'appeler la méthode plusieurs fois.

Les calculs triviaux sont parfaitement appropriés à l'intérieur des propriétés.

0
Joel Mueller

De toute façon, il s'agit simplement de sucre syntaxique, alors je veux que vous soyez conventionnel dans votre équipe, ou ce que vous préférez, tant qu'il ne s'agit que de renvoyer des informations sur l'objet et de ne pas le changer ou d'interagir avec d'autres objets.

0
Paul Creasey

MSDN donne des informations à ce sujet ici

Les concepteurs de bibliothèques de classes doivent souvent décider entre l'implémentation d'un membre de classe en tant que propriété ou méthode. En général, les méthodes représentent des actions et les propriétés représentent des données.

Lequel pensez-vous que c'est? Une action calcul/getLaborCost ou données?

WorkOrder workOrder = new WorkOrder();
workOrder.LaborHours = 8;
workOrder.LaborRate = 20;

decimal cost = workOrder.LaborCost; // This is OK here

mais si vous allez faire cela pour le même objet aussi:

worOrder.LaborHours = 18;
decimal newCost = workOrder.LaborCost 

Maintenant, cela ne peut pas être une propriété. Il vaudrait beaucoup mieux être une méthode.

0
JCasso

Parfois, vous devez également considérer ce que vous modélisez ... Sur certains domaines, les valeurs calculées sont souvent ou devraient être un attribut du modèle - une propriété. Si tel était le cas, écrivez-le en tant que propriété même si le calcul n'est pas du tout trivial ou un peu cher à calculer. Documentez-le simplement sur votre API ou implémentez un mécanisme de mise en cache pour minimiser le recalcul pour cette propriété.

0
Mark Menchavez