Die Einzelverantwortung ist möglicherweise nicht etwas, das eine einzelne Funktion erfüllen kann.
class Location {
public int getX() {
return x;
}
public int getY() {
return y;
}
}
Diese Klasse kann gegen das Prinzip der alleinigen Verantwortung verstoßen. Nicht weil es zwei Funktionen hat, sondern wenn der Code für getX()
und getY()
unterschiedliche Stakeholder befriedigen muss, die Änderungen erfordern könnten. Wenn Vizepräsident X ein Memo herumschickt, dass alle Zahlen als Gleitkommazahlen ausgedrückt werden sollen, und die Buchhaltungsdirektorin Y darauf besteht, dass alle Zahlen, die ihre Abteilungsüberprüfungen ergeben, ganze Zahlen bleiben, unabhängig davon, was Herr X für richtig hält, sollte diese Klasse dies besser haben eine einzige Vorstellung davon, wem es verantwortlich ist, weil die Dinge verwirrend werden.
Wenn SRP befolgt worden wäre, wäre klar, ob die Standortklasse zu Dingen beiträgt, denen Herr X und seine Gruppe ausgesetzt sind. Stellen Sie klar, wofür die Klasse verantwortlich ist, und Sie wissen, welche Anweisung diese Klasse beeinflusst. Wenn sich beide auf diese Klasse auswirken, wurde sie schlecht konzipiert, um die Auswirkungen von Änderungen zu minimieren. "Eine Klasse sollte nur einen Grund haben, sich zu ändern" bedeutet nicht, dass die gesamte Klasse immer nur eine Kleinigkeit tun kann. Es bedeutet, dass ich nicht in der Lage sein sollte, die Klasse anzusehen und zu sagen, dass sowohl Herr X als auch Frau Y ein Interesse an dieser Klasse haben.
Davon abgesehen. Nein, mehrere Methoden sind in Ordnung. Geben Sie ihm einen Namen, der klar macht, welche Methoden in die Klasse gehören und welche nicht.
In Onkel Bobs SRP geht es mehr um Conways Gesetz als um Curlys Gesetz . Onkel Bob befürwortet die Anwendung von Curlys Gesetz (mache eine Sache) auf Funktionen, nicht auf Klassen. SRP warnt vor Mischungsgründen, die sich gemeinsam ändern. Das Gesetz von Conway besagt, dass das System dem Informationsfluss einer Organisation folgt. Das führt dazu, dass Sie SRP folgen, weil es Ihnen egal ist, wovon Sie nie etwas hören.
"Ein Modul sollte einem und nur einem Akteur verantwortlich sein"
Robert C Martin - Saubere Architektur
Die Leute wollen immer wieder, dass SRP jeder Grund ist, den Umfang einzuschränken. Es gibt mehr Gründe, den Umfang einzuschränken als SRP. Ich schränke den Umfang weiter ein, indem ich darauf bestehe, dass die Klasse eine Abstraktion ist, die einen Namen annehmen kann, der sicherstellt , dass ein Blick ins Innere Sie nicht überrascht .
Sie können Curly's Law auf Klassen anwenden. Sie sind außerhalb dessen, worüber Onkel Bob spricht, aber Sie können es tun. Wenn Sie anfangen zu denken, dass dies eine Funktion bedeutet, können Sie etwas falsch machen. Das ist wie der Gedanke, eine Familie sollte nur ein Kind haben. Mehr als ein Kind zu haben, hindert es nicht daran, eine Familie zu sein.
Wenn Sie Curlys Gesetz auf eine Klasse anwenden, sollte sich alles in der Klasse um eine einzige einheitliche Idee handeln. Diese Idee kann weit gefasst sein. Die Idee könnte Beharrlichkeit sein. Wenn einige Funktionen des Protokollierungsdienstprogramms vorhanden sind, sind sie eindeutig nicht vorhanden. Es spielt keine Rolle, ob Herr X der einzige ist, der sich um diesen Code kümmert.
Das klassische Prinzip, das hier anzuwenden ist, heißt Trennung von Bedenken . Wenn Sie alle Ihre Anliegen trennen, könnte man argumentieren, dass es sich bei dem, was an einem Ort übrig bleibt, um ein Anliegen handelt. So nannten wir diese Idee, bevor uns die City Slickers 1991 mit der Figur Curly bekannt machten.
Das ist okay. Es ist nur so, dass das, was Onkel Bob eine Verantwortung nennt, kein Problem ist. Eine Verantwortung für ihn ist nichts, worauf du dich konzentrierst. Es ist etwas, das dich zwingen kann, dich zu verändern. Sie können sich auf ein Anliegen konzentrieren und dennoch Code erstellen, der für verschiedene Personengruppen mit unterschiedlichen Agenden verantwortlich ist.
Vielleicht interessiert dich das nicht. Fein. Der Gedanke, dass das Halten, um "eine Sache zu tun", all Ihre Designprobleme lösen wird, zeigt einen Mangel an Vorstellungskraft darüber, was "eine Sache" am Ende sein kann. Ein weiterer Grund, den Umfang einzuschränken, ist die Organisation. Sie können viele "eine Sache" in andere "eine Sache" schachteln, bis Sie eine Müllschublade voller Dinge haben. Ich habe darüber gesprochen , bevor
Natürlich besteht der klassische OOP-Grund für die Einschränkung des Gültigkeitsbereichs darin, dass die Klasse private Felder enthält und stattdessen Getter verwendet, um diese Daten gemeinsam zu nutzen. Wir setzen jede Methode, die diese Daten benötigt, in die Klasse ein, in der sie die Daten privat verwenden können. Viele finden dies zu restriktiv, um es als Bereichsbegrenzer zu verwenden, da nicht jede zusammengehörige Methode genau dieselben Felder verwendet. Ich möchte sicherstellen, dass jede Idee, die die Daten zusammengebracht hat, dieselbe Idee ist, die die Methoden zusammengebracht hat.
Die funktionale Art und Weise, dies zu betrachten ist , dass a.f(x)
und a.g(x)
ist einfach f ein (x) und g a (x). Nicht zwei Funktionen, sondern ein Kontinuum von Funktionspaaren, die sich gemeinsam unterscheiden. Sie a
müssen nicht einmal Daten enthalten. Es könnte einfach sein, wie Sie wissen, welche f
und welche g
Implementierung Sie verwenden werden. Funktionen, die sich gemeinsam ändern, gehören zusammen. Das ist guter alter Polymorphismus.
SRP ist nur einer von vielen Gründen, den Umfang einzuschränken. Das ist ein guter. Aber nicht der einzige.