Noms des méthodes pour obtenir des données [fermé]

103

Attention: C'est une question / discussion pas très sérieuse que je poste ... mais je suis prêt à parier que la plupart des développeurs ont réfléchi à ce "problème" ...

J'ai toujours voulu obtenir d'autres opinions concernant les conventions de dénomination des méthodes qui allaient chercher des données quelque part et les renvoyaient ...

La plupart des noms de méthodes sont assez simples et évidents ... SaveEmployee (), DeleteOrder (), UploadDocument (). Bien sûr, avec les classes, vous utiliserez probablement la forme courte ... Save (), Delete (), Upload () respectivement.

Cependant, j'ai toujours eu du mal avec l'action initiale ... comment obtenir les données. Il semble que pour chaque projet, je finis par sauter entre différentes conventions de dénomination car je ne suis jamais tout à fait satisfait de la dernière que j'ai utilisée. Autant que je sache, ce sont les possibilités ->

  • GetBooks ()
  • FetchBooks ()
  • Récupérer des livres ()
  • FindBooks ()
  • LoadBooks ()

Quelle est votre pensée?

Jason
la source

Réponses:

126

Tout est question de sémantique cohérente ;

Dans le titre de votre question, vous utilisez l' obtention de données . Ceci est extrêmement général en ce sens que vous devez définir ce que signifie obtenir de manière sémantiquement significativement non ambiguë. J'offre les exemples suivants pour, espérons-le, vous mettre sur la bonne voie lorsque vous pensez à nommer des choses.

  1. getBooks() Lorsque vous obtenez tous les livres associés à un objet, cela implique que les critères de l'ensemble sont déjà définis et d'où ils proviennent est un détail caché.
  2. findBooks(criteria) c'est lorsque vous essayez de trouver un sous-ensemble de livres en fonction des paramètres de l'appel de méthode, cela sera généralement surchargé avec différents critères de recherche
  3. loadBooks(source) est lorsque vous chargez à partir d'une source externe, comme un fichier ou une base de données.
  4. Je n'utiliserais pas fetch / retrieve car ils sont trop vagues et se confondent avec get et il n'y a pas de sémantique sans ambiguïté associée aux termes.

Exemple: fetch implique qu'une entité doit aller chercher quelque chose de distant et le ramener. Les chiens vont chercher un bâton, et récupérer est un synonyme de chercher avec la sémantique supplémentaire que vous avez peut-être déjà eu la possession de l'objet. get est synonyme d' obtenir aussi bien ce qui implique que vous avez la possession exclusive de quelque chose et personne ne peut l' acquérir en même temps.

La sémantique est extrêmement importante:

la branche de la linguistique et de la logique concernée par le sens

Les commentaires sont la preuve que les termes génériques comme get et fetch n'ont pas de sémantique spécifique et sont interprétés différemment par différentes personnes. Choisissez une sémantique pour un terme, documentez ce qu'il est censé impliquer si la sémantique n'est pas claire et soyez cohérent avec son utilisation.

les mots avec des significations vagues ou ambiguës reçoivent une sémantique différente par différentes personnes en raison de leurs préjugés et préjugés basés sur leurs opinions personnelles et cela ne finira jamais bien.

Communauté
la source
4
J'ajouterais que j'utiliserais fetch / retrieve si les données devaient être récupérées à partir d'une base de données
Liz Albin
1
Hmmm. Feriez-vous la distinction entre les critères génériques et les critères spécifiques. Par exemple, utiliseriez-vous FindBooks (éditeur) pour rechercher des livres d'un éditeur spécifique? Ou peut-être GetBooksFromPublisher (éditeur)?
Jason
5
publisher.getBooks () serait la manière préférée de le faire, où l'éditeur était une instance spécifique d'un éditeur. Library.getBooks (éditeur) où l'éditeur a implémenté une interface BookSearchCriteria. Idem avec Library.getBooks (auteur) où l'auteur a implémenté une interface BookSearchCriteria. Vous auriez également logiquement Library.getPublishers () comme méthode d'usine
3
Merci pour cette réponse. Ajoute certainement de la clarté. En substance, vous dites que les méthodes de récupération par un filtre particulier doivent rester avec l'objet. De quelle manière l'interface serait-elle utilisée? Par exemple, l'interface BookSearchCriteria. Pouvez-vous fournir un exemple de code?
Jason
2
généralement, la dénomination est comme fetchlorsque le temps d'accès aux données est faible , c'est-à-dire sur le même appareil, à partir de la base de données locale, de la mémoire. load, ou downloadsi le temps d'accès est plus élevé , à partir d'Internet, de la base de données externe, du fichier
János
13

Honnêtement, vous devez simplement décider avec votre équipe de la convention de dénomination à utiliser. Mais pour le plaisir, voyons ce que vous pensez pour décider de l'un de ces éléments:

  • GetBooks ()

Cette méthode appartient à une source de données, et nous ne nous soucions pas de la façon dont elle les obtient, nous voulons simplement les obtenir à partir de la source de données.

  • FetchBooks ()

Vous traitez votre source de données comme un limier, et c'est son travail de récupérer vos livres. Je suppose que vous devriez décider vous-même combien il peut tenir dans sa bouche à la fois.

  • FindBooks ()

