<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Single-Responsibility-Prinzip</id>
	<title>Single-Responsibility-Prinzip - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Single-Responsibility-Prinzip"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Single-Responsibility-Prinzip&amp;action=history"/>
	<updated>2026-05-25T15:37:00Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Single-Responsibility-Prinzip&amp;diff=1736012&amp;oldid=prev</id>
		<title>imported&gt;Invisigoth67: typo</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Single-Responsibility-Prinzip&amp;diff=1736012&amp;oldid=prev"/>
		<updated>2026-01-04T07:10:08Z</updated>

		<summary type="html">&lt;p&gt;typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Das &amp;#039;&amp;#039;&amp;#039;Single-Responsibility-Prinzip&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;SRP&amp;#039;&amp;#039;&amp;#039;, {{deS|Prinzip der eindeutigen Verantwortlichkeit}}) ist eine Entwurfsrichtlinie in der [[Softwarearchitektur]].&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Eine weit verbreitete, aber fehlerhafte Annahme ist, dass SRP aussagt, dass jede [[Klasse (Objektorientierung)|Klasse]] nur eine fest definierte Aufgabe zu erfüllen habe.&amp;lt;ref&amp;gt;{{Literatur |Autor=Robert C. Martin |Titel=Clean Architecture: A Craftsman’s Guide to Software Structure and Design |Auflage=1. |Verlag=Prentice Hall |Ort= |Datum=2017 |ISBN=978-0-13-449416-6 |Seiten=62}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Ausdruck wurde von [[Robert Cecil Martin|Robert C. Martin]] in einem Teilartikel gleichen Namens in seiner Publikation &amp;#039;&amp;#039;Principles of Object Oriented Design&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Internetquelle |autor=Robert C. Martin |url=http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod |titel=The Principles of OOD |datum=2005-05-11 |sprache=en |abruf=2014-04-22}}&amp;lt;/ref&amp;gt; eingeführt:&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=There should never be more than one reason for a class to change.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Robert C. Martin&lt;br /&gt;
 |Quelle=SRP: The Single Responsibility Principle&lt;br /&gt;
 |Übersetzung=Es sollte nie mehr als einen Grund geben, eine Klasse zu ändern.&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;meyer&amp;quot;&amp;gt;{{Internetquelle |autor=Robert C. Martin |url=http://www.objectmentor.com/resources/articles/srp.pdf |titel=SRP: The Single Responsibility Principle |datum=1997-02 |format=PDF |sprache=en |offline=1 |archiv-url=https://web.archive.org/web/20140407020253/http://www.objectmentor.com/resources/articles/srp.pdf |archiv-datum=2014-04-07 |archiv-bot=2023-01-10 08:05:29 InternetArchiveBot |abruf=2014-04-22}}&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Bekannt wurde der Ausdruck durch sein Buch &amp;#039;&amp;#039;Agile Software Development: Principles, Patterns, and Practices&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
In seinem Buch &amp;#039;&amp;#039;Clean Architecture: A Craftsman’s Guide to Software Structure and Design&amp;#039;&amp;#039; geht Robert C. Martin auf die Fehlinterpretation des SRP ein und schlägt die „finale Version“ der Definition vor.&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=A module should be responsible to one, and only one, actor.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Robert C. Martin&lt;br /&gt;
 |Quelle=Clean Architecture: A Craftsman’s Guide to Software Structure and Design&lt;br /&gt;
 |Übersetzung=Ein Modul sollte einem, und &amp;#039;&amp;#039;nur&amp;#039;&amp;#039; einem, Akteur gegenüber verantwortlich sein.&lt;br /&gt;
 |ref=}}&lt;br /&gt;
