Wie bei jeder Regel denke ich, ist es hier wichtig, den Zweck der Regel, den Geist, zu betrachten und nicht zu analysieren, wie die Regel in einem Lehrbuch formuliert wurde und wie dies auf diesen Fall angewendet werden kann. Wir müssen uns dem nicht wie Anwälte nähern. Der Zweck der Regeln ist es, uns zu helfen, bessere Programme zu schreiben. Es ist nicht so, dass der Zweck des Programmschreibens darin besteht, die Regeln einzuhalten.
Der Zweck der Einzelverantwortungsregel besteht darin, Programme verständlicher zu machen und zu warten, indem jede Funktion eine in sich geschlossene, kohärente Aufgabe ausführt.
Ich habe zum Beispiel einmal eine Funktion geschrieben, die ich so etwas wie "checkOrderStatus" nannte, die feststellte, ob eine Bestellung aussteht, versandt oder nachbestellt wurde, und einen Code zurückgab, der angibt, welche. Dann kam ein anderer Programmierer und änderte diese Funktion, um auch die verfügbare Menge zu aktualisieren, wenn die Bestellung versandt wurde. Dies verstieß erheblich gegen das Prinzip der einheitlichen Verantwortung. Ein anderer Programmierer, der diesen Code später liest, würde den Funktionsnamen sehen, sehen, wie der Rückgabewert verwendet wurde, und er könnte durchaus nie den Verdacht haben, dass eine Datenbankaktualisierung durchgeführt wurde. Jemand, der den Bestellstatus abrufen musste, ohne die verfügbare Menge zu aktualisieren, befand sich in einer schwierigen Situation: Sollte er eine neue Funktion schreiben, die den Bestellstatus-Teil dupliziert? Fügen Sie ein Flag hinzu, um zu bestimmen, ob das DB-Update durchgeführt werden soll. Etc.
Andererseits würde ich nicht auswählen, was "zwei Dinge" ausmacht. Ich habe kürzlich eine Funktion geschrieben, die Kundeninformationen von unserem System an das System unseres Kunden sendet. Diese Funktion führt eine Neuformatierung der Daten durch, um ihre Anforderungen zu erfüllen. Zum Beispiel haben wir einige Felder in unserer Datenbank, die möglicherweise null sind, aber keine Nullen zulassen. Deshalb müssen wir einen Dummy-Text "nicht angegeben" eingeben, oder ich vergesse die genauen Wörter. Diese Funktion bewirkt vermutlich zwei Dinge: Formatieren Sie die Daten neu UND senden Sie sie. Aber ich habe dies ganz bewusst in eine einzige Funktion gestellt, anstatt "neu formatieren" und "senden" zu müssen, weil ich niemals ohne Neuformatierung senden möchte. Ich möchte nicht, dass jemand einen neuen Anruf schreibt und nicht merkt, dass er neu formatieren und dann senden muss.
Aktualisieren Sie in Ihrem Fall die Datenbank und geben Sie ein Bild des geschriebenen Datensatzes zurück. Dies scheint zwei Dinge zu sein, die logisch und unvermeidlich zusammenpassen könnten. Ich kenne die Details Ihrer Bewerbung nicht und kann daher nicht definitiv sagen, ob dies eine gute Idee ist oder nicht, aber es klingt plausibel.
Wenn Sie ein Objekt im Speicher erstellen, das alle Daten für den Datensatz enthält, die Datenbankaufrufe ausführen, um dies zu schreiben, und dann das Objekt zurückgeben, ist dies sehr sinnvoll. Sie haben den Gegenstand in Ihren Händen. Warum nicht einfach zurückgeben? Wenn Sie das Objekt nicht zurückgegeben haben, wie würde der Anrufer es erhalten? Müsste er die Datenbank lesen, um das Objekt zu erhalten, das Sie gerade geschrieben haben? Das scheint ziemlich ineffizient zu sein. Wie würde er die Aufzeichnung finden? Kennen Sie den Primärschlüssel? Wenn jemand erklärt, dass es "legal" ist, dass die Schreibfunktion den Primärschlüssel zurückgibt, damit Sie den Datensatz erneut lesen können, warum nicht einfach den gesamten Datensatz zurückgeben, damit Sie dies nicht tun müssen? Was ist der Unterschied?
Wenn das Erstellen des Objekts eine Menge Arbeit ist, die sich vom Schreiben des Datenbankdatensatzes deutlich unterscheidet, und ein Aufrufer den Schreibvorgang ausführen, das Objekt jedoch nicht erstellen möchte, kann dies eine Verschwendung sein. Wenn ein Aufrufer das Objekt haben möchte, aber nicht schreibt, müssen Sie einen anderen Weg angeben, um das Objekt zu erhalten. Dies kann bedeuten, dass redundanter Code geschrieben wird.
Aber ich denke, Szenario 1 ist wahrscheinlicher, also würde ich sagen, wahrscheinlich kein Problem.