Votre source de données est un bibliothécaire et utilisera le système Dewey Decimal pour trouver vos livres.

  • LoadBooks ()

Ces livres appartiennent à une sorte de "sac de livre électronique" et doivent y être chargés. Assurez-vous d'appeler ZipClosed () après le chargement pour éviter de les perdre.

  • Récupérer des livres ()

Je n'ai rien.

Nick Larsen
la source
1
La réponse acceptée ne distinguait pas bien entre «obtenir» et «récupérer» ainsi que cette réponse. Fetch implique que cela doit être fait par quelqu'un d'autre parce que cela prendra du temps ou nécessitera une certaine expertise, alors que get implique qu'il est instantané et disponible textuellement ou "sur étagère".
Sridhar Sarnobat
J'ai moi aussi du mal avec la réponse acceptée aujourd'hui. Pour mon projet (basé sur React / Redux), je pense qu'il est important de faire la distinction entre les données extraites du magasin Redux et la base de données de l'application et une API tierce. Faire cela correctement aidera certainement à la lisibilité à l'avenir. Le développeur d'origine utilisé addpour les deux écrit dans une base de données et écrit dans le magasin. Maintenant, j'essaie de séparer ceux-ci, et c'est une douleur.
tim.rohrer
9

La réponse est simplement de vous en tenir à ce avec quoi vous êtes à l'aise et d'être cohérent.

Si vous avez un site Web barnes and nobles et que vous utilisez GetBooks (), alors si vous avez un autre élément comme une entité Movie, utilisez GetMovies (). Donc, tout ce que vous et votre équipe aimez et soyez cohérent.

JonH
la source
22
Au moins, vous êtes cohérent dans les fautes d'orthographe cohérentes. ;-)
Wim Hollebrandse
1
Très cohérent avec consistant ... :)
JonH
Pas du tout offensé ... merci de le signaler.
Jason
2

En OO (C ++ / Java), j'ai tendance à utiliser getSomething et setSomething car très souvent, sinon toujours, j'obtiens un attribut privé de la classe représentant cet objet de données ou le définissant - la paire getter / setter. En plus, Eclipse les génère pour vous.

J'ai tendance à utiliser Load uniquement quand je veux dire des fichiers - comme dans "charger en mémoire" et cela implique généralement le chargement dans des primitives, des structures (C) ou des objets. J'utilise envoyer / recevoir pour le Web.

Comme indiqué ci-dessus, la cohérence est essentielle et cela inclut les développeurs croisés.

Anthony Pegram
la source
1

Ce que vous entendez par «obtenir les données» n'est pas clair. De la base de données? Un fichier? Mémoire?

Mon point de vue sur la dénomination des méthodes est que son rôle est d'éliminer toute ambiguïté et idéalement le besoin de rechercher de la documentation. Je pense que cela devrait être fait même au prix de noms de méthodes plus longs. Selon des études, la plupart des développeurs intermédiaires + sont capables de lire plusieurs mots dans le cas du chameau. Avec l'IDE et les complétions automatiques, l'écriture de noms de méthodes longs n'est pas non plus un problème.

Ainsi, quand je vois "fetchBooks", à moins que le contexte soit très clair (par exemple, une classe nommée BookFetcherFromDatabase), c'est ambigu. Le chercher d'où? Quelle est la différence entre fetch et find? Vous risquez également le problème que certains développeurs associent la sémantique à certains mots clés. Par exemple, recherchez la base de données (ou la mémoire) par rapport au chargement (à partir d'un fichier) ou au téléchargement (à partir du Web).

Je préférerais voir quelque chose comme "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection", etc. C'est moins visible, mais une fois que vous avez dépassé la longueur, c'est clair. Tout le monde qui lirait ceci comprendrait tout de suite ce que vous essayez de faire.

Uri
la source
4
Le problème avec fetchBooksFromDatabase est que lorsque vous voulez factoriser / généraliser et fetchBooks, cela pourrait être une extraction de données, disons XML. J'aime aussi les détails, mais vous vous retrouvez alors à séparer la même fonctionnalité entre différents noms de fonction . Et ce monsieur n'est pas cool!
JonH
Je pense que la différence entre Get et Find a tendance à être évidente, mais je m'interroge sur la question concernant Get versus Fetch. Enfer ... y a-t-il une différence?
Jason
@JonH: Je suis d'accord avec vous là-dessus. Cependant, si vous saviez à l'avance que vous auriez différents types d'extraction, vous l'auriez encodé dans la dénomination de la classe (afin que vous puissiez interpréter la signification à partir du contexte, par exemple, DatabaseConnector vs XmlConnector).
Uri
7
@Jason: Parce que les "getters" sont si omniprésents (et font partie de frameworks comme JavaBeans), de nombreux programmeurs ont tendance à les considérer comme des moyens presque transparents d'accéder à un champ de données. «Fetch», d'autre part, indique à certains programmeurs un accès plus long qui implique le transfert de données d'un endroit à l'autre (à la fois la récupération du processeur) ou la récupération de la base de données. Par exemple, le langage de requête d'Hibernate a une construction Fetch. Les développeurs utilisent souvent des méthodes basées sur leurs attentes vis-à-vis du nom plutôt qu'en lisant la documentation, il est donc crucial d'éviter d'envoyer le mauvais signal.
Uri