Methodennamen zum Abrufen von Daten [geschlossen]

102

Warnung: Dies ist eine nicht sehr ernste Frage / Diskussion, die ich poste ... aber ich bin bereit zu wetten, dass die meisten Entwickler über dieses "Problem" nachgedacht haben ...

Wollte schon immer andere Meinungen zu Namenskonventionen für Methoden einholen, die Daten von irgendwoher abgerufen und zurückgegeben haben ...

Die meisten Methodennamen sind etwas einfach und offensichtlich ... SaveEmployee (), DeleteOrder (), UploadDocument (). Natürlich würden Sie bei Klassen höchstwahrscheinlich die Kurzform verwenden ... Save (), Delete (), Upload ().

Ich hatte jedoch immer Probleme mit anfänglichen Maßnahmen ... wie man die Daten erhält. Es scheint, dass ich bei jedem Projekt zwischen verschiedenen Namenskonventionen hin und her springe, weil ich mit der letzten, die ich verwendet habe, nie ganz zufrieden bin. Soweit ich das beurteilen kann, sind dies die Möglichkeiten ->

  • GetBooks ()
  • FetchBooks ()
  • RetrieveBooks ()
  • FindBooks ()
  • LoadBooks ()

Was ist dein Gedanke?

Jason
quelle

Antworten:

125

Es geht um konsistente Semantik ;

In Ihrem Fragentitel verwenden Sie das Abrufen von Daten . Dies ist in dem Sinne äußerst allgemein, dass Sie definieren müssen, was das Erhalten semantisch signifikant eindeutiger Weise bedeutet. Ich biete die folgenden Beispiele an, um Sie hoffentlich auf den richtigen Weg zu bringen, wenn Sie über die Benennung von Dingen nachdenken.

  1. getBooks() Wenn Sie alle Bücher erhalten, die einem Objekt zugeordnet sind, bedeutet dies, dass die Kriterien für den Satz bereits definiert sind und woher sie kommen, ist ein verstecktes Detail.
  2. findBooks(criteria) Wenn versucht wird, eine Teilmenge der Bücher basierend auf den Parametern des Methodenaufrufs zu finden, wird dies normalerweise mit verschiedenen Suchkriterien überladen
  3. loadBooks(source) Dies ist der Fall, wenn Sie von einer externen Quelle wie einer Datei oder einer Datenbank laden.
  4. Ich würde Fetch / Retrieve nicht verwenden, da sie zu vage sind und mit get in Konflikt geraten und den Begriffen keine eindeutige Semantik zugeordnet ist.

Beispiel: Abrufen impliziert, dass eine Entität etwas entferntes abrufen und zurückbringen muss. Hunde holen einen Stock und Retrieve ist ein Synonym für Fetch mit der zusätzlichen Semantik, dass Sie das Ding möglicherweise auch schon einmal besessen haben. get ist ein Synonym für erhalten und was bedeutet , dass Sie den alleinigen Besitz von etwas und niemand sonst sie gleichzeitig haben erwerben können.

Semantik ist extrem wichtig:

der Zweig der Linguistik und Logik, der sich mit Bedeutung befasst

Die Kommentare sind ein Beweis dafür, dass generische Begriffe wie get und fetch keine spezifische Semantik haben und von verschiedenen Personen unterschiedlich interpretiert werden. Wählen Sie eine Semantik für einen Begriff aus, dokumentieren Sie, was er bedeuten soll, wenn die Semantik nicht klar ist, und stimmen Sie mit ihrer Verwendung überein.

Wörter mit vagen oder mehrdeutigen Bedeutungen werden von verschiedenen Menschen aufgrund ihrer Vorurteile und Vorurteile, die auf ihren persönlichen Meinungen beruhen, unterschiedlich semantisch behandelt, und das wird niemals gut enden.

