www.wikidata.de-de.nina.az
Das Single Responsibility Prinzip SRP deutsch Prinzip der eindeutigen Verantwortlichkeit ist eine Entwurfsrichtlinie in der Softwarearchitektur Inhaltsverzeichnis 1 Definition 2 Verallgemeinerung des Single Responsibility Prinzips 2 1 Funktionen und Variablen 2 2 Anwendungen 3 Verwandte Muster 4 Querschnittsaspekte 4 1 Bewusster Verstoss gegen das SRP 4 2 Decorator Methode 4 3 Aspektorientierte Programmierung 4 4 Unterklasse 4 5 Decorator 5 Raviolicode 6 EinzelnachweiseDefinition BearbeitenEine weit verbreitete aber fehlerhafte Annahme ist dass SRP aussagt dass jede Klasse nur eine fest definierte Aufgabe zu erfullen habe 1 Der Ausdruck wurde von Robert C Martin in einem Teilartikel gleichen Namens in seiner Publikation Principles of Object Oriented Design 2 eingefuhrt There should never be more than one reason for a class to change Es sollte nie mehr als einen Grund geben eine Klasse zu andern Robert C Martin SRP The Single Responsibility Principle 3 Bekannt wurde der Ausdruck durch sein Buch Agile Software Development Principles Patterns and Practices In seinem Buch Clean Architecture A Craftsman s Guide to Software Structure and Design geht Robert C Martin auf die Fehlinterpretation des SRP ein und schlagt die finale Version der Definition vor A module should be responsible to one and only one actor Ein Modul sollte einem und nur einem Akteur gegenuber verantwortlich sein Robert C Martin Clean Architecture A Craftsman s Guide to Software Structure and Design Somit geht es beim SRP nicht nur um die einzelnen Klassen oder Funktionen Vielmehr geht es um durch die Anforderungen eines Akteurs definierten Sammlungen an Funktionalitaten und Datenstrukturen Verallgemeinerung des Single Responsibility Prinzips BearbeitenFunktionen und Variablen Bearbeiten Eine Verallgemeinerung des SRP stellt Curly s Law dar welches SRP methods should do one thing 4 once and only once OAOO 5 don t repeat yourself DRY und single source of truth SSOT zusammenfasst Das SRP kann und soll demnach fur alle Aspekte eines Softwareentwurfs angewendet werden Dazu gehoren nicht nur Klassen sondern unter anderem auch Funktionen und Variablen Es ist daher auch bei der Verwendung von nicht objektorientierten Programmiersprachen und dem Entwurf von Serviceschnittstellen gultig A functional unit on a given level of abstraction should only be responsible for a single aspect of a system s requirements An aspect of requirements is a trait or property of requirements which can change independently of other aspects Ralf Westphal 6 A variable should mean one thing and one thing only It should not mean one thing in one circumstance and carry a different value from a different domain some other time It should not mean two things at once It must not be both a floor polish and a dessert topping It should mean One Thing and should mean it all of the time Tim Ottinger 7 Beispiel In dem folgenden Beispiel wird eine Reihe von Zahlen sortiert var numbers new 5 8 4 3 1 numbers numbers OrderBy i gt i Da die Variable numbers zuerst die unsortierten Zahlen reprasentiert und nachher die sortierten Zahlen wird Curly s Law verletzt Dies lasst sich auflosen indem eine zusatzliche Variable eingefuhrt wird var numbers new 5 8 4 3 1 var orderedNumbers numbers OrderBy i gt i Anwendungen Bearbeiten Auch in der Unix Philosophie kommt ein ahnliches Prinzip vor denn hier sollen Anwendungen einen einzelnen Zweck erfullen Make each program do one thing well By focusing on a single task a program can eliminate much extraneous code that often results in excess overhead unnecessary complexity and a lack of flexibility Gestalte jedes Programm so dass es eine Aufgabe gut erledigt Durch die Fokussierung auf eine einzelne Aufgabe kann ein Programm viel unnotigen Code eliminieren welcher oft zu ubertriebenem Overhead unnotiger Komplexitat und mangelnder Flexibilitat fuhrt Mike Gancarz The UNIX Philosophy 8 Anwendungen und Benutzerschnittstellen nach einem einzelnen Zweck aufzuteilen besitzt nicht nur in der Entwicklung Vorteile Auch fur Benutzer sind Programme und Benutzerschnittstellen mit einem klar bestimmten Aufgabenzweck besser verstandlich und schneller erlernbar Nicht zuletzt ergeben sich Vorteile bei beschrankten Bildschirmgrossen wie dies z B bei Smartphones der Fall ist Verwandte Muster BearbeitenDas Interface Segregation Prinzip kann als ein Spezialfall des SRP gesehen werden Es entsteht durch die Anwendung des SRP auf Interfaces Command Query Separation dient dazu Funktionen und Entitaten nach ihrer Aufgabe zu trennen indem zwischen Kommandos Commands und Abfragen Queries unterschieden wird Ahnliches gilt fur CQRS welches unterschiedliche Codepfade fur Datenbankzugriffe definiert welche unabhangig voneinander optimiert werden konnen Querschnittsaspekte BearbeitenQuerschnittsaspekte welche die gesamte Anwendung betreffen stellen bezuglich des SRP eine besondere Herausforderung dar Hierzu zahlt insbesondere das Logging Bewusster Verstoss gegen das SRP Bearbeiten Viele Entwickler vertreten die Ansicht dass bei Querschnittsaspekten gegen das SRP verstossen werden sollte da Querschnittsaspekte wie das Logging so nah wie moglich an der zustandigen Geschaftslogik sein sollten public sealed class PersonRepository IPersonRepository private static ILogger Log public Person GetByName string name try return catch Exception ex Log Error ex Could not get Person named name throw Das Logging direkt in der Methode fuhrt allerdings dazu dass das SRP nicht eingehalten und die Methode spaghettifiziert wird Das Lesen und Testen der Geschaftslogik wird durch den Code des Aspekts erschwert Decorator Methode Bearbeiten Eine Decorator Methode ist eine einfache Moglichkeit den Aspekt und die Geschaftslogik in getrennte Methoden auszulagern public sealed class PersonRepository IPersonRepository private static ILogger Log public Person GetByName string name try return GetByNameWithoutLogging name catch Exception ex Log Error ex Could not get Person named name throw private Person GetByNameWithoutLogging string name return Nachteilig ist dass der Aspekt zwar auf Methodenebene ausgelagert wurde allerdings weiterhin in der Klasse vorhanden ist Dies stellt daher eine Verletzung des SRP auf Klassenebene dar Zwar wird die Lesbarkeit verbessert jedoch stellt sich beim Testen weiterhin die Herausforderung dass der Aspekt mitgetestet werden muss Aspektorientierte Programmierung Bearbeiten Die Aspektorientierte Programmierung AOP stellt einen alternativen Ansatz dar um den Aspekt auszulagern Hierbei wird die Logik lediglich uber eine Auszeichnung definiert und von einem Aspekt Weaver implementiert public sealed class PersonRepository IPersonRepository LogToErrorOnException public Person GetByName string name return Nachteilig ist hierbei dass das SRP nicht eingehalten wird da der Aspekt weiterhin in der Klasse verbleibt Zudem konnen eventuell nicht alle Aspekte ausgegliedert werden Beispielsweise kann im obigen Beispiel mit einem Attribut keine parametrisierte Fehlermeldung angegeben werden Dies fuhrt dazu dass die Losung an vielen Stellen annahernd dieselbe Komplexitat aufweist wie die ursprungliche Losung public sealed class PersonRepository IPersonRepository public Person GetByName string name try return catch Exception ex LogTo Error ex Could not get Person named name throw Zudem befindet sich die Logik des Aspekt nach dem Kompiliervorgang weiterhin in der Klasse und erschwert daher weiterhin die Testbarkeit Unterklasse Bearbeiten Eine weitere Moglichkeit den Aspekt von der Geschaftslogik zu trennen besteht darin abgeleitete Klassen einzufuhren public class PersonRepository IPersonRepository public virtual Person GetByName string name return public sealed class LoggingPersonRepository PersonRepository private static ILogger Log public override Person GetByName string name try return base GetByName name catch Exception ex Log Error ex Could not get Person named name throw Diese Losung verstosst allerdings gegen das Prinzip Komposition an Stelle von Vererbung einzusetzen Ein weiterer Nachteil ist dass samtliche Klassen und Methoden fur Vererbung geoffnet werden mussen wodurch zudem gegen das Open Closed Prinzip verstossen wird Unterklassen zur Auslagerung von Aspekten stellen daher ein Antipattern dar Decorator Bearbeiten Aspekte lassen sich mittels eines Decorators realisieren und somit von der Geschaftslogik trennen public sealed class PersonRepository IPersonRepository public Person GetByName string name return public sealed class PersonRepositoryLoggingFacade IPersonRepository private static ILogger Log public IPersonRepository Repository get public LoggingPersonRepository PersonRepository repository Repository repository public Person GetByName string name try return Repository GetByName name catch Exception ex Log Error ex Could not get Person named name throw Der Vorteil hierbei ist dass das Prinzip der Komposition an Stelle von Vererbung eingehalten wird Die Klasse PersonRepository kann in Folge gegenuber Vererbung geschlossen werden da eine Erweiterung durch Komposition jederzeit moglich ist Ein weiterer Vorteil ist dass der Aspekt durch eine Konfiguration der Dependency Injection ausgetauscht werden kann Zudem kann die Logging Logik unabhangig von der Business Logik getestet werden Nachteilig ist allerdings ein hoherer Wartungsaufwand da in der Dependency Injection sowohl die Klasse mit der Geschaftslogik als auch die Klasse mit dem Aspekt verwaltet werden muss Durch die Trennung wird zudem die Nachvollziehbarkeit z B in welcher Klasse ein Fehler aufgetreten ist erschwert Raviolicode BearbeitenDie konsequente Anwendung des Single Responsibility Prinzips fuhrt dazu dass anstatt des Spaghetticodes ein sogenannter Raviolicode entsteht 9 Dabei handelt es sich um Code mit sehr vielen kleinen Klassen und kleinen Methoden Raviolicode besitzt den Nachteil dass die Menge an Klassen in grossen Projekten dazu fuhrt dass eine geringere Ubersichtlichkeit gegeben ist Dies betrifft insbesondere die in objektorientierten Programmiersprachen auftretenden Functor Klassen 10 also Klassen mit nur einer einzigen Methode Das SRP macht somit eine saubere Strukturierung mittels Modulen Namespaces und Fassaden zwingend notwendig damit die Ubersichtlichkeit nicht verloren geht Einzelnachweise Bearbeiten Robert C Martin Clean Architecture A Craftsman s Guide to Software Structure and Design 1 Auflage Prentice Hall 2017 ISBN 978 0 13 449416 6 S 62 Robert C Martin The Principles of OOD 11 Mai 2005 abgerufen am 22 April 2014 englisch Robert C Martin SRP The Single Responsibility Principle PDF Februar 1997 archiviert vom Original am 7 April 2014 abgerufen am 22 April 2014 englisch nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot www objectmentor com Robert C Martin Clean Code A Handbook of Agile Software Craftsmanship Prentice Hall International ISBN 978 0 13 235088 4 Once And Only Once In Cunningham amp Cunningham Abgerufen am 26 April 2014 englisch Ralf Westphal Taking the Single Responsibility Principle Seriously In developerFusion 6 Februar 2012 abgerufen am 22 April 2014 englisch Jeff Atwood Curly s Law Do One Thing In Coding Horror 1 Marz 2007 abgerufen am 22 April 2014 englisch Mike Gancarz The UNIX Philosophy 1995 ISBN 1 55558 123 4 The UNIX Philosophy in a Nutshell S 4 englisch Ravioli Code In Portland Pattern Repository 21 Mai 2013 abgerufen am 4 Marz 2017 englisch Functor Object In Portland Pattern Repository 10 November 2014 abgerufen am 4 Marz 2017 englisch VPrinzipien objektorientierten DesignsSOLID Prinzipien Single Responsibility Open Closed Liskovsches Substitutionsprinzip Interface Segregation Dependency InversionWeitere Prinzipien Gesetz von Demeter Design by Contract Datenkapselung Linguistic Modular Units Self Documentation Uniform Access Single Choice Persistence Closure Command Query SeparationPackaging Prinzipien Reuse Release Equivalence Common Closure Common Reuse Acyclic Dependencies Stable Dependencies Stable Abstractions Abgerufen von https de wikipedia org w index php title Single Responsibility Prinzip amp oldid 229683726