Einzelverantwortung ist meiner Meinung nach ein nicht einfach zu nagelndes Konzept.
Eine einfache Faustregel lautet:
Wenn ich erklären muss, was eine Methode / Klasse tut und das Wort »und« verwenden muss, ist dies ein Indikator dafür, dass möglicherweise etwas stinkt .
Einerseits ist es nur ein Indikator und andererseits funktioniert es besser umgekehrt: Wenn zwei Dinge vor sich gehen, können Sie die Verwendung des Wortes »und« nicht vermeiden, und da Sie zwei Dinge tun, verletzen Sie die SRP .
Aber heißt das andererseits, wenn Sie mehr als eine Sache tun, verletzen Sie die SRP ? Nein, weil Sie sonst auf trivialen Code und triviale Probleme beschränkt waren, die es zu lösen galt. Sie würden sich verletzen, wenn Sie in der Interpretation zu streng wären.
Eine andere Perspektive auf SRP ist: eine Abstraktionsebene . Solange Sie sich mit einer Abstraktionsebene befassen, geht es Ihnen meistens gut.
Was bedeutet das alles für Ihre Frage:
Ich bin der Meinung, dass UpdateGroupBilling nicht innerhalb der Speichermethode aufgerufen werden sollte, da dies gegen das Prinzip der Einzelverantwortung verstößt. Er sagt jedoch, dass jedes Mal, wenn eine Zahlung erfolgt, die Abrechnung aktualisiert werden sollte. Daher ist dies der richtige Ansatz.
Um zu entscheiden, ob dies eine Verletzung von SRP ist, muss man wissen, was in der save()
Methode vor sich geht. Wenn die Methode ist -wie die Namen- das Modell zu beharren auf die Datenbank verantwortlich schlägt vor, auf einen Anruf UpdateGroupBilling
ist IMHO eine Verletzung der SRP , da Sie den Kontext »erweitern eine Zahlung Speichern«. Sie würden es mit »Ich speichere die Zahlung und aktualisiere die Gruppenabrechnung« umschreiben, was - wie ich bereits sagte - ein (möglicher) Indikator für einen Verstoß gegen SRP ist .
Wenn die Methode andererseits ein "Zahlungsrezept" beschreibt - dh welche Schritte im Prozess zu unternehmen sind - und entscheidet: Jedes Mal, wenn eine Zahlung abgeschlossen ist, muss sie gespeichert (an einer anderen Stelle behandelt) und dann Die Gruppenabrechnungen müssen aktualisiert werden (an einer anderen Stelle behandelt werden). Dies wäre kein Verstoß gegen SRP, da Sie die Abstraktion des "Rezepts" nicht verlassen: Sie unterscheiden zwischen dem, was zu tun ist (im Rezept) und wo es wird gemacht (in der entsprechenden Klasse / Methode / Modul). Wenn dies jedoch Ihre save()
Methode ist (die beschreibt, welche Schritte ausgeführt werden sollen), sollten Sie sie umbenennen.
Ohne weiteren Kontext ist es schwer, etwas Konkretes zu sagen.
Bearbeiten: Sie haben Ihren ersten Beitrag aktualisiert. Ich würde sagen, dass diese Methode die SRP verletzt und überarbeitet werden sollte. Das Abrufen der Daten sollte herausgerechnet werden (es sollte ein Parameter dieser Methode sein). Das Hinzufügen von Daten (updateBy / On) sollte an anderer Stelle erfolgen. Das Speichern sollte an anderer Stelle erfolgen. Dann wäre es in Ordnung, so zu bleiben, UpdateGroupBilling([Parameters])
wie es ist.