Question

  

Possible en double:    Propriétés vs Méthodes

Dans bien des cas, il est évident que quelque chose doit être une propriété ou une méthode mais il y a des éléments qui pourraient être considérés comme ambigus.

Propriétés Obvious:

  • "name"
  • "longueur"

Méthodes Obvious:

  • "SendMessage"
  • "Imprimer"

Ambigu:

  • "valide" / "IsValid" / "Valider"
  • "Inbounds" / "IsInBounds" / "CheckBounds"
  • "AverageChildValue" / "CalcAverageChildValue"
  • "CouleurSaturation" / "SetColorSaturation"

Je suppose que je pencherais vers des méthodes pour l'ambigu, mais personne ne sait d'une règle ou une convention qui aide à décider cela? Par exemple. doivent être toutes les propriétés O (1)? Si une propriété ne pas être en mesure de modifier d'autres données (CouleurSaturation peut modifier les valeurs R, G, B)? Devrait-il pas être une propriété en cas de calcul ou l'agrégation?

Juste du point de vue académique, (et non pas parce que je pense qu'il est une bonne idée) est-il une raison de ne pas devenir fou avec des propriétés et juste tout faire qui est une interrogation de la classe sans prendre un argument, et tout ce qui peut être changé au sujet de la classe avec un seul argument ne peut pas jouer l'échec, une propriété?

Était-ce utile?

La solution

Je convertir généralement une propriété à une fonction si elle a l'un des comportements suivants

  • provoque un effet secondaire (autre que le réglage de la zone d'appui)
  • La mise en œuvre est cher par rapport à-dire un accès aux champs
  • La mise en œuvre a une complexité plus élevée que Log (N)
  • peut jeter une exception

Autres conseils

Ive a trouvé un texte intéressant sur ce

MSDN | Propriétés vs Méthodes

EDIT

Il dit des choses comme:

Utilisez une propriété lorsque

  • L'élément est un élément de données logique

Utiliser une méthode quand

  • L'opération est une conversion, comme Object.ToString.
  • L'opération est assez cher que vous voulez communiquer à l'utilisateur qu'ils devraient envisager la mise en cache du résultat.
  • L'obtention d'une valeur de la propriété en utilisant l'accesseur get aurait un effet secondaire observable.
  • Appeler le membre deux fois de suite des résultats différents.
  • L'ordre d'exécution est importante. Notez que les propriétés d'un type doivent pouvoir être définis et récupérés dans l'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 les tableaux peuvent être très trompeuses.
  • En général, il est nécessaire de retourner une copie du tableau interne afin que l'utilisateur ne peut pas changer d'état interne. Ceci, couplé avec le fait qu'un utilisateur peut facilement supposer qu'il est une propriété indexée, conduit à un code inefficace.

Une autre considération est capacité de liaison. La plupart des cadres peuvent se lier uniquement aux propriétés. Par exemple, si vous voulez IsValid soit utilisable dans la liaison (par exemple, en tant que Sourcee obligatoire pour la propriété du bouton OK IsEnabled), il doit être une propriété plutôt qu'une méthode.

En décidant d'utiliser une propriété ou une méthode que vous devriez également considérer la ammount du travail la méthode implique. C'est à dire. si elle est relativement pas cher pour récupérer la valeur en font une propriété, si elle marque coûteuse une méthode.

Si vous pouvez calculer quelque chose de ce que vous avez déjà, les méthodes d'utilisation, si votre valeur doit être une base pour fonctionner avec ou calculer quelque chose d'autre, il devrait être bien.

Par exemple, si vous voulez vérifier si le nom utilisateur est à jour et vous pouvez le faire avec votre algorithme unique breveté, utilisez la méthode Validate(). Si l'utilisateur vous envoie juste une forme nis adresse actuelle soumettait est valide, utilisez valid la propriété. Mais il est juste une approche commune qui peut varier en fonction de ce que vous voulez réellement.

Je fais personnellement le choix de la complexité et de ce que la méthode / propriété va faire. Si je suis tout à faire est la mise en valeur, à savoir quelque chose _name = ;, je vais avec une propriété. Même si je vais faire quelques calculs très simples ou des instructions conditionnelles je collerai une propriété. Mais si quelque chose va avoir besoin d'un travail sérieux ou même un travail modéré, j'utiliser une méthode. Rien ne me aggrevates plus de définir une propriété et tout à coup un tas plus de code que prévu est exécuté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top