&lt;br /&gt;
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 Funktionalitäten und Datenstrukturen.&lt;br /&gt;
&lt;br /&gt;
== Verallgemeinerung des Single-Responsibility-Prinzips ==&lt;br /&gt;
=== Funktionen und Variablen ===&lt;br /&gt;
Eine Verallgemeinerung des SRP stellt &amp;#039;&amp;#039;&amp;#039;Curly’s Law&amp;#039;&amp;#039;&amp;#039; dar, welches SRP, &amp;#039;&amp;#039;methods should do one thing&amp;#039;&amp;#039;,&amp;lt;ref&amp;gt;{{Literatur |Autor=[[Robert Cecil Martin|Robert C. Martin]] |Titel=Clean Code: A Handbook of Agile Software Craftsmanship |Verlag=Prentice Hall International |Datum= |ISBN=978-0-13-235088-4}}&amp;lt;/ref&amp;gt; &amp;#039;&amp;#039;once and only once (OAOO)&amp;#039;&amp;#039;,&amp;lt;ref&amp;gt;{{Internetquelle |url=http://c2.com/cgi/wiki?OnceAndOnlyOnce |titel=Once And Only Once |werk=Cunningham &amp;amp;amp; Cunningham |sprache=en |abruf=2014-04-26}}&amp;lt;/ref&amp;gt; [[don’t repeat yourself]] (DRY) und &amp;#039;&amp;#039;single source of truth (SSOT)&amp;#039;&amp;#039; zusammenfasst. Das SRP kann und soll demnach für alle Aspekte eines Softwareentwurfs angewendet werden. Dazu gehören 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 gültig.&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=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.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Ralf Westphal&lt;br /&gt;
 |Übersetzung=&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;{{Internetquelle |autor=Ralf Westphal |url=http://www.developerfusion.com/article/137636/taking-the-single-responsibility-principle-seriously/ |titel=Taking the Single Responsibility Principle Seriously |werk=developerFusion |datum=2012-02-06 |sprache=en |abruf=2014-04-22}}&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=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.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Tim Ottinger&lt;br /&gt;
 |Übersetzung=&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;{{Internetquelle |autor=Jeff Atwood |url=http://blog.codinghorror.com/curlys-law-do-one-thing/ |titel=Curly’s Law: Do One Thing |werk=Coding Horror |datum=2007-03-01 |sprache=en |abruf=2014-04-22}}&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
In dem folgenden Beispiel wird eine Reihe von Zahlen sortiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var numbers = new [] { 5,8,4,3,1 };&lt;br /&gt;
numbers = numbers.OrderBy(i =&amp;gt; i);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da die Variable &amp;lt;code&amp;gt;numbers&amp;lt;/code&amp;gt; zuerst die unsortierten Zahlen repräsentiert und nachher die sortierten Zahlen, wird Curly’s Law verletzt. Dies lässt sich auflösen, indem eine zusätzliche Variable eingeführt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var numbers = new [] { 5,8,4,3,1 };&lt;br /&gt;
var orderedNumbers = numbers.OrderBy(i =&amp;gt; i);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwendungen ===&lt;br /&gt;
Auch in der [[Unix-Philosophie]] kommt ein ähnliches Prinzip vor, denn hier sollen Anwendungen einen einzelnen Zweck erfüllen.&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=&amp;#039;&amp;#039;Make each program do one thing well.&amp;#039;&amp;#039; 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.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Mike Gancarz&lt;br /&gt;
 |Quelle=The UNIX Philosophy&lt;br /&gt;
 |Übersetzung=&amp;#039;&amp;#039;Gestalte jedes Programm so, dass es eine Aufgabe gut erledigt.&amp;#039;&amp;#039; Durch die Fokussierung auf eine einzelne Aufgabe, kann ein Programm viel unnötigen Code eliminieren, welcher oft zu übertriebenem Overhead, unnötiger Komplexität und mangelnder Flexibilität führt.&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;{{Literatur |Autor=Mike Gancarz |Titel=The UNIX Philosophy |Datum=1995 |ISBN=1-55558-123-4 |Kapitel=The UNIX Philosophy in a Nutshell |Seiten=4 |Sprache=en}}&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Anwendungen und Benutzerschnittstellen nach einem einzelnen Zweck aufzuteilen, besitzt nicht nur in der Entwicklung Vorteile. Auch für Benutzer sind Programme und Benutzerschnittstellen mit einem klar bestimmten Aufgabenzweck besser verständlich und schneller erlernbar. Nicht zuletzt ergeben sich Vorteile bei beschränkten Bildschirmgrößen, wie dies z.&amp;amp;nbsp;B. bei [[Smartphone]]s der Fall ist.&lt;br /&gt;
&lt;br /&gt;
== Verwandte Muster ==&lt;br /&gt;
Das [[Interface-Segregation-Prinzip]] kann als ein Spezialfall des SRP gesehen werden. Es entsteht durch die Anwendung des SRP auf Interfaces.&lt;br /&gt;
&lt;br /&gt;
[[Command-Query-Separation]] dient dazu, Funktionen und Entitäten nach ihrer Aufgabe zu trennen, indem zwischen Kommandos (&amp;#039;&amp;#039;{{lang|en|Commands}}&amp;#039;&amp;#039;) und Abfragen (&amp;#039;&amp;#039;{{lang|en|Queries}}&amp;#039;&amp;#039;) unterschieden wird. Ähnliches gilt für [[Command-Query-Responsibility-Segregation|CQRS]], welches unterschiedliche Codepfade für Datenbankzugriffe definiert, welche unabhängig voneinander optimiert werden können.&lt;br /&gt;
&lt;br /&gt;
== Querschnittsaspekte ==&lt;br /&gt;
[[Cross-Cutting Concern|Querschnittsaspekte]], welche die gesamte Anwendung betreffen, stellen bezüglich des SRP eine besondere Herausforderung dar. Hierzu zählt insbesondere das [[Logging]].&lt;br /&gt;
&lt;br /&gt;
=== Bewusster Verstoß gegen das SRP ===&lt;br /&gt;
Viele Entwickler vertreten die Ansicht, dass bei Querschnittsaspekten gegen das SRP verstoßen werden sollte, da Querschnittsaspekte, wie das Logging, so nah wie möglich an der zuständigen Geschäftslogik sein sollten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public sealed class PersonRepository : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    private static ILogger Log = ...;&lt;br /&gt;
&lt;br /&gt;
    public Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            return ...;&lt;br /&gt;
        }&lt;br /&gt;
        catch(Exception ex)&lt;br /&gt;
        {&lt;br /&gt;
            Log.Error(ex, $&amp;quot;Could not get Person named {name}&amp;quot;);&lt;br /&gt;
            throw;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Logging direkt in der Methode führt allerdings dazu, dass das SRP nicht eingehalten und die Methode [[Spaghetticode|spaghettifiziert]] wird. Das Lesen und Testen der Geschäftslogik wird durch den Code des Aspekts erschwert.&lt;br /&gt;
&lt;br /&gt;
=== Decorator-Methode ===&lt;br /&gt;
Eine Decorator-Methode ist eine einfache Möglichkeit, den Aspekt und die Geschäftslogik in getrennte Methoden auszulagern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public sealed class PersonRepository : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    private static ILogger Log = ...;&lt;br /&gt;
&lt;br /&gt;
    public Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            return GetByNameWithoutLogging(name);&lt;br /&gt;
        }&lt;br /&gt;
        catch(Exception ex)&lt;br /&gt;
        {&lt;br /&gt;
            Log.Error(ex, $&amp;quot;Could not get Person named {name}&amp;quot;);&lt;br /&gt;
            throw;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Person GetByNameWithoutLogging(string name)&lt;br /&gt;
    {&lt;br /&gt;
        return ...;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Aspektorientierte Programmierung ===&lt;br /&gt;
Die [[Aspektorientierte Programmierung]] (AOP) stellt einen alternativen Ansatz dar, um den Aspekt auszulagern. Hierbei wird die Logik lediglich über eine Auszeichnung definiert und von einem [[Aspekt-Weaver]] implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public sealed class PersonRepository : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    [LogToErrorOnException]&lt;br /&gt;
    public Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        return ...;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist hierbei, dass das SRP nicht eingehalten wird, da der Aspekt weiterhin in der Klasse verbleibt. Zudem können eventuell nicht alle Aspekte ausgegliedert werden. Beispielsweise kann im obigen Beispiel mit einem Attribut keine parametrisierte Fehlermeldung angegeben werden. Dies führt dazu, dass die Lösung an vielen Stellen annähernd dieselbe Komplexität aufweist wie die ursprüngliche Lösung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public sealed class PersonRepository : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    public Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            return ...;&lt;br /&gt;
        }&lt;br /&gt;
        catch(Exception ex)&lt;br /&gt;
        {&lt;br /&gt;
            LogTo.Error(ex, $&amp;quot;Could not get Person named {name}&amp;quot;);&lt;br /&gt;
            throw;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zudem befindet sich die Logik des Aspekt nach dem Kompiliervorgang weiterhin in der Klasse und erschwert daher weiterhin die Testbarkeit.&lt;br /&gt;
&lt;br /&gt;
=== Unterklasse ===&lt;br /&gt;
Eine weitere Möglichkeit, den Aspekt von der [[Geschäftslogik]] zu trennen, besteht darin, [[abgeleitete Klasse]]n einzuführen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class PersonRepository : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    public virtual Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        return ...;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public sealed class LoggingPersonRepository : PersonRepository&lt;br /&gt;
{&lt;br /&gt;
    private static ILogger Log = ...;&lt;br /&gt;
&lt;br /&gt;
    public override Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            return base.GetByName(name);&lt;br /&gt;
        }&lt;br /&gt;
        catch(Exception ex)&lt;br /&gt;
        {&lt;br /&gt;
            Log.Error(ex, $&amp;quot;Could not get Person named {name}&amp;quot;);&lt;br /&gt;
            throw;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Lösung verstößt allerdings gegen das Prinzip [[Komposition an Stelle von Vererbung]] einzusetzen. Unterklassen zur Auslagerung von Aspekten stellen daher ein [[Antipattern]] dar.&lt;br /&gt;
&lt;br /&gt;
=== Decorator ===&lt;br /&gt;
Aspekte lassen sich mittels eines [[Decorator]]s realisieren und somit von der [[Geschäftslogik]] trennen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public sealed class PersonRepository : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    public Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        return ...;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public sealed class PersonRepositoryLoggingFacade : IPersonRepository&lt;br /&gt;
{&lt;br /&gt;
    private static ILogger Log = ...;&lt;br /&gt;
    public IPersonRepository Repository { get; }&lt;br /&gt;
&lt;br /&gt;
    public PersonRepositoryLoggingFacade(PersonRepository repository)&lt;br /&gt;
    {&lt;br /&gt;
        Repository = repository;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Person GetByName(string name)&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            return Repository.GetByName(name);&lt;br /&gt;
        }&lt;br /&gt;
        catch(Exception ex)&lt;br /&gt;
        {&lt;br /&gt;
            Log.Error(ex, $&amp;quot;Could not get Person named {name}&amp;quot;);&lt;br /&gt;
            throw;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Vorteil hierbei ist, dass das Prinzip der &amp;#039;&amp;#039;Komposition an Stelle von Vererbung&amp;#039;&amp;#039; eingehalten wird. Die Klasse &amp;lt;code&amp;gt;PersonRepository&amp;lt;/code&amp;gt; kann in Folge gegenüber Vererbung geschlossen werden, da eine Erweiterung durch Komposition jederzeit möglich ist. Ein weiterer Vorteil ist, dass der Aspekt durch eine Konfiguration der [[Dependency Injection]] ausgetauscht werden kann. Zudem kann die Logging-Logik unabhängig von der Business-Logik getestet werden.&lt;br /&gt;
&lt;br /&gt;
Nachteilig ist allerdings ein höherer Wartungsaufwand, da in der Dependency Injection sowohl die Klasse mit der Geschäftslogik als auch die Klasse mit dem Aspekt verwaltet werden muss. Durch die Trennung wird zudem die Nachvollziehbarkeit (z.&amp;amp;nbsp;B. in welcher Klasse ein Fehler aufgetreten ist) erschwert.&lt;br /&gt;
&lt;br /&gt;
== Raviolicode ==&lt;br /&gt;
Die konsequente Anwendung des Single-Responsibility-Prinzips führt dazu, dass anstatt des [[Spaghetticode]]s ein sogenannter [[Raviolicode]] entsteht.&amp;lt;ref name=&amp;quot;ravioli&amp;quot; /&amp;gt; Dabei handelt es sich um Code mit sehr vielen kleinen Klassen und kleinen Methoden.&lt;br /&gt;
&lt;br /&gt;
Raviolicode besitzt den Nachteil, dass die Menge an Klassen in großen Projekten dazu führt, dass eine geringere Übersichtlichkeit gegeben ist. Dies betrifft insbesondere die in objektorientierten Programmiersprachen auftretenden [[Functor]]-Klassen,&amp;lt;ref name=&amp;quot;functor&amp;quot; /&amp;gt; also Klassen mit nur einer einzigen Methode.&lt;br /&gt;
&lt;br /&gt;
Das SRP macht somit eine saubere Strukturierung mittels [[Modul (Software)|Modulen]], [[Namensraum|Namespaces]] und [[Fassade (Entwurfsmuster)|Fassaden]] zwingend notwendig, damit die Übersichtlichkeit nicht verloren geht.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;ravioli&amp;quot;&amp;gt;&lt;br /&gt;
{{Internetquelle&lt;br /&gt;
 |url=http://wiki.c2.com/?RavioliCode&lt;br /&gt;
 |titel=Ravioli Code&lt;br /&gt;
 |werk=Portland Pattern Repository&lt;br /&gt;
 |datum=2013-05-21&lt;br /&gt;
 |sprache=en&lt;br /&gt;
 |abruf=2017-03-04}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;functor&amp;quot;&amp;gt;&lt;br /&gt;
{{Internetquelle&lt;br /&gt;
 |url=http://wiki.c2.com/?FunctorObject&lt;br /&gt;
 |titel=Functor Object&lt;br /&gt;
 |werk=Portland Pattern Repository&lt;br /&gt;
 |datum=2014-11-10&lt;br /&gt;
 |sprache=en&lt;br /&gt;
 |abruf=2017-03-04}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Navigationsleiste Prinzipien objektorientierten Designs}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierparadigma]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Invisigoth67</name></author>
	</entry>
</feed>