Ich denke, das Beispiel hier ist nicht das schlechteste, um den Unterschied
zu verdeutlichen:
http://weblogs.asp.net/arturtrosin/archive/2009/01/26/separation-of-concern-
vs-single-responsibility-principle-soc-vs-srp.aspx
Gruß
Alex
Der Unterschied zwischen Separation of Concerns und Single
Responsibility Principle sind gravierend. Bevor ich den Unterschied
beschreibe möchte ich noch sagen: Ich beziehe mich auf Uncle Bob's
Definition des SRP und ich lege zunächst als Paradigma OO zu Grunde.
SRP: Every class should only have one reason too change.
Ich denke es ist klar, was dies bedeutet: Jedes Objekt oder jede Klasse
von Objekten soll genau eine eindeutige Verantwortlichkeit haben. Damit
gibt es nur einen Grund, ein Objekt zu ändern.
Separation of Concerns: Lässt sich in einem Satz schlecht
zusammenfassen. Kurz gesagt geht es auf Dijkstra zurück der es in einem
seiner Briefe (siehe ACM Archiv) benannte. Es geht darum, sämtliche
Belange eines "Problems" zu trennen, denn erst dann ist es möglich über
einen dieser Belange exakt nachzudenken (was laut Dijkstra dann erst
logisches effizientes Denken über Probleme ermöglicht). Ich hoffe ich
habs nicht verbockt mit diesem Versuch einer Zusammenfassung ;-)
Was heißt SoC für Software? Bei der Dekomposition eines Problems oder
genereller einer Anwendung in verschiedene Module soll jeder Belang
einen festen Platz haben, getrennt von allen anderen Belangen. Dies
bedeutet, dass ich zunächst oftmals anhand meiner Domäne eine
Dekomposition durchführem also in verschiedene Funktionalitäten zerlege
(damit also einige der Belange an das System).
Wenn ich entlang meiner Domäne eine Dekomposition durchführe, kann ich
dies nicht mehr entlang meiner Infrastruktur tun. Dieses Phänomen ist in
der Forschung als "Tyranny of the dominant decomposition" beschrieben
worden. Als Beispiel kann ich mir eine CD-Regal zu Hause vorstellen. Ich
kann die CDs nach Namen sortieren, um schnell eine CD eines bestimmten
Künstlers zu finden. Ich kann dann aber zB nicht schnell CDs eines
Genres finden, dafür müsste ich nach Genres sortieren. Dann kann ich
aber nicht mehr schnell nach einem Namen suchen. Beide Belange
überkreuzen sich. Mehr zu dem Beispiel:
http://sjancke.blogspot.com/2008/09/aspektorientierung-der-natrliche-nchste.html
Ich kann infrastrukturelle Belange wie Sicherheit, Persistenz oder auch
Updates/Benachrichtigungen (-> Observer Variationen) zwar in eigene
Module kapseln, letztlich kann ich diese Belange aber nicht explizit
trennen, weil die Module der domäne immer wieder Zugang dazu brauchen.
Deshalb nennt man solche Belange "Crosscutting Concerns", weil sie in
der Dekomposition orthogonal zu den Belangen der Domäne stehen. Am
Beispiel der "Updates/Benachrichtigungen" sieht man auch sofort, dass
dies nicht nur Infrastruktur betrifft sondern auch Teile der Domäne selbst.
Kann ich also Separation of Concerns im Paradigma der Objektorientierung
erreichen? Erinnern wir uns an das genannte Phänomen der "Tyranny of the
dominant decomposition". Damit ist klar: es geht nicht. Damit sind wir
dann bei einem meiner Lieblingsthemen angelangt: erweitern wir unser OO
Paradigma um die Konzepte des Paradigmas Aspektorientierung (AO), so
geht es schon.
Mehr Informationen und das ganze (SoC, Tyranny, ...) ausführlich gibt es
hier:
http://sjancke.blogspot.com/2008/09/aspektorientierung-der-natrliche-nchste.html
http://portal.acm.org/citation.cfm?id=302457 (_das_ Paper zu Tyranny...)
http://www.research.ibm.com/hyperspace/ (zugehöriges Projekt)
http://de.wikipedia.org/wiki/Cross-Cutting_Concern
So, dass solls nun gewesen sein, AO ist zwar ein Lösungsansatz, aber ich
wollte ja SoC diskutieren ;-)
-Sebastian
Laurin Stoll schrieb:
> Hallo zusammen,
> Wenn man SRP befolgt hat man SOC inklusive.
Wie bereits erwähnt kommt dies stark auf das befolgte Sprachparadigma
an. Ich gehe mal allgemein von OO aus. Und dann bekommt man SoC nicht
inklusive, wenn man SRP befolgt. Ein Objekt kann eine Responsibility
haben, und alle weiteren benötigten Responsibilities durch Aufrufe
weiterdelegieren. Dann kann ich aber trotzdem eine Verletzung von SoC
haben, denn scattering&tangling tritt schon allein durch einen
Methodenaufruf in Kraft. Die Ursache liegt in der Tyranny of the
dominant decomposition.
Ich sehe SRP und SoC weniger in einer Hirachie und vielmehr orthogonal
zu einander. Änderungsgrund und Concern sind klar definiert und auch
abgrenzbar gegeneinander.
SRP und SoC sind grundverschieden. Jedes Objekt kann genau eine
wohldefinierte Verantwortlich haben. Dennoch muss ich dann zur Erfüllung
bestimmter Aufgaben delegieren. In der Delegation von "gleichen"
Aufgaben an vielen Stellen kann ein Concern versteckt sein
(Standardbeispiele: Tracing, Security, Persistence, ...). Das diese
Concerns alle modularisiert sein sollen, ist Aussage des SoC (für
Software Design).
> Wenn ja, wasfüreine
> spezielle Verantwortlichkeit ist dann Concern?
Ralf, was genau meinst du damit? Sprechen wir von einem bestimmten
Concern und fragen nach seiner speziellen Verantwortlichkeit?
> Wir kommen weg von dem merkwürdigen "Änderungsgrund", der eingeführt
> wurde, um Concern und Responsibility überhaupt zu unterscheiden.
Ich sehe "Änderungsgrund" nur in der impliziten Definition von SRP durch
RC Martin. Für die Definition des Begriffs "Concern" ist dies nicht von
Bedeutung.
-Sebastian