De manière générale, la création d'une API fluide est quelque chose qui rend tous les programmeurs heureux; Les deux pour les créateurs qui écrivent l'interface et les consommateurs qui programment contre lui. En regardant au-delà des conventions, pourquoi est-ce que nous préfixons tous nos getters avec le mot "get". L'omission que cela entraîne généralement un ensemble d'instructions plus fluide et facile à lire, ce qui conduit finalement au bonheur (aussi petit ou passif). Considérez cet exemple très simple. ( pseudo code em>) conventionnel: p> alternative: p> bien sûr Ceci s'applique uniquement aux langues où les getters / setters sont la norme, mais ne sont dirigés dans aucune langue spécifique. Ces conventions ont-elles été développées autour de limitations techniques (désambiguïssement) ou simplement à travers la poursuite d'un type d'interface plus explicite et intentionnelle, ou peut-être que cela ne constitue qu'un cas de filet d'une norme dynamique. Quelles sont vos pensées? Et comment les modifications simples de ces conventions auraient-elles une incidence sur vos attitudes de bonheur / quotidiennes envers votre métier (même minimes). P> Merci. P> P>
8 Réponses :
Parce que, dans les langues sans propriétés, Les fonctions / méthodes sont également censées être des verbes car ils effectuent une certaine action. Dans les langues avec des propriétés, le fait que quelque chose est une propriété exprime la même signification que de l'avoir ou fixée. Cela fait simplement ressembler aux choses un petit nitre. P> nom () code> est une fonction. Sans plus d'informations, ce n'est pas nécessairement spécifique de ce que cela va (ou de ce qu'il va revenir). p>
nom () code> ne correspond évidemment pas la facture car il ne vous dit rien de quelle action il effectue. p>
getName () code> vous permet de savoir sans aucun doute que la méthode va retourner un nom. P>
D'accord. Cela tombe le long du cas que j'ai mentionné comme explicite sur les choses intentionnellement quant à la ne pas créer de type ambiguïté. Cependant, je suis sous la conviction qu'une API bien conçue utiliserait les bons noms pour obscurcir toute ambiguïté de cette manière. En tant que défi, pouvez-vous me donner un exemple dans lequel le manque de préfixe vous ferait penser que vous ne savez pas ce qui se passe?
@Joey: Le problème avec votre arrangement de nommage n'est pas les noms, mais les parens. Les parens suggèrent d'exécuter une action plutôt que de renvoyer la valeur d'une propriété. C'est pourquoi le préfixe get code> est nécessaire.
@robert point très valide. Dans des situations où une telle langue n'a pas de mécanisme de mise en œuvre des accesseurs de biens, ou après les modifications apportées à une mise en œuvre de la propriété, l'utilisation de pariers autour du nom nu est vraiment la seule situation.
à l'école que nous avons appris à utiliser pour distinguer les méthodes à partir de structures de données. Je n'ai jamais compris pourquoi les parens ne seraient pas un Tipoff. Je suis de l'opinion personnelle que la surutilisation de méthodes de get / Set peut être une baisse horrible des temps, et c'est une phase que je vois beaucoup de programmeurs orientées objet passent peu après leur départ. P>
D'autre part, j'approuve votre opinion personnelle.
Voyez ici pour une utilisation appropriée des getters and Setters: Stackoverflow.com/Questtions/565095/...
Merci de relier cela, je pense que cela soulève de grands points. Je ne voulais pas dire qu'ils étaient complètement diabolisés, comme cela, comme indiqué sur l'autre question, il n'y a pas beaucoup de raison pour avoir obtenu / setters si obtenir des méthodes, renvoyez toujours la même variable, et si les achecteurs permettent toujours d'autoriser l'arbitraire. mission. Java est censé éliminer le code de la chaudière, ne pas la promouvoir. Je pense que nous sommes d'accord sur cela. Merci pour le lien Robert!
La meilleure réponse que j'ai jamais entendue pour utiliser les préfixes Get / Set est comme telle: p>
Si vous ne les utilisiez pas, l'accesseur et le mutateur (getter and Setter) auraient le même nom; Ainsi, ils seraient surchargés. Généralement, vous ne devez surcharger une méthode que lorsque chaque mise en oeuvre du procédé effectue une fonction similaire (mais avec des entrées différentes). P>
Dans ce cas, vous auriez deux méthodes avec le même nom qui ont des fonctions très différentes, ce qui pourrait être confondre aux utilisateurs de l'API. P>
Belle observation. Setteurs, je crois, mérite très légitimement le préfixe, car ils changent une sorte d'état. Ce n'est pas un jeu de somme zéro, le débarras de «get» ne conduit pas nécessairement à débarrasser de la "série". Et si seul l'ensemble était utilisé et évite ainsi la surcharge?
@Joey: Cela ressemble à plus de bruit que d'utiliser simplement obtenir code> et
définir code>, comme on ne ressemble pas à l'autre. Et vous avez toujours le problème avec les parens suggérant une action à exécuter, plutôt qu'une propriété à récupérer.
Je serais bien avec cela si la convention était que chaque méthode qui n'avait pas de verbe à son nom était un accesseur.
Malheureusement, l'exemple donné est ambigu; nom code> peut être un nom ou i> un verbe.
personnalisé. p>
plus, en C ++, si vous renvoyez une référence, cela fournit des fuites d'informations potentielles dans la classe elle-même. P>
Vraiment? Pensez-vous que cet opérateur [] de std :: string (par exemple) provoque une telle fuite?
Neil: Je ne fais pas de fuite de mémoire moyenne.
Je ne voulais pas dire ou mentionner des fuites de mémoire - je voulais dire votre propre concept de "fuite".
Pas dans ce cas. OTOH, si vous essayiez de créer une chaîne immuable, renvoyez une référence à un élément de la matrice de caractère poserait un problème.
@Neil: Oui, String's OP [] enfreint l'encapsulation (mais cela n'a pas besoin d'être une mauvaise chose). Par exemple, vous ne pouvez pas changer StD :: WSTRing's Stockage pour utiliser un MBCS et rencontrer toujours l'exigence d'interface OP [].
Qu'en est-il du cas où une propriété est nommée d'après un verbe?
object.getAction() object.setAction(action) object.doAction()
Merci pour la réponse curieuse. Pouvez-vous me donner un exemple dans lequel une propriété nommée d'après qu'un verbe pourrait également être utilisé logiquement comme getter?
"Action" n'est pas un verbe, c'est donc un mauvais exemple. En général, les propriétés sont toujours nommées d'après les noms, pas des verbes.
J'apprécie toujours cohérent La même chose est vraie lorsque vous utilisez IntelliSense / Auto Achion dans l'IDE. P> Obtenir code> /
définir code> Préfixe lorsque vous travaillez avec une nouvelle API et sa documentation. Le regroupement automatique des getters and Setters lorsque toutes les fonctions sont énumérées dans leur ordre alphabétique permet de distinguer une simple distinction entre l'accès à des données simples et la fonctionnalité avancée. P>
Je ne peux pas écrire beaucoup d'objectifs - C, mais depuis que j'ai appris que je suis vraiment venu aimer ses conventions. La même chose que vous demandez est Adressé par la langue. P>
@jsumners De nombreux cercles autour d'Apple n'utilisent vraiment pas cette convention. ( via webkit style gudie i>). "Prever Setteurs avec le mot" Set ". Utilisez des mots nus pour les getters. Setter et getters doivent correspondre aux noms des variables étant définies / obtenues». webkit.org/coding/coding-style.html . Bien entendu, certaines langues ont abandonné de telles conventions, car elles ont des conventions ou des constructions linguistiques pour le contourner. Le kilométrage peut varier.
Eh bien, je dois utiliser c # au travail. C # a des propriétés, mais ils sont ennuyeux (comme la question initiale allusion). Par exemple, cela ne fonctionnera pas: Classe publique MyClass {Int Int Int FOO; Public int foo {obtenir {retour ça.foo; } Set {this.foo = valeur; }}} code> pré> à la place, vous devez faire:
En C # 3.0, vous pouvez simplement faire public int foo {obtenir; ensemble; } code>
Voici une réponse de petite taille que j'aime la plupart. Il faut connaître quelques règles concernant SmallTalk BTW. Les champs ne sont accessibles que dans les éléments sont définis.Si vous n'écrivez pas «accessoires», vous ne pourrez rien faire avec eux. P>
La convention il y a une variable (anme it in Instevar1. Ensuite, vous écrivez une fonction InspTvar1 qui vient juste de retourner instvar1 et instvar: quels sets la valeur. p>
J'aime bien cette convention beaucoup plus que toute autre chose. Si vous voyez un: quelque part, vous pouvez parier qu'il s'agisse d'un "pointet" de l'une ou de l'autre sens. p>
Certains d'entre nous n'écrivent pas getters. Ou des setters. Ou croire aux "API fluides".
Je ne suis pas d'accord que
personne.name () code> est un ensemble plus fluide et plus facile à lire ensemble d'instructions, car je pense que la méthode attribue réellement un nom, ou un surnom, à cette personne. Et honnêtement, si vous avez l'intention de l'utiliser dans ce contexte,
personne.name.whatever code> semble beaucoup plus facile que maintenant,
nom code> devient une propriété (lisible / assignable) à la place. d'une méthode.
Donc, lorsque vous avez et que vous avez l'achèvement du code, vous pouvez taper "get" et voir tous les getters
@RLB Nous sommes sous l'hypothèse que la langue (pseudo) n'a pas d'accesseur de propriété. Dans une telle situation, si l'on veut modifier la mise en œuvre, le nom (), une méthode est la meilleure possible.
Voir aussi Stackoverflow.com/questions/565095/ ...
Et aussi parce que c'est déjà un demi-congrès. C'est un non réinventant la roue, la prévisibilité - une compréhensibilité, une sorte de chose.