Ich bin in einer schwierigen Lage. Ich arbeite in einem Repository, das innerhalb seiner Funktionen viele Datenbankänderungen vornimmt.

Die Funktion, mit der ich mich befasse, gibt Antwort-IDs zurück (jedoch aus einer Transformation, nicht aus einer Datenbankaktion). Als Nebeneffekt wird der Datenbank jedoch ein Objekt hinzugefügt, das diese Antwort-IDs enthält.

Also sollte ich es so nennen:

  • getResponseIds: Hiermit werden die Rückgabewerte hervorgehoben. Es ist eine sehr funktionale Denkweise, aber wenn ich die Funktion postToDB habe, macht es natürlich keinen Sinn, getStatusOfPost
  • addResponseIdToDB: Dies hebt den Nebeneffekt hervor, obwohl ich wirklich denke, dass viele meiner Funktionen nur in der Datenbank ausgeführt werden (und nichts zurückgeben)

  • getAndAddResponseIdsToDB: Sehr informativ, aber sehr lang.

Was sind die Vor- und Nachteile der obigen Vorschläge? Oder können Sie selbst einen besseren Vorschlag machen?

Kommentare

  • Wie wäre es mit persistResponseIds?
  • Sie könnten überrascht sein, wie weit die funktionale Menge mit dem Äquivalent von getStatusOfPost 🙂
  • getAndSaveResponseIds
  • responseIds = createResponseIds() scheint klar und prägnant zu sein. Sie get() etwas, das ‚ vorher nicht existierte, also ist create das entsprechende Verb. Das neu erstellte Material ist das, was Sie ‚ von einer create() -Funktion erwarten würden. Oder fehlt mir ‚ etwas Offensichtliches?
  • @fattie Ich stimme zu, dass Code sich selbst kommentieren sollte. Kommentare sollten Ihnen nicht sagen, was der Code tut. Kommentare sollten Ihnen sagen, warum der Code existiert. Wenn das Umgestalten des Codes das Umgestalten der Kommentare von ‚ bedeutet, haben Sie schlechte Kommentare. Ich bin damit einverstanden, dass Namen lange, vollständige Sätze sein können. Ein guter Name sollte einen Blick in eine Funktion werfen, um Sie nicht zu überraschen. ‚ sollte Ihnen nicht sagen, wie Sie es implementieren sollen. Es sollte Ihnen sagen, was der Kunde erwartet. Wenn Sie dies tun, haben Sie eine gute Abstraktion.

Antwort

Ein Funktionsname, der and befindet sich auf der falschen Abstraktionsebene .

Ich neige zu addResponseIdToDB(), da sonst der „Nebeneffekt“ eine völlige Überraschung ist. Allerdings:

responseIds = addResponseIdToDB(); 

überrascht niemanden.

Das Befehlsabfrageverantwortungs-Trennungsprinzip argumentiert, dass dies nicht der einzige Weg sein sollte, um das responseId-Objekt abzurufen. Es sollte auch eine Abfrage geben, die die Datenbank, die dieses Objekt erhalten kann, nicht ändert.

Im Gegensatz zu Bertrand Meyer glaube ich nicht, dass dies bedeutet, dass das Add void zurückgeben muss. Bedeutet nur, dass eine äquivalente reine Abfrage existieren sollte und leicht zu finden sein, damit die Datenbank nicht unnötig durch Statusänderungsabfragen missbraucht wird.

Da getResponseIds() vorhanden sein und nicht mit der Datenbank kommunizieren sollte, ist der beste Name für eine Methode, die beides tut, tatsächlich addToDB(getResponseId()). Aber das ist nur, wenn Sie alle funktionalen Kompositionen darüber erhalten möchten.

