Pour utiliser une propriété en lecture seule ou une méthode?

J’ai besoin d’exposer l’état ” is mapped? ” D’une instance d’une classe. Le résultat est déterminé par une vérification de base. Il ne s’agit pas simplement d’exposer la valeur d’un champ. Je ne sais pas si je devrais utiliser une propriété en lecture seule ou une méthode.

Propriété en lecture seule:

public bool IsMapped { get { return MappedField != null; } } 

Méthode:

 public bool IsMapped() { return MappedField != null; } 

J’ai lu le choix de MSDN entre les propriétés et les méthodes, mais je ne suis toujours pas sûr.

La norme C # dit

§ 8.7.4

Une propriété est un membre qui permet d’accéder à une caractéristique d’un object ou d’une classe. Des exemples de propriétés incluent la longueur d’une chaîne, la taille d’une police, la légende d’une fenêtre, le nom d’un client, etc. Les propriétés sont une extension naturelle des champs. Les deux sont des membres nommés avec des types associés et la syntaxe pour accéder aux champs et aux propriétés est la même. Cependant, contrairement aux champs, les propriétés ne dénotent pas les emplacements de stockage. Au lieu de cela, les propriétés ont des accesseurs qui spécifient les instructions à exécuter lorsque leurs valeurs sont lues ou écrites.

tandis que les méthodes sont définies comme

§ 8.7.3

Une méthode est un membre qui implémente un calcul ou une action pouvant être exécuté par un object ou une classe. Les méthodes ont une liste (éventuellement vide) de parameters formels, une valeur de retour (sauf si le type de retour de la méthode est vide) et sont statiques ou non statiques.

Les propriétés et les méthodes sont utilisées pour réaliser une encapsulation . Les propriétés encapsulent les données, les méthodes encapsulent la logique. Et c’est pourquoi vous devriez préférer une propriété en lecture seule si vous exposez des données. Dans votre cas, aucune logique ne modifie l’état interne de votre object. Vous voulez donner access à une caractéristique d’un object .

Si une instance de votre object IsMapped ou non est une caractéristique de votre object. Il contient une vérification, mais c’est pourquoi vous avez des propriétés pour y accéder. Les propriétés peuvent être définies à l’aide de la logique, mais elles ne doivent pas exposer de logique. Tout comme l’exemple mentionné dans la première citation: Imaginez la propriété Ssortingng.Length . Selon l’implémentation, il se peut que cette propriété boucle à travers la chaîne et compte les caractères. Il effectue également une opération, mais “de l’extérieur”, il donne simplement une déclaration sur l’état / les caractéristiques internes de l’object.

J’utiliserais la propriété, car il n’y a pas de “faire” (action), pas d’effets secondaires et ce n’est pas trop complexe.

Je crois personnellement qu’une method devrait faire quelque chose ou effectuer une action. Vous n’effectuez rien dans IsMapped , cela devrait donc être une property

J’irais pour une propriété. Principalement parce que la première phrase sur l’article MSDN référencé:

En général, les méthodes représentent des actions et les propriétés représentent des données.

Dans ce cas, il me semble assez clair que cela devrait être une propriété. C’est une vérification simple, pas de logique, pas d’effets secondaires, pas d’impact sur les performances. Cela ne devient pas beaucoup plus simple que cette vérification.

Modifier:

S’il vous plaît noter que s’il y avait un des éléments mentionnés ci-dessus et que vous le metsortingez dans une méthode, cette méthode devrait inclure un verbe fort, pas un verbe auxiliaire comme est ou a. Une méthode fait quelque chose. Vous pouvez l’appeler VerifyMapping ou DetermineMappingExistance ou autre chose, à condition que cela commence par un verbe.

Je pense que cette ligne dans votre lien est la réponse

Les méthodes représentent des actions et les propriétés représentent des données.

Il n’y a pas d’action ici, juste un morceau de données. Donc c’est une propriété.

Si à tout moment vous devez append des parameters pour obtenir la valeur, vous avez besoin d’une méthode. Sinon, vous avez besoin d’une propriété

