Soll sich eine modifizierende Klassenmethode nach dem Aufruf der Methode selbst speichern oder explizit aufgerufen werden?

8

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.

    
Simplecoder 26.06.2010, 19:14
quelle

4 Antworten

2

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.

    
Ofri Raviv 26.06.2010, 20:21
quelle
3

Der Benutzer Ihrer API möchte vielleicht einige Änderungen vornehmen, das Speichern des Objekts nach jeder Änderung ist alles andere als gut, also nein, rufen Sie nicht in Ihrer Methode auf.

    
DasIch 26.06.2010 19:36
quelle
1

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.

    
Peter Rowell 27.06.2010 03:08
quelle
0

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:

%Vor%

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.

    
Alex Martelli 27.06.2010 05:15
quelle

Tags und Links