Gemeinschaft
quelle
4
Ich würde hinzufügen, dass ich Fetch / Retrieve verwenden würde, wenn die Daten aus einer Datenbank abgerufen werden sollen
Liz Albin
1
Hmmm. Würden Sie zwischen Platzhalterkriterien und bestimmten Kriterien unterscheiden? Würden Sie beispielsweise FindBooks (Herausgeber) verwenden, wenn Sie nach Büchern eines bestimmten Herausgebers suchen? Oder vielleicht GetBooksFromPublisher (Herausgeber)?
Jason
5
publisher.getBooks () wäre die bevorzugte Methode, wenn Publisher eine bestimmte Instanz eines Publishers ist. Library.getBooks (Herausgeber), in dem der Herausgeber eine BookSearchCriteria-Schnittstelle implementiert hat. Gleiches gilt für Library.getBooks (Autor), bei dem der Autor eine BookSearchCriteria-Schnittstelle implementiert hat. Sie würden auch logischerweise Library.getPublishers () als Factory-Methode haben
3
Vielen Dank für diese Antwort. Fügt definitiv etwas Klarheit hinzu. Im Wesentlichen sagen Sie, dass Methoden zum Abrufen durch einen bestimmten Filter beim Objekt bleiben sollten. Wie würde die Schnittstelle verwendet werden? Zum Beispiel die BookSearchCriteria-Oberfläche. Können Sie einen Beispielcode bereitstellen?
Jason
2
in der Regel zu benennen ist wie fetchbei der Datenzugriffszeit ist niedrig , das heißt auf demselben Gerät, von der lokalen Datenbank, aus dem Speicher. load, oder downloadwenn die Zugriffszeit höher ist , aus dem Internet, externe Datenbank, aus Datei
János
13

Ehrlich gesagt sollten Sie einfach mit Ihrem Team entscheiden, welche Namenskonvention verwendet werden soll. Aber zum Spaß wollen wir sehen, was Ihr Gedankengang wäre, um sich für eines dieser Dinge zu entscheiden:

  • GetBooks ()

Diese Methode gehört zu einer Datenquelle, und es ist uns egal, wie sie abgerufen wird. Wir möchten sie nur aus der Datenquelle abrufen.

  • FetchBooks ()

Sie behandeln Ihre Datenquelle wie einen Bluthund, und es ist seine Aufgabe, Ihre Bücher zu holen. Ich denke, Sie sollten selbst entscheiden, wie viele er gleichzeitig in seinen Mund passen kann.

  • FindBooks ()

Ihre Datenquelle ist ein Bibliothekar und verwendet das Dewey-Dezimalsystem, um Ihre Bücher zu finden.

  • LoadBooks ()

Diese Bücher gehören in eine Art "elektronische Büchertasche" und müssen in diese geladen werden. Rufen Sie nach dem Laden unbedingt ZipClosed () auf, um einen Verlust zu vermeiden.

  • RetrieveBooks ()

Ich habe nichts.

Nick Larsen
quelle
1
Die akzeptierte Antwort unterschied nicht gut zwischen "get" und "fetch" sowie dieser Antwort. Abrufen bedeutet, dass es von jemand anderem durchgeführt werden muss, da es einige Zeit in Anspruch nimmt oder etwas Fachwissen erfordert, während Abrufen impliziert, dass es sofort verfügbar und wörtlich oder "von der Stange" verfügbar ist.
Sridhar Sarnobat
Auch ich habe heute Probleme mit der akzeptierten Antwort. Für mein Projekt (React / Redux-basiert) halte ich es für wichtig, zwischen Daten, die aus dem Redux-Store abgerufen werden, und der Datenbank der App und einer API eines Drittanbieters zu unterscheiden. Wenn Sie dies richtig machen, wird dies in Zukunft definitiv zur besseren Lesbarkeit beitragen. Der ursprüngliche Entwickler, der sowohl addfür das Schreiben in eine Datenbank als auch für das Schreiben in den Store verwendet wurde. Jetzt versuche ich, diese zu trennen, und es ist ein Schmerz.
tim.rohrer
9

Die Antwort ist einfach, sich an das zu halten, mit dem Sie vertraut sind, und konsequent zu sein.

Wenn Sie eine Barnes and Nobles-Website haben und GetBooks () verwenden, verwenden Sie GetMovies (), wenn Sie ein anderes Element wie eine Movie-Entität haben. Also, was auch immer Sie und Ihr Team mögen und konsequent sein.

