Ich besitze also einen Webservice, der so etwas wie einen hat, getAccount
bei dem eine Kennung an das Konto zurückgegeben wird, wenn er vorhanden ist. Andernfalls wird eine Ausnahme ausgelöst. Der Client möchte immer ein Konto erstellen, wenn eine Ausnahme mit denselben Informationen ausgelöst wird, mit denen der Abruf ausgeführt wird.
Ich erstelle eine Convenience-Bibliothek für Kunden, die alle Webservice-Aufrufe verarbeiten, damit sie nicht wissen müssen, wie sie die Aufrufe selbst ausführen sollen.
Was ich mich wundere, ist in dieser Bibliothek, wenn ich ein getAccount(accountName)
Konto erstellen würde , das das Konto erhält, wenn es existiert, und wenn es es dann nicht erstellt und die Informationen zurückgibt, ist das eine schlechte Sache? Sollte ich es dem Client überlassen, die Ausnahmen zu behandeln, oder es einfach so benennen wie getOrCreateAccount? Ist das wichtig?
Ist es eine schlechte Praxis, etwas in einer get-Operation zu erstellen?
quelle
getOrCreateAccount
oder ähnlich.acquire
, wieacquireAccount
. Es hat in den wichtigsten Protokollen, auf die ich gestoßen bin, keine vorhandene Bedeutung, und es hat einen zwingenden Klang, der gut zu ihm passt. "Tun Sie, was immer Sie tun müssen, um eines davon für mich zu erwerben. Fordern Sie es an, bauen Sie es, fälschen Sie es, stehlen Sie es, es ist mir egal, holen Sie mir eins oder sterben Sie bei dem Versuch."getSomething()
für Getter undsetSomething()
für Setter. Imo alles , was etwas mehr intellektuelle tut muss etwas anderes genannt werden, das heißtfetchSomething
,obtainSomething
,computeSomething
, oderdoSomethingElse
usw.Antworten:
Ja, das ist wichtig. Meiner Meinung nach ist es im Allgemeinen eine schlechte Praxis, etwas in einem Verfahren zu schaffen, das nicht als schöpferisch dokumentiert ist. Benennen Sie die Prozedur
getOrCreate...
oder haben Sie eine separatecreate...
Prozedur. Wenn Sie dies wirklich möchten,getOrCreate...
versuchen Sie es zuerst.get...
Wenn dies fehlschlägt, rufen Sie ancreate...
und rufen Sie dann anget...
.Der Benutzer der Bibliothek erwartet wahrscheinlich nicht, dass die
get...
Prozedur erstellt wird, wenn der Abrufvorgang fehlschlägt. Wenn sie plötzlich feststellen, dass ihre Testaufrufeget...
eine ganze Tonne Daten erzeugen, werden sie wahrscheinlich ziemlich überrascht sein. Und wie räumen sie es auf? Was ist, wenn sie Code schreiben und glauben, dass sie einen Fehler bekommen, wenn der Fehlerget...
fehlschlägt und sie das auf ihre Weise handhaben wollen ?quelle
get...
create...
get...
nur die ersten beiden machen müsste . Ich werde mit dem Kunden darüber sprechen, ob er jemals die Möglichkeit haben muss, einfach anzurufen,get
ohne etwas erstellen zu wollencreate
im Namen stehen sollte, nur um 100% klar zu sein, was passiert.getOrCreate
hat aber Vorrang in einem beliebten Webframework: docs.djangoproject.com/en/1.10/ref/models/querysets/…Nein, es ist keine „schlechte Praxis“. Solange Sie und die anderen Entwickler sich einig sind, dass es so funktionieren soll, ist es in Ordnung. Immerhin würde es ein Konto zurückgeben, was Sie wollen. Dass das Konto "unter der Haube" erstellt wird, ist für den Anrufer unerheblich.
quelle
Wenn
getAccount()
ein Konto immer zurückgegeben werden kann, ist das Konto aus Sicht des Anrufers vorhanden und hat es immer gegeben. Es ist nicht nötiggetAccount()
, irgendetwas zu "erschaffen". Das Konto muss erst gespeichert werden, wenn es sich vom Standardkonto unterscheidet.quelle
GetOrCreate
die falsche Semantik, aber es ist in Ordnung , ein Objekt zu erhalten, das "logisch" existieren kann, unabhängig davon, ob es physisch existiert oder nicht. Beispielsweise kann einem spärlichen Array von veränderlichen Elementen kein Speicher für das Element 1.841.533 zugewiesen werden, es kann jedoch dennoch "abgerufen" werden, indem ein neues Objekt erstellt, gespeichert und ein Verweis zurückgegeben wird.Am sinnvollsten ist es, drei Methoden zu erstellen:
getAccount -> Das bekommt gerade den Account.
createAccount -> Erstellt ein Konto.
getAccountAndCreateIfNeeded -> Wählen Sie Ihre eigene Benennung;)
Warum Trennung: Sie haben eine einfache Methode zum Abrufen und Erstellen. Das ist für beide eine eindeutig überprüfbare Methode. Für getAccount ist es keine Ausnahme, das Konto nicht zu finden. Also einfach false oder so was zurückgeben, das wird erwartet.
Dann können Sie diesen Rückgabewert in Ihrer gruppierten Funktion verwenden: getAccountAndCreateIfNeeded, die jetzt auch testbar ist, sollte immer ein Konto zurückgeben. Was auch immer du fragst.
Alle diese 3 Methoden sind klar, es ist genau klar, was sie tun und was sie zurückgeben. Sie können jetzt Vereinbarungen mit Ihrem Team treffen, aber diese Art von Ausnahmen sind auf lange Sicht schrecklich. Machen Sie sie einfach sehr klar und Sie werden keine Probleme haben.
quelle
getAccountIfExists
, die entweder ein Konto erhält oder anzeigt, dass es nicht existiert, ohne ein neues zu erstellen. DiegetAccount
Methode selbst sollte voraussetzen, dass das Konto vorhanden ist, und andernfalls eine Ausnahme auslösen.Das hängt von den Umständen ab.
Sie können es beispielsweise zum verzögerten Laden / Instanziieren verwenden, um das Laden von Daten oder das Erstellen einer Instanz zu verzögern, bis sie tatsächlich benötigt wird. Dies ist normalerweise sinnvoll, da Ressourcen gespart werden, die Sie möglicherweise nicht benötigen (wenn die Klasse / Daten niemals benötigt werden, werden sie niemals geladen).
In diesem speziellen Fall würde ich jedoch sagen, dass eine Methode namens getAccount, mit der ein neues Konto erstellt wird, wenn es nicht vorhanden ist, keine gute Vorgehensweise ist. Wenn der Benutzer einige Anmeldeinformationen zur Identifizierung eines bestimmten Kontos eingegeben hat und dieses Konto nicht gefunden werden konnte, bedeutet dies, dass der Benutzer noch kein Kunde ist und ein Konto für ihn erstellt werden sollte, oder bedeutet dies, dass die Anmeldeinformationen falsch eingegeben wurden und der Benutzer muss aufgefordert werden, zu bestätigen, dass er eingegeben hat, was er eingeben wollte?
Wenn Sie über eine getAccount-Methode verfügen, mit der ein neues Konto erstellt wird, ohne dass ein Konto identifiziert werden konnte, haben Sie in dieser Angelegenheit keine andere Wahl. Wenn Sie die Kontoerstellung und die Kontoeröffnung in getrennte Methoden aufteilen, können Sie flexibler entscheiden, was zu tun ist, wenn der Versuch, ein Konto zu erhalten, fehlschlägt.
quelle