À mon humble avis, la première propriété en lecture seule est correcte car IsMapped en tant qu’atsortingbut de votre object, et vous n’effectuez pas d’action (uniquement une évaluation), mais la cohérence avec votre base de code existante compte probablement plus que sémantique …. sauf s’il s’agit d’une mission

Je suis d’accord avec les gens ici pour dire que, comme il s’agit d’obtenir des données et qu’il n’y a pas d’effets secondaires, cela devrait être une propriété.

Pour étendre cela, j’accepterais aussi certains effets secondaires avec un setter (mais pas un getter) si les effets secondaires avaient du sens pour quelqu’un “regardant de l’extérieur”.

Une façon d’y penser est que les méthodes sont des verbes et que les propriétés sont des adjectifs (entre-temps, les objects eux-mêmes sont des noms et les objects statiques sont des noms abstraits).

La seule exception à la règle de verbe / adjectif est qu’il peut être judicieux d’utiliser une méthode plutôt qu’une propriété lors de l’obtention (ou de la définition) des informations en question, qui peuvent être très coûteuses: mais les gens ont l’habitude de penser que les propriétés ont peu d’impact sur les performances et, bien qu’il n’y ait pas vraiment de raison pour que cela soit toujours le cas, il pourrait être utile de souligner que GetIsMapped() .

Au niveau du code en cours d’exécution, il n’y a absolument aucune différence entre appeler une propriété et appeler une méthode équivalente pour obtenir ou définir; Il s’agit de faciliter la vie de la personne qui écrit le code qui l’utilise.

Dans les situations / langues où vous avez access à ces deux constructions, la division générale est la suivante:

  • Si la demande concerne un object, utilisez une propriété (ou un champ).
  • Si la demande concerne le résultat de quelque chose, utilisez une méthode.

Plus précisément, une propriété doit être utilisée pour accéder, en lecture et / ou en écriture, à un membre de données appartenant (à des fins de consommation) à l’object exposant la propriété. Les propriétés sont meilleures que les champs car les données ne doivent pas toujours exister sous une forme persistante (elles vous permettent d’être “paresseux” au sujet du calcul ou de la récupération de cette valeur), et elles sont meilleures que vous pouvez toujours les utiliser dans le code comme s’il s’agissait de champs publics.

Cependant, les propriétés ne doivent pas entraîner d’effets secondaires (à l’exception possible et compréhensible de la définition d’une variable destinée à conserver la valeur renvoyée, en évitant un nouveau calcul coûteux d’une valeur nécessaire plusieurs fois); Toutes choses étant égales par ailleurs, elles doivent renvoyer un résultat déterministe (NextRandomNumber est donc un mauvais choix conceptuel pour une propriété) et le calcul ne doit entraîner aucune modification des données d’état affectant d’autres calculs (par exemple, obtenir PropertyA et PropertyB dans cet ordre ne doit pas renvoyer de résultat différent de celui obtenu avec PropertyB puis PropertyA).

Une méthode, OTOH, est conceptuellement comprise comme effectuant certaines opérations et renvoyant le résultat; en bref, il fait quelque chose qui peut aller au-delà du calcul d’une valeur de retour. Les méthodes doivent donc être utilisées lorsqu’une opération renvoyant une valeur a des effets secondaires supplémentaires. La valeur de retour peut toujours être le résultat d’un calcul, mais la méthode peut l’avoir calculée de manière non déterministe (GetNextRandomNumber ()) ou les données renvoyées sont sous la forme d’une instance unique d’un object, et l’appel de la méthode produit à nouveau une instance différente même si elle peut avoir les mêmes données (GetCurrentStatus ()), ou la méthode peut modifier les données d’état de telle sorte que faire exactement la même chose deux fois dans une ligne produit des résultats différents (EncryptDataBlock (); la conception pour assurer le cryptage des mêmes données deux fois de suite produit différents cryptexx).

Je m’attendrais à ce que la propriété ne renvoie que le détail d’un champ. Par contre je m’attendrais à

 MappedFields[] mf; public bool IsMapped() { mf.All(x => x != null); } 

vous devez utiliser la propriété car c # a des propriétés pour cette raison