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;
}
}
}
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
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.
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.
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.
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.
À 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 ...
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.
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.
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.
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.
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é.