Single Responsibility Principle

Einführung

Das Single Responsibility Principle (SRP) – zu deutsch „Prinzip der eindeutigen Verantwortlichkeit“ sagt aus, dass jede Klasse oder Modul nur eine einzige Aufgabe innerhalb eines Programmes erledigen soll und dafür nur Funktionen zur Erfüllung dieser Aufgabe enthält. Es ist daher ein Prinzip zur Strukturierung das dem Entwickler erlaubt, Funktionalität logisch zu Gruppieren.

Robert C. Martin, unter anderem Autor der , drückt es folgendermaßen aus:

“There should never be more than one reason for a class to change.”
“Es sollte nie mehr als einen Grund geben, eine Klasse zu ändern.“

Er stützt seine Aussage wiederrum auf das Prinzip der Kohäsion.

 

Beispiel

Eine Klasse erstellt ein Diagramm und gibt dieses anschließend aus

C#

    public class Chart
    {
        public void Create()
        {
            //Create the chart
        }

        public void Print()
        {
            //Print the chart
        }
    }

JAVA

public class Chart{
    public void Create()
    {
        //Create the chart
    }

    public void Print()
    {
        //Print the chart
    }
}

Es kann nun zwei Gründe geben, diese Klasse zu ändern:

  1. Das Diagramm wird verändert (Statt Balken- ein Tortendiagramm)
  2. Die Ausgabe ändert sich (Statt auf dem Bildschirm als Ausdruck)

Das SRP sagt nun aus, dass diese beiden Aspekte verschiedene Verantwortlichkeiten darstellen und somit auch in unterschiedliche Klassen organisiert werden sollen.

C#

    public class Chart { }

    public class Creation
    {
        public Chart CreatePie()
        {
            //Create a pie chart
        }

        public Chart CreateBar()
        {
            //Create a bar chart
        }
    }

    public class Output
    {
        public ToPrinter(Chart chart)
        {
            //Output chart to printer
        }

        public ToScreen(Chart chart)
        {
            //Output chart to screen
        }
    }   

JAVA

    public class Chart { }

    public class Creation {
        public Chart CreatePie()
        {
            //Create a pie chart
        }

        public Chart CreateBar()
        {
            //Create a bar chart
        }
    }

    public class Output {
        public ToPrinter(Chart chart)
        {
            //Output chart to printer
        }

        public ToScreen(Chart chart)
        {
            //Output chart to screen
        }
    }   

Der Grund das SRP zu beachten liegt darin, die Robustheit einer Klasse zu erhöhen und die Lesbarkeit des Codes zu verbessern. Änderungen an nicht-SRP-Klassen können schnell zu Fehlern in Funktionen, die zu anderen Zuständigkeiten gehören, führen. Insbesondere wenn verschiedene Entwickler für sie verantwortlich sind, steigt die Gefahr von Fehlern. Das SRP regt außerdem dazu an, sich während des Designprozesses, mit der möglichen, zukünftigen Entwicklung der Klassen auseinanderzusetzen.

Probleme bei der Anwendung

Ein großes Problem des SRP ist jedoch, dass eine Verantwortlichkeit (Responsibility) nicht klar definiert werden kann. Letztendlich können Verantwortlichkeiten immer weiter zerlegt werden bis letztendlich nur noch eine einzelne Methode pro Klasse übrig bleibt.

Verantwortlichkeiten finden

Änderungen gehen zumeist von den Endanwendern aus. Um die Verantwortlichkeiten nicht zu klein werden zu lassen sollte daher ein Blick auf sie geworfen werden. Verschiedene Gruppen von Endanwendern können unterschiedliche Änderungswünsche haben: Das Marketing könnte, auf das vorherige Beispiel bezogen, eine Änderung am Diagramm wünschen, die IT-Abteilung braucht hingegen eine spezielle Anpassung an einen Drucker. Somit lassen sich Verantwortlichkeiten einfacher festlegen und die Funktionen in Klassen gruppieren.

Eine weitere Möglichkeit Verantwortlichkeiten festzulegen beschreibt Sandi Metz in ihrem Buch „Practical Object-Oriented Design in Ruby“: Beschreibt man eine Klasse und kommen in dieser die Worte „und“ bzw. „oder“ vor, handelt es sich wahrscheinlich um verschiedene Verantwortlichkeiten die nicht zueinander gehören. Beispiel: „Die Klasse erstellt ein Diagramm und gibt es aus“ enthält zwei klar getrennte Verantwortlichkeiten. „Die Klasse färbt die Balken rot und den Hintergrund weiß“ hingegen beschreibt zusammengehörige Verantwortlichkeiten.

Abschließende Worte

Abschließend ist zu sagen, dass das SRP ein, auf den ersten Blick, einfaches Prinzip ist es aber etwas Feingefühl bedarf um es anzuwenden. Die Vorteile die bei der Anwendung erzielt werden wiegen den Aufwand abber allemal auf.

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>