Ist das SRP-Prinzip (Single Responsibility Principle) ein Ziel?


17

Betrachten Sie zwei UI-Designer, die "benutzerattraktive" Designs entwerfen möchten. "Benutzerattraktion" ist ein Konzept, das nicht objektiv ist und nur im Kopf der Designer liegt. So könnte Designer A beispielsweise rote Farbe aufnehmen, während Designer B blaue Farbe aufnimmt. Designer A erstellt ein Layout, das sich vollständig von Designer B unterscheidet, und so weiter.

Ich habe über SRP (Single Responsibility Principle) gelesen und verstanden, dass es sich um eine Art subjektive Analyse oder Aufschlüsselung von Verantwortlichkeiten handelt, die von einem OO-Designer zu einem anderen OO-Designer variieren können. Habe ich recht? Mit anderen Worten, ist es möglich, zwei hervorragende objektorientierte Analysatoren und Designer zu haben, die zwei unterschiedliche Designs für ein System entwickeln, das auf dem SRP-Prinzip basiert?


4
Ich denke, jede Art von Design (Kunst, Technik, ...) hat ein Gleichgewicht zwischen Objektivität und Subjektivität - einige klare Regeln und Einschränkungen, einige Erfahrung und Urteilsvermögen und sogar einige völlig freie All-Optionen-so-so-gut-wie- einander Entscheidungen.
Steve314

Antworten:


12

Eine gute Frage, über die ich oft nachgedacht habe.

Ich würde nicht objektiv sagen, nein. Auf jeden Fall subjektiv. Wie Sie vorgehen, um Probleme zu lösen, hängt von Ihrer Philosophie in Bezug auf diese Art von Problem ab. Die Wissenschaft zeigt uns, dass es viele verschiedene Möglichkeiten gibt, um dasselbe Problem effektiv zu lösen. Die Wissenschaft zeigt uns auch, dass Menschen, die auf unterschiedlichen Kontinenten leben, unabhängig voneinander die gleichen Lösungen finden können, sodass einige Lösungen offensichtlicher sind als andere. In jedem Fall hängt die Beurteilung von Lösungen als "am besten" von Ihren Kriterien ab.

Wirklich, was man als zwei Teile desselben Ganzen sehen könnte, könnte ein anderer als zwei völlig getrennte Konzepte sehen. Man sieht das die ganze Zeit, wenn man sich ansieht, wie Betreuer verschiedener Codebibliotheken das gleiche Problem angehen. Und dennoch funktionieren beide Lösungen einwandfrei.

(PS. Bearbeitet diese Antwort als die letzte Frage des OP das Gegenteil des Fragentitels fragt.)


5

Das Prinzip selbst ist objektiv, aber es gibt so viele verschiedene Möglichkeiten, etwas zu implementieren, das dem Prinzip folgt, dass zwei unabhängige Entwickler fast immer ziemlich unterschiedliche Systemdesigns für dieselbe Anwendung entwickeln.

Es ist sogar wahrscheinlich, dass derselbe Entwickler, der zweimal dasselbe Design ausführt, immer noch zwei Lösungen entwickelt, die sich zumindest teilweise unterscheiden.

Damit ein Prinzip dazu führt, dass Systemdesigns immer gleich aussehen, muss es jeden Aspekt der Designentscheidungen abdecken. Der Prinzipal der Einzelverantwortung deckt nur einen kleinen Teil der Entwurfsentscheidungen ab, die für den Entwurf eines Systems erforderlich sind.


Gute Analyse @Guffa. +1. Mir gefiel die Idee, nicht allumfassend zu sein. Ja, SRP sagt dir nur, dass du versuchen sollst, alles für ein Problem verantwortlich zu machen. Aber es sagt Ihnen nicht, wo die Grenze der Verantwortung liegt.
Saeed Neamati

2

Die Anwendung des Prinzips ist subjektiv. "Subjektiv" ist jedoch nicht gleichbedeutend mit "Präferenz" wie Ästhetik.

Es gibt offensichtliche Extreme. Eine Klasse mit genau einer Methode, mit nur wenigen Codezeilen, die keine anderen Klassen anspricht, folgt definitiv der SRP. Auf der anderen Seite folgt eine Klasse mit zwei Methoden, eine, die eine vollständige E-Mail-Implementierung über Raw-Sockets enthält, und eine, die ein GUI-Formular erstellt, definitiv nicht der SRP.

Ästhetik ist eine schlechte Analogie. Eine bessere Analogie wären die bekannten Informatikkonzepte der Kopplung und des Zusammenhalts . Weder diese sind schwarz-weiß, wahr oder falsch Attribute. Sie sind jedoch messbar, auch wenn es ein qualitatives Element gibt. Wenn Sie einer Gruppe erfahrener Entwickler zwei separate Designs für dasselbe Feature zeigen, werden sie ähnliche Messwerte liefern, bei denen das Design eine stärkere Kopplung und / oder Kohäsion aufweist.

In der Tat ist die SRP im Wesentlichen nur funktionale Kohäsion. Es besagt, dass die Teile eines Moduls (z. B. einer Klasse) zusammengefasst werden sollten, da sie alle zur Ausführung derselben Funktion beitragen und aus keinem anderen Grund. "Funktion" kann interpretiert werden - manche Leute interpretieren dies wörtlich als einzelne Funktions- (oder Methoden- oder Prozedur-) Deklaration , andere treten möglicherweise einen Schritt zurück und denken an eine Funktion wie "E-Mail senden" oder "Musik abspielen". , aber es gibt immer noch so viel Handlungsspielraum. "Managing stuff" ist keine gültige Funktionsbeschreibung.


0

Es gibt eine objektive Definition der "Verantwortung" als "Grund zur Veränderung". In der Zeit der Programmierung liegen alle Gründe für Änderungen in der Zukunft, sodass der Programmierer nur aufgrund seiner Erfahrung und seines Fachwissens raten kann. Die Analyse der Verantwortlichkeiten ist also eine Art Prognose, die zum Teil subjektiv ist.


0

SRP ist objektiv; Implementierungen sind subjektiv

Zwei Implementierungen mit genau derselben Funktionalität können völlig unterschiedliche interne Strukturen verwenden, was zu unterschiedlichen Klassen und Methoden führt, und beide können SRP erfüllen

Wenn sie die gleichen Methoden und Zustände verwenden und beide normalisiert sind (minimal / nicht redundant), erhalten sie theoretisch die gleichen Klassen und Methoden unter SRP.

aber ich kann es nicht beweisen. Noch.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.