Angenommen, eine Klasse hat eine Methode, die ihre Interna modifiziert. Soll dieser Methodenaufruf vor der Rückgabe auf sich selbst gespeichert werden, oder sollte das Speichern dem Aufrufer überlassen werden, um explizit zu speichern, nachdem die Änderungsmethode aufgerufen wurde?
Beispiel:
Explizites Aufrufen von Speichern:
%Vor%oder zulassen, dass die Methode zum Speichern aufgerufen wird:
%Vor%Ich arbeite mit Django, aber ich habe mich gefragt, ob es eine Best Practice im Django oder generell für diese Situation gibt.
Der Benutzer Ihrer API könnte vergessen, .save () aufzurufen und dann zu scannen. Also ich denke, es ist besser, ihn zu rufen, außer ihm. Für Fälle wie die von Daslch erwähnten, können Sie, wenn es sinnvoll ist, folgendes definieren:
%Vor%Damit kann der Benutzer, wenn er dies wünscht (und dies explizit angeben möchte), das Speichern vermeiden.
Eigentlich stimme ich sowohl Ofri als auch Daslch zu ... je nachdem, welcher Tag der Woche ist. Wenn dies nur eine von vielen Modifikationsroutinen ist, die Sie für ein bestimmtes Objekt ausführen könnten, dann wird es ziemlich teuer, wenn jeder von ihnen seine eigene Sicherung durchführt. Auf der anderen Seite, wenn dies ein seltenes, in sich geschlossenes Ereignis ist, dann möchten Sie das Speichern durchführen, da es für den Aufrufer nicht offensichtlich ist (dh jemand anders als Sie ), der es sein muss fertig.
Zum Beispiel sollte das Markieren von Ereignissen (die sowieso ManyToMany verwenden) kein zusätzliches save () für den Programmierer-Teil erfordern.
Um alle Probleme zu behandeln, die in verschiedenen vorhandenen Antworten zum Ausdruck kommen, schlage ich folgenden Ansatz vor: Mach eine Methode, nenne sie saving
oder modifying
, das ist ein Kontextmanager. Der Eintrag für diese Methode setzt ein privates Flag, das besagt, dass die Änderung ausgeführt wird. Der Ausgang setzt die Flags zurück und führt das Speichern durch; Alle modifizierenden Methoden überprüfen das Flag und lösen eine Ausnahme aus, wenn sie nicht gesetzt sind. Verwenden Sie beispielsweise eine Basisklasse und eine save
-Methode, die reelle Unterklassen überschreiben müssen:
Beispiel Verwendung ...:
%Vor% Dies garantiert, dass der Benutzer nicht vergisst, saving
aufzurufen, oder ihn versehentlich verschachtelt aufruft (das ist der Zweck all dieser Ausnahmen), und save
nur einmal aufrufen, wenn die Gruppe der modifizierenden Methoden ist getan, in einem handlichen und, würde ich sagen, ziemlich natürlichen Weg.