JonH
quelle
22
Zumindest sind Sie konsequent in Rechtschreibfehlern konsequent. ;-)
Wim Hollebrandse
1
Sehr beständig mit beständig ... :)
JonH
Überhaupt nicht beleidigt ... danke, dass Sie darauf hingewiesen haben.
Jason
2

In OO (C ++ / Java) verwende ich normalerweise getSomething und setSomething, da ich sehr oft, wenn nicht immer, entweder ein privates Attribut von der Klasse erhalte, die dieses Datenobjekt darstellt, oder es setze - das Getter / Setter-Paar. Als Plus generiert Eclipse sie für Sie.

Ich neige dazu, Laden nur zu verwenden, wenn ich Dateien meine - wie bei "Laden in den Speicher" und das impliziert normalerweise das Laden in Grundelemente, Strukturen (C) oder Objekte. Ich benutze Senden / Empfangen für das Web.

Wie oben erwähnt, ist Konsistenz alles und das schließt Cross-Entwickler ein.

Anthony Pegram
quelle
1

Es ist nicht klar, was Sie unter "Abrufen der Daten" verstehen. Aus der Datenbank? Eine Datei? Erinnerung?

Meiner Ansicht nach besteht die Aufgabe der Methodenbenennung darin, Unklarheiten zu beseitigen und im Idealfall die Dokumentation nachzuschlagen. Ich glaube, dass dies auch auf Kosten längerer Methodennamen geschehen sollte. Studien zufolge können die meisten fortgeschrittenen Entwickler im Kamelfall mehrere Wörter lesen. Mit IDE und automatischen Vervollständigungen ist das Schreiben langer Methodennamen ebenfalls kein Problem.

Wenn ich also "fetchBooks" sehe, ist es mehrdeutig, es sei denn, der Kontext ist sehr klar (z. B. eine Klasse namens BookFetcherFromDatabase). Woher holen? Was ist der Unterschied zwischen holen und finden? Sie riskieren auch das Problem, dass einige Entwickler bestimmten Schlüsselwörtern Semantik zuordnen. Zum Beispiel Abrufen für Datenbank (oder Speicher) vs. Laden (aus Datei) oder Herunterladen (aus dem Web).

Ich würde lieber etwas wie "fetchBooksFromDatabase", "loadBookFromFile", "findBooksInCollection" usw. sehen. Es ist weniger sichtbar, aber sobald Sie die Länge überschritten haben, ist es klar. Jeder, der dies liest, würde sofort verstehen, was Sie versuchen zu tun.

Uri
quelle
4
Das Problem mit fetchBooksFromDatabase besteht darin, dass beim Abrufen / Verallgemeinern und Abrufen von Büchern möglicherweise Daten aus beispielsweise XML abgerufen werden. Ich mag auch Besonderheiten , aber sie selbst dann finden die gleiche Funktionalität in verschiedener Funktion seperating Namen . Und dieser Herr ist nicht cool!
JonH
Ich denke, der Unterschied zwischen Get und Find ist offensichtlich, aber ich frage mich über die Frage nach Get und Fetch. Hölle ... gibt es einen Unterschied?
Jason
@ JonH: Da stimme ich dir zu. Wenn Sie jedoch im Voraus gewusst hätten, dass Sie verschiedene Abruftypen haben würden, hätten Sie dies in der Klassennamen codiert (damit Sie die Bedeutung aus dem Kontext interpretieren können, z. B. DatabaseConnector vs. XmlConnector).
Uri
7
@Jason: Weil "Getter" so allgegenwärtig sind (und Teil von Frameworks wie JavaBeans sind), neigen viele Programmierer dazu, sie als nahezu transparentes Mittel für den Zugriff auf ein Datenfeld zu betrachten. "Abrufen" hingegen zeigt einigen Programmierern einen längeren Zugriff an, bei dem Daten von Ort zu Ort übertragen werden (a-la-CPU-Abruf) oder Datenbanken abgerufen werden. Beispielsweise verfügt die Abfragesprache von Hibernate über ein Fetch-Konstrukt. Entwickler verwenden häufig Methoden, die auf ihren Erwartungen an den Namen basieren, anstatt die Dokumentation zu lesen. Daher ist es entscheidend, das Senden des falschen Signals zu vermeiden.
Uri