Kommentare

  • Hinzufügen zu dem, was gesagt wurde, Wenn ich jedoch ein Wort hinzufüge, das nicht ‚ verwendet wurde, würde ich sagen, dass “ und “ ist angemessen, wenn eine Funktion etwas tut, das atomar ist. Wenn es einen Vorteil gibt, wenn zwei Dinge atomar / zusammen / gleichzeitig geschehen, dann ist es explizit, was diese beiden Dinge in der Funktion sind Der Name ist gut. Ich stimme Ihrer ersten Aussage im Allgemeinen zu, stimme jedoch ohne Einschränkung nicht zu.
  • … lässt niemanden zurück überrascht. „. Ich bin anderer Meinung, ich ‚ bin überrascht, dass eine boolesche Variable und ich muss dann eine mentale Verschiebung durchführen, um zu erkennen, dass es alles in einem hinzufügt und erhält. Aber ich bin nicht einverstanden mit @tintintong, dass getAndAddResponseIdsToDB es ist zu lang; ‚ ist ungefähr halb so lang wie viele meiner Funktionsnamen. Wenn eine Funktion zwei Dinge tut, sagen Sie dies in ihrem Namen.
  • @Luaan OK, wie werden Sie dann getAndIncrement umbenennen? otherIncrement?
  • @Luaan Welchen Wert gibt Increment zurück, den Wert vor oder nach dem Inkrement? ‚ ist nicht klar, was es wäre, ohne in Dokumente einzutauchen.Ich denke, incrementAndGet und getAndIncrement sind weitaus bessere Methodennamen, was meiner Meinung nach ein gutes Argument für “ UND “ in Methodennamen, zumindest im speziellen Fall von Methoden, die Nebenwirkungen haben, die sich auf den Rückgabewert auswirken können.
  • @Luaan Wenn Sie sagen, dass “ Inkrement den inkrementierten Wert zurückgibt “ meinen Sie den Wert vor dem Inkrementieren? Gotcha, habe dich zuerst missverstanden. Das ist eigentlich ein gutes Beispiel dafür, warum getAndIncrement und incrementAndGet bessere Namen sind als nur increment, auch wenn einzeln betrachtet

Antwort

Wie andere bereits erwähnt haben, impliziert die Verwendung von and in einem Funktionsnamen automatisch, dass eine Funktion mindestens zwei Dinge ausführt, was normalerweise darauf hinweist, dass sie zu viel tut oder etwas tut an der falschen Stelle.

Die Verwendung der and -Klausel in einem Funktionsnamen kann jedoch meiner Erfahrung nach sinnvoll sein, wenn in einem bestimmten Ablauf einige Schritte vorhanden sind müssen nacheinander ausgeführt werden oder wenn die gesamte Berechnung aussagekräftig wird.

Beim numerischen Rechnen kann dies sehr sinnvoll sein:

normalizeAndInvert(Matrix m)

Ich meine, wer weiß, richtig? Wenn Sie einige … sagen wir, Beleuchtungsbahnen in Computergrafiken und auf einem Zertifikat berechnen müssen In der Phase müssen Sie eine bestimmte Matrix normalisieren und invertieren, und Sie schreiben ständig:

m = normalize(m), gefolgt von invert(m) kann als einfaches Beispiel die Einführung der Abstraktion des Normalisierens und Invertierens aus Sicht der Lesbarkeit gut sein.

Semantisch gesprochen, Dinge wie divideAndConquer() usw. wird wahrscheinlich davon abgeraten, explizit ausgeschrieben zu werden, aber die And dort ist grundsätzlich notwendig.

Kommentare

  • Funktionen erledigen regelmäßig mehr als eine Sache, aber dies sollten kleine Dinge sein, die zu einer großen Sache führen, die ‚ ist auf einer höheren Ebene sinnvoll. normalizeAndInvert könnte computeLighting sein und divideAndConquer könnte applyMachiavelli
  • Offensichtlich 🙂 Nur angeben, dass zuerst eine Funktion mit einem “ und “ im Namen erstellt wird könnte als natürliche Abstraktion kommen, die auf einem bestimmten Kontext basiert. Refactoring über die “ Umbenennungsmethode “ sollte unmittelbar danach erfolgen;)
  • @BrunoOliveira Außer manchmal sind die beiden Schritte selbst ein Bestandteil vieler Dinge, umbenennen ist nicht ‚ nicht der richtige Ansatz. Und sollte selten sein, aber niemals zu verwenden bedeutet, dass Sie ‚ sich wiederholen.

Antwort

Ich würde sagen, es ist im Allgemeinen in Ordnung, aber nicht in allen Fällen akzeptabel.

Zum Beispiel könnte man gegen and in einem Funktionsnamen, der auf dem Prinzip der Einzelverantwortung , auch bekannt als S in SOLID, basiert – da dies durch and impliziert werden könnte Mehrfachverantwortung. Wenn die and wirklich bedeutet, dass die Funktion zwei Dinge tut, sollten Sie sich wahrscheinlich genau überlegen, was passiert.

