SOLID Principles | Single Responsibility C#

SOLID Principles | Single Responsibility C#
04/2024
Kai P. | Solution Engineer

TL;DR

Dieser Artikel erklärt das Single Responsibility Principle als Bestandteil der SOLID Principles und zeigt anhand eines C#-Beispiels, warum Klassen nach Verantwortlichkeiten unterschiedlicher Akteure getrennt werden sollten, um Konflikte, unerwartete Seiteneffekte und Wartungsprobleme zu vermeiden.

Single Responsibility Principle

Im Kontext der SOLID Principles beschreibt das Single Responsibility Principle in C#, dass eine Klasse nur dann verändert werden sollte, wenn sich genau ein verantwortlicher Akteur ändert – nicht, wenn unterschiedliche fachliche Zuständigkeiten betroffen sind. Häufig wird es missverstanden. Viele Entwickler interpretieren dieses Prinzip so, dass eine Funktion nur genau eine Sache ausführen darf – also eine große Funktion in kleinere Teilfunktionen zerlegt wird. Dies entspricht jedoch nicht dem SRP.

‍

Leitsatz

‍Das Prinzip der einzigen Verantwortung basiert auf folgender Kernaussage:

– „Separiere Code dann, wenn verschiedene Akteure davon abhängig sind.“

‍

Beispiel: Ungewollte Abhängigkeiten

‍Ein Beispiel aus einer Gehaltsabrechnungssoftware liefert die Klasse Mitarbeiter. Sie enthält neben Mitarbeiterdaten drei Methoden:

Hierbei sind drei verschiedene Akteure für die jeweiligen Spezifikationen verantwortlich:

‍

UML-Diagramm mit Abteilungen und deren Zugriff auf Methoden der Mitarbeiter-Klasse per Abhängigkeitspfeile.

‍

  1. Die Buchhaltung spezifiziert die Gehaltsberechnung.
  2. Die Personalverwaltung spezifiziert die Stundenübersicht.
  3. Die IT-Administration spezifiziert die Speichermethode.

Der Quellcode wird also gemeinsam in einer Klasse verwaltet.

Nun stellen wir uns vor, dass die Erstellung von Stundenübersichten und Gehaltsabrechnungen eine gemeinsam genutzte Funktion verwenden, um reguläre Arbeitsstunden zu ermitteln.

Diagramm zeigt, wie Personalverwaltung und Buchhaltung auf ReguläreStunden zugreifen und diese verwenden.

‍

Nun entscheidet die Personalverwaltung, dass die Berechnung regulärer Stunden nach einer neuen Formel erfolgen soll und aktualisiert den Berechnungsalgorithmus – ohne die Buchhaltung darüber zu informieren.

Diagramm mit grün markierter Personalverwaltung und Methode zur Erstellung der Stundenübersicht.

‍

‍

Wenn die Buchhaltung nun zum Monatsende Gehaltsabrechnungen durchführt und der Algorithmus das Gehalt aller Mitarbeiter berechnet, wird die Änderung ohne vorherige Information übernommen.

‍

Diagramm mit grünem und rotem Block zur Darstellung aktiver und inaktiver Komponenten mit Beziehungen.

‍

Die Zahlungen an die Mitarbeiter erfolgen nach dem neuen Berechnungsalgorithmus, was zu einer Erhöhung der Gehaltszahlungen um etwa 20 % führt.

Dieses Szenario ist ein klassisches Beispiel für mangelhafte Modularisierung.

‍

Beispiel: Häufige Konflikte

‍

Darstellung von Dev-, PV- und B-Branch mit Merge-Symbolen und Prüfzeichen für erfolgreichen und fehlerhaften Merge.

‍

‍Nun stellen wir uns vor, dass die Personalverwaltung und die Buchhaltung wegen neuer gesetzlicher Bestimmungen jeweils Änderungen in der Stundenübersicht bzw. Gehaltsabrechnung gleichzeitig durchführen müssen. Beim Zusammenführen beider Versionen in der Versionskontrolle entstehen wahrscheinlich Konflikte, die mühsam gelöst werden müssen, da sich sämtlicher Quellcode in einer Klasse befindet.

‍

Lösung: Methoden auslagern

‍
Es gibt verschiedene Lösungen, um dieses Problem zu beheben. Eine davon ist, Methoden und Daten in Klassen auszulagern.

‍

Klassendiagramm mit getrennten Komponenten für Gehalt, Stundenübersicht und Speicherung.

Der Vorteil dieser Herangehensweise ist eine unabhängige Wartbarkeit. Allerdings müssen zur Laufzeit drei Klassen instanziiert und verwaltet werden.

Eine Lösung bietet das Fassade-Entwurfsmuster. Die Klasse MitarbeiterFassade enthält wenig Quellcode und ist dafür zuständig, untergeordnete Klassen zu instanziieren und deren Methoden zu delegieren.

‍

MitarbeiterFassade ruft Methoden in Gehalts-, Stunden- und Speicher-Klassen zur Datenverarbeitung auf.

Es gibt jedoch Entwickler, die bevorzugen, die wichtigsten Methoden näher an die Daten zu koppeln.

‍

Mitarbeiterklasse mit Methoden, die an spezialisierte Klassen wie Gehaltsberechner delegiert werden.

Diese Prinzipien entfalten ihren Wert vor allem in langlebigem Code. Wir helfen Unternehmen dabei, ihre Legacy-Software zu modernisieren, schrittweise und im laufenden Betrieb.

Kai P. | Solution Engineer
Kai P. | Solution Engineer

Software Modernisierung

Gewachsene Systeme lassen sich in Schritten erneuern statt in einer riskanten Komplettablösung. Devware macht das seit 2004 für den Mittelstand, ISO 27001 und ISO 9001 zertifiziert.
Pfeil-Icon – Mehr erfahren

Mehr zum Thema

Pfeil nach rechts (Verlinkung)
Behaviors in WPF
10/2026

Behaviors in WPF

Blauer Pfeil nach rechts (Verlinkung)
Angular: Webcam ansteuern
09/2026

Angular: Webcam ansteuern

Blauer Pfeil nach rechts (Verlinkung)
Unittests in C#
09/2026

Unittests in C#

Blauer Pfeil nach rechts (Verlinkung)
KI in der Software­entwicklung: welche Werkzeuge wir einsetzen und wie Ihre Daten geschützt sind
09/2026

KI in der Software­entwicklung: welche Werkzeuge wir einsetzen und wie Ihre Daten geschützt sind

Blauer Pfeil nach rechts (Verlinkung)