Ein Beispiel für eine Bibliothek, die dies tut verwendet and in Funktionsnamen, die in Java Parallelität und hier and ist eigentlich ein sehr wichtiger Teil dessen, was gerade passiert, und entspricht genau dem, was Sie in Ihrem Beitrag beschreiben, in dem der Status geändert wird und der Status zurückgegeben wird. Es gibt also eindeutig einige Personen ( und einige Anwendungsfälle), in denen dies als akzeptabel erachtet wird.

Kommentare

  • Die and kann mehrere Verantwortlichkeiten implizieren. „. Und in diesem Fall zeigt es tatsächlich das an. Die Funktion erhält einige Antwort-IDs von irgendwoher, schreibt sie in eine Datenbank und gibt sie zurück. Die Notwendigkeit für diese “ und “ sollte in der Tat zumindest die Idee mit dem OP aufwerfen, dass zwei Funktionen benötigt werden: eine, um die IDs zu erhalten und eine, um sie in die Datenbank zu schreiben.
  • Obwohl ich damit einverstanden bin, dass and ein Codegeruch ist, scheint das grundlegende Verhalten legitim zu sein: Es ist im Allgemeinen nicht schlecht Idee, einige zusätzliche Werte von einer Methode zurückzugeben, die zufällig (Zwischen-) Ergebnisse der Ausführung ihrer Hauptfunktion sind. Wenn die Hauptfunktion dieser Methode darin besteht, die Antwort-IDs zur Datenbank hinzuzufügen, ist die zusätzliche Rückgabe der dem Anrufer hinzugefügten IDs nur eine übersichtliche, mühelose Verwendbarkeitsfunktion der Methode.
  • Ich glaube nicht, dass ‚ dies notwendigerweise gegen SRP verstößt. Sie benötigen immer Funktionen, die mehrere Aufgaben ausführen. Der wichtige Teil ist, dass diese Funktionen für alles, was sie tun möchten, eine andere Funktion aufrufen, anstatt den erforderlichen Code direkt zu enthalten.
  • Wenn die Funktion zwei Dinge tut, sollte der Name dies widerspiegeln.

Antwort

In der Tat ist diese Frage schwer zu beantworten, wie zahlreiche Kommentare bestätigen können. Die Menschen scheinen widersprüchliche Meinungen und Ratschläge zu haben auf was ist ein guter Name.

Ich möchte meine 2 Cent zu diesem 2 Monate alten Thread hinzufügen, weil ich denke, ich kann mehr Farben zu dem hinzufügen, was bereits vorgeschlagen wurde.

Benennen ist ein Prozess

All dies erinnert mich an die hervorragende Anleitung in 6 Schritten: Benennen als Prozess .

Ein schlechter Funktionsname ist überraschend und man merkt, dass man nicht vertrauen kann. Eine gute Benennung ist auf den ersten Blick schwer zu erreichen. Mit der Erfahrung wird es einfacher.

6 iterative Schritte zum Erstellen eines guten Namens

  1. Ersetzen Sie den überraschenden Namen durch offensichtlichen Unsinn wie appleSauce(). Klingt albern, ist aber nur vorübergehend und macht deutlich, dass dem Namen nicht vertraut werden kann.
  2. Gehen Sie zu einem ehrlichen Namen , basierend auf dem, was Sie aus der Funktionsweise der Funktion verstehen. Angenommen, Sie haben die Einfügung in den DB-Teil noch nicht verstanden. getResponseIdsAndProbablyUseDb wäre eine Option.
  3. Get Um ganz ehrlich zu sein, sagt der Funktionsname also alles, was die Funktion tut (getAndAddResponseIdsToDB oder getResponsesButAlsoAddCacheOfTheResponsesToTheDb von @Fattie sind großartige Beispiele)
  4. Gehen Sie zu „macht das Richtige“ , was im Grunde genommen so ist Der Teil, in dem Sie Ihre Funktion entlang des „UND“ aufteilen. Sie haben also tatsächlich getResponseIds und addResponseIdsToDb.
  5. Gehen Sie zu einem „Intention Revealing“ -Namen , der den Punkt „löst. Ich möchte immer die Antwort-ID I erhalten in DB eingefügt, nachdem ich dies getan habe „. Denken Sie nicht mehr über die Implementierungsdetails nach und erstellen Sie eine Abstraktion, die die 2 kleinsten Funktionen verwendet, um etwas anderes zu erstellen. Dies ist die von @candied_orange erwähnte höhere Abstraktionsebene. Für e xample createResponseIds könnte dies tun und wird die Zusammensetzung von getResponseIds und addResponseIdsToDb sein.
  6. Gehen Sie zu Ihrer Domain-Abstraktion . Das ist schwer, es hängt von Ihrem Geschäft ab. Es braucht Zeit, um Ihre Geschäftssprache zu hören, um richtig zu werden. Möglicherweise haben Sie das Konzept, dass Response und Response.createIds() sinnvoll sind. Oder vielleicht ist ResponseId etwas Wertvolles und Sie hätten eine Fabrik, um viele zu erstellen. Das Einfügen in die Datenbank wäre ein Implementierungsdetail eines Repositorys usw. Ja, das Design wäre abstrakter. Es wäre reicher und würde Sie mehr ausdrücken lassen. Niemand außerhalb Ihres Teams kann Ihnen sagen, wie die richtige Domain-Abstraktion in Ihrer Situation aussehen sollte. Es kommt darauf an .

In Ihrem Fall haben Sie bereits 1 und 2 herausgefunden, daher sollten Sie wahrscheinlich mindestens zu 3 gehen (verwenden Sie „UND“) oder weiter. Aber weiter zu gehen ist nicht nur eine Frage der Benennung, Sie würden tatsächlich die Verantwortlichkeiten aufteilen.

Daher sind die verschiedenen Vorschläge hier gültig.

Im Wesentlichen:

  • Ja, überraschende Funktionsnamen sind schrecklich und niemand möchte damit umgehen.
  • Ja, „UND“ ist in einem Funktionsnamen akzeptabel, weil es besser ist als ein irreführender Name
  • Ja, die Abstraktionsebene ist ein verwandtes Konzept und es ist wichtig

Sie müssen nicht sofort auf Stufe 6 gehen, es ist in Ordnung, hier zu bleiben Stufe 2, 3 oder 4, bis Sie es besser wissen!


Ich hoffe, dass dies hilfreich ist, um eine andere Perspektive auf widersprüchliche Ratschläge zu geben. Ich glaube, dass jeder das gleiche Ziel anstrebt ( nicht überraschende Namen), aber hören Sie aufgrund ihrer eigenen Erfahrung in verschiedenen Phasen auf.

Gerne beantworten wir Sie, wenn Sie Fragen haben 🙂

Antwort

Ihre Funktion führt zwei Dinge aus:

  1. Ruft eine Reihe von IDs ab Über eine Transformation und gibt sie an den Aufrufer zurück.
  2. Schreibt diesen Satz von IDs in eine Datenbank.

Denken Sie hier an das Prinzip der Einzelverantwortung: Sie sollten eine Funktion anstreben eine Verantwortung haben, nicht zwei. Sie haben zwei Verantwortlichkeiten, also zwei Funktionen:

getResponseIds – Ruft eine Reihe von IDs über eine Transformation ab und gibt sie an den Aufrufer zurück
addResponseIdToDB – Nimmt eine Reihe von IDs und schreibt sie in eine Datenbank.

Und die ganze Frage, wie eine einzelne Funktion mit mehreren Verantwortlichkeiten aufgerufen werden soll, verschwindet, und die Versuchung, and in die Funktionsnamen aufzunehmen, verschwindet ebenfalls.

Als zusätzlichen Bonus kann getResponseIds aus Ihrem Repo-Code verschoben werden (wo er nicht hingehört), da dieselbe Funktion nicht mehr für zwei nicht miteinander verbundene Aktionen verantwortlich ist da es keine DB-bezogenen Aktivitäten ausführt), in eine separate Klasse / ein separates Modul auf Unternehmensebene usw.

Kommentare

  • Das ‚ ist sicherlich wahr, aber Sie wiederholen ein Snippet mit diesen beiden SRP-Methoden viele Male. Dann sollten Sie wahrscheinlich eine triviale Methode schreiben, damit Sie TROCKEN und nicht ‚ nicht wahr?
  • @maaartinus, wenn Sie diese beiden Methoden an vielen Stellen aufrufen, haben Sie wahrscheinlich ein Problem mit mangelnder Kohäsion in Ihrem Code. Wenn Sie eine “ DRY “ -Funktion erstellen, wird dieser Mangel an Kohäsion nur maskiert.

Antwort

Ein zusammengesetzter Funktionsname ist akzeptabel. Welches Benennungsschema Sie verwenden, hängt also von Ihrem Kontext ab. Es gibt Puristen, die Ihnen sagen, dass Sie es auflösen sollen, aber ich werde anders argumentieren.

Es gibt zwei Gründe, solche Dinge zu vermeiden:

  • Reinheit – Eine Funktion Was zwei Dinge tut, sollte in zwei Funktionen konvertiert werden, die jeweils eine Sache tun.
  • Lexikalische Größe – eine bigUglyCompositeFunctionName ist schwer zu lesen.

Das Reinheitsargument ist normalerweise dasjenige, auf das man sich konzentriert. Als vage allgemeine Heuristik ist es eine gute Sache, Funktionen aufzubrechen. Es hilft dabei, die Vorgänge zu unterteilen und das Verständnis zu erleichtern. Es ist weniger wahrscheinlich, dass Sie „clevere“ Tricks mit dem Teilen von Variablen ausführen, die zu einer Kopplung zwischen den beiden Verhaltensweisen führen.

Sie sollten sich also fragen: „Soll ich es trotzdem tun?“ Ich sage, das Aufbrechen von Dingen ist eine vage Heuristik, daher brauchen Sie wirklich nur ein anständiges Argument, um dagegen vorzugehen.

Ein Hauptgrund ist, dass es vorteilhaft ist, die beiden Operationen als eine zu betrachten. Das endgültige Beispiel hierfür finden Sie in atomaren Operationen: compare_and_set. compare_and_set ist ein grundlegender Eckpfeiler der Atomik (mit der Multithreading ohne Sperren durchgeführt werden kann), der so erfolgreich ist, dass viele bereit sind, ihn als the zu betrachten Grundstein. Es gibt ein „und“ in diesem Namen. Es gibt einen sehr guten Grund dafür. Der ganze Punkt dieser Operation ist, dass sie den Vergleich und die Einstellung als eine unteilbare Operation durchführt. Wenn Sie es in compare() und set() aufteilen, würden Sie den gesamten Grund, warum die Funktion überhaupt existierte, besiegen, weil zwei compares() kann vor den set() s hintereinander auftreten.

Wir sehen dies auch in der Leistung. Mein Lieblingsbeispiel ist fastInvSqrt . Dies ist ein berühmter Algorithmus von Quake, der 1 / sqrt (x) berechnet. Wir kombinieren die Operationen „invers“ und „Quadratwurzel“, weil dies ergibt uns einen massiven Leistungsschub. Sie machen eine Newtonsche Näherung, die beide Operationen in einem einzigen Schritt ausführt (und dies zufällig in ganzzahliger Mathematik und nicht in Gleitkomma, was in der Ära wichtig war). Wenn Sie inverse(sqrt(x)) ausführen würden, wäre dies viel langsamer!

Manchmal ist das Ergebnis klarer. Ich habe mehrere APIs mit Threading geschrieben, bei denen man bei Dingen wie Deadlocks furchtbar vorsichtig sein muss. Ich wollte nicht, dass mein Benutzer die internen Implementierungsdetails kennt (insbesondere, weil ich sie möglicherweise ändere), also habe ich die API mit geschrieben einige „und“ Funktionen, die verhinderten, dass der Benutzer jemals eine Sperre für mehr als einen Funktionsaufruf halten musste. Das heißt, sie mussten nie wissen, wie ich mit der Multithread-Synchronisation unter der Haube umgegangen bin. Tatsächlich wussten die meisten meiner Benutzer nicht einmal, dass sie sich in einer Multithread-Umgebung befanden!

Während die allgemeine Regel lautet, Dinge aufzubrechen, kann es immer einen Grund geben, sie miteinander zu koppeln. Zum Beispiel Kann Ihr Benutzer Ihre Architektur durch mehrmaliges Hinzufügen zu einer Datenbank brechen, ohne dass dazwischen „get“ angezeigt wird? Wenn jede der in der Datenbank protokollierten Antworten eine eindeutige Kennung haben muss, können Probleme auftreten, wenn der Benutzer sie ohne weiteres ausführen muss Möchten Sie einen Benutzer auch „abrufen“ lassen, ohne die Ergebnisse in der Datenbank zu protokollieren? Wenn die Antwort „Ja“ lautet, teilen Sie sie auf, damit der Benutzer auf die Funktion „Abrufen“ zugreifen kann Die Sicherheit Ihrer Anwendung ist beeinträchtigt, wenn der Benutzer „abrufen“ kann, ohne dass das Ergebnis in der Datenbank protokolliert wird. Sie sollten die Funktionen wirklich zusammenhalten.

Nun zu den lexikalischen Problemen sollte Ihr Funktionsname beschreiben, was Der Benutzer muss darüber Bescheid wissen. Beginnen wir mit dem Teil „get“.Es ist ziemlich einfach, das „get“ aus einem Funktionsnamen zu entfernen, da alle Ihre Beispiele eine Zuordnung anzeigen: int id = addResponseIdToDB() „. An allen Stellen, an denen die Funktion verwendet wird, werden Sie enden dokumentieren Sie die Tatsache, dass die Funktion einen Wert zurückgegeben hat.

Ebenso kann „hinzufügen“ optional sein. Wir verwenden den Begriff „Nebeneffekt“ als einen umfassenden Begriff, aber es gibt verschiedene Schattierungen davon. Wenn die DB-Einträge lediglich ein Protokoll sind, gibt es möglicherweise keinen Grund, es hervorzuheben. Wir sehen niemals Funktionen wie playMusicAndSendPersonalInformationToOurCorporateServers. Es ist nur playMusic, und wenn Sie Glück haben, wird in der Dokumentation möglicherweise etwas über eine Socket-Verbindung über das Internet erwähnt. Wenn von Benutzern erwartet wird, dass sie diese Funktion zum Hinzufügen von Dingen zur Datenbank aufrufen, ist „Hinzufügen“ unerlässlich. Nehmen Sie es nicht heraus.

Jetzt habe ich viele Gründe geschrieben, um jede mögliche Kombination von dem zu tun, was Sie fragen. Ich habe die Frage absichtlich nicht beantwortet, weil eine Wahl getroffen werden muss. Es ist keine Regel, die befolgt werden muss. Sie erstellen eine API.

Abgesehen davon ist mein Instinkt, dass addResponseIdToDB wahrscheinlich die beste Antwort ist. In den meisten Fällen ist der „get“ -Teil ein offensichtlicher Nebeneffekt, der nicht das zusätzliche Rauschen verursacht, das durch die Eingabe überall entsteht. Es gibt jedoch nur wenige Stellen, an denen ich ihn für wichtig halte:

  • Wenn das „get“ teuer ist – Wenn Sie ein „get“ durchführen müssen, bei dem etwas über das Internet abgerufen und dann zu einer lokalen Cache-Datenbank hinzugefügt wird, ist das „get“ auf jeden Fall wichtig. Dies ist das, was der Benutzer versucht.
  • Wenn Sie klarstellen möchten, dass der Benutzer benötigt, um auf den Wert zu achten. Wenn der Benutzer die Variable verwenden möchte, erkennt er, dass die API sie zurückgibt, und verwendet sie. Sie möchten jedoch auf den Benutzer achten, der nicht weiß, dass er es benötigt. Wenn Sie diesen Vorgang beispielsweise später anhand der ID „schließen“ müssen, um Speicher freizugeben, möchten Sie möglicherweise auf die Tatsache aufmerksam machen, dass Sie dies tun „Ich mache etwas. In diesen Fällen möchten Sie möglicherweise ein anderes Verb als „get“ betrachten. „get“ impliziert oft idempotente Funktionen (ein erneuter Aufruf führt zu nichts). Wenn Ressourcen zurückgegeben werden, sind andere Verben wie „create“ oder „purchase“ hilfreich. Dieser spezielle Fehlermechanismus ist ein Hauptproblem in C bei der Ausnahmebehandlung C fehlt der Catch / Throw-Mechanismus von C ++, daher basiert er auf Rückkehrcodes. Entwickler sind berühmt dafür, dass sie diese Rückkehrcodes einfach nicht überprüfen und dadurch in wirklich schlechte Situationen wie Pufferüberläufe geraten.
  • Symmetrie – Manchmal entwerfen Sie eine API mit einer lexikalischen Symmetrie. Sie richten die Wörter so ein, dass sie paarweise oder in anderen Mustern vorliegen, und erstellen die Befehle so, dass sie visuell leicht zu identifizieren sind ob das Muster befolgt wurde oder nicht. Ich würde sagen, dass dies selten ist, aber es ist nicht ungewöhnlich. Aus diesem Grund wird beim Schließen von XML-Tags der Tag-Name wiederholt (z. B. < foo > und < / foo >).

Kommentare

  • Für Personen, die nicht ‚ kennt die Mathematik nicht: Sowohl 1 / x als auch sqrt (x) sind ziemlich langsame Funktionen. Mit einigen cleveren Berechnungen können wir 1 / sqrt (x) schneller berechnen als entweder eine Division oder eine Quadratwurzel. Tatsächlich so viel schneller, dass der schnellste Weg zur Berechnung von sqrt (x) darin besteht, 1 / sqrt (x) mit einer cleveren Implementierung zu berechnen und das Ergebnis mit x zu multiplizieren.
  • Wie in der Physik, wo die Elementareinheiten nicht mehr Meter und Sekunde sind, sondern Sekunde und Lichtgeschwindigkeit, weil wir die Lichtgeschwindigkeit genauer messen können als die Länge eines Meters.

Antwort

Was ist die ultimative Absicht dieser Methode od? Warum diese transformierten IDs zur Datenbank hinzufügen, dient dies zum Zwischenspeichern? Ich werde unter dieser Annahme arbeiten.

Es hört sich so an, als ob die Absicht der Methode wirklich nur darin besteht, die transformierten Antwort-IDs abzurufen (entweder die Transformation durchzuführen oder sie aus einem Cache abzurufen) Ihr Methodenname:

getTransformedResponseIds oder weniger ausführlich getResponseIds()

Eine Methode mit diesem Namen kann zwischengespeichert werden oder vielleicht auch nicht, und das kann dokumentiert werden, aber Ihr Methodenname sollte Sie nicht an eine bestimmte Implementierung binden. Was ist, wenn Sie die Verwendung einer Datenbank beenden und sie stattdessen an einer anderen Stelle zwischenspeichern, z. B. nur vorübergehend im Speicher?

Nebenwirkungen sollten genau das sein, Nebenwirkungen, sie sollten wahrscheinlich dokumentiert werden, aber sie sollten die Kernabsicht (oder den Erfolg) oder den Namen der Funktion nicht wirklich beeinflussen. Wenn das Abrufen des Werts aus dem Cache fehlschlägt (oder wenn Sie das Überspringen des Cachings konfigurieren), was kein kritisches Problem sein sollte, sollte die Methode den neuen Wert nur transparent neu berechnen, zwischenspeichern (oder nicht) und zurückgeben.

Manchmal ist die Verwendung eines „UND“ hilfreich, um Absichten zu vermitteln, beispielsweise mit den Java-Methoden getAndIncrement und incrementAndGet Das ist sicherlich nicht vom Tisch.

Antwort

Sie sagen, dass die Funktion etwas „aus einer Transformation zurückgibt, nicht aus any db action „.

Dies deutet darauf hin, dass sich die Funktion eher wie ein Konstruktor als wie ein Getter verhält. Konstruktoren sollten jedoch auch keine Nebenwirkungen verursachen (danke für den Link, @ MechMK1 ).

Factory-Methoden setzen dagegen bereits ein gewisses Maß an Unordnung voraus . Eine der Beweggründe für die Verwendung von Factory-Methoden ist beispielsweise eine Factory-Methode:

Ermöglicht besser lesbaren Code in Fällen, in denen jeweils mehrere Konstruktoren vorhanden sind ein anderer Grund. – Wikipedia

Ebenso

Wenn Sie mit Nebenwirkungen arbeiten müssen, kann eine Factory-Methode so benannt werden, dass klarer ist, um welche Nebenwirkungen es sich handelt. – ruakh

Erwägen Sie, die Funktion zu einer Factory-Methode zu machen, indem Sie den Begriff „protokolliert“ verwenden, um Programmierer auf den Datenbankspeicher aufmerksam zu machen:

  • Erklärung: createLoggedResponseid(...) {...} // log object to db
  • Aufruf: responseid = createLoggedResponseid(...);

Kommentare

li> @ MechMK1 Ich ‚ habe bearbeitet, um den Konstruktor -Vorschlag zu entfernen und mehr Unterstützung für eine entsprechend benannte Factory-Methode bereitzustellen. Lassen Sie mich wissen, was Sie tun Denken Sie nach.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.