2015-04-16 25 views
5

Im klassischen Fassadenmuster bietet ein einzelnes Objekt normalerweise eine vereinfachte Schnittstelle zu etwas Komplexem.Fassadenmuster vs. SRP

Da das Gang-of-Four setzte es (so nahe "offiziellen" zu, wie es erhält ...):

Fassade (185) eine einheitliche Schnittstelle zu einer Reihe von Schnittstellen in einem Subsystem Stellen . Facade definiert eine Schnittstelle auf höherer Ebene, die die Verwendung des Subsystems erleichtert.

und

... eine Fassade lediglich abstrahiert die Interface-Objekte an das Subsystem sie einfacher zu bedienen zu machen; Es definiert keine neue Funktionalität, und Subsystemklassen wissen nichts darüber.

Oder, wie es in Unmesh https://stackoverflow.com/a/5242476 setzt:

Eine Fassade den Benutzer aus den komplexen Details des Systems abschirmt und bietet ihnen eine vereinfachte Ansicht, die es einfach zu bedienen ist. Es entkoppelt auch den Code, der das System verwendet, von den Details der Subsysteme, wodurch das System später leichter modifiziert werden kann.

Die einzige Verantwortung Prinzip uns darauf hin, dass

sollte eine Klasse oder ein Modul eines, und nur einen, ändern Grund.

Per Onkel Bob (http://en.m.wikipedia.org/wiki/Single_responsibility_principle)

Da eine Fassade, durch Design, einen Benutzer aus einer Vielzahl von Gründen „zu ändern“ abschirmt, wie diese beiden Ideen zusammenarbeiten? Hat eine Fassade nicht so viele Gründe, sich zu ändern wie die Anzahl der Subsysteme, von denen ihre Implementierung abhängt?

+0

Was wäre die Vielzahl von Gründen sei es, eine Fassade zu verändern? – PeeHaa

+0

wird in der post klären – goofballLogic

Antwort

1

Zunächst einmal

Patterns und Prinzipien - sind zwei verschiedene Dinge. Ein Muster ist eine bewährte Lösung für ein Problem, während ein Prinzip nichts weiter als nur eine Richtlinie ist.

Vergleiche wären also sinnlos, zumal sie sich in den meisten Fällen ergänzen.

Wie für die Definition des SRP, „Ein Grund zu ändern“ leicht erklärt werden kann:

Bild, wenn Sie ein Auto Objekt bauen, das wäre wie der Motor, der Art und Dinge bestehen. So ist der Bau dieses Objekts würde so aussehen wie:

car = new Car(new Engine(), new Type()); 

Was also, wenn Sie einen Motor dieses Autos ersetzen? Dann ersetzen Sie einfach die Engine Instanz. Das ist ein Grund, sich zu ändern, da Sie andere Teile davon nicht berühren.

Wie für Fassaden ist die Definition, die Sie bereitgestellt haben, viel zu allgemein. Eine Fassade ist nur eine andere Möglichkeit, Dinge einzupacken, die in einigen Umgebungen möglicherweise nicht verfügbar sind. Sie stellen einfach sicher, dass Ihr Ding in allen Umgebungen funktioniert.Zum Beispiel gibt es ein sehr bekanntes Beispiel für Event-Listener in JavaScript:

function click(object, handler){ 
    if (object.addEventListener != undefined){ 
    // For major browsers 
    object.addEventListener(....); 
    } else if (object.attachEvent != undefined){ 
    // For IE < 7 
    object.attachEvent(...) 
    } else { 
    object.click = handler; 
    } 
} 
+0

Aktualisierung meiner Frage, um die "offizielle" GoF Definition der Fassade – goofballLogic

+0

Ihre Beispiel Fassade nicht wirklich die klassische Definition der Fassade Muster, zumindest in OO Kreisen. – goofballLogic

+0

Die Definition, die ich beschrieben habe, stammt aus dem Buch von Ross Harmes und Dustin Diaz, das JavaScript Design Patterns (Seite 141) genannt wird. Wie für Sie reflektierte Änderungen, würde ich einfach eine Schnittstelle für diese "Fassaden" implementieren, und jetzt würde die Implementierung von Abstraktionen und nicht von konkreten Implementierungen abhängen, die Ihr Problem lösen würden – Yang

4

Grundsätzlich, wenn Ihre Fassade Klasse implementiert Dependency Inversion Prinzip (es auf Abstraktionen abhängt, aber nicht auf konkrete Realisierungen), Sie wird es in der Zukunft nicht ändern müssen.

Ausnahmen - wenn es einen Fehler gibt oder wenn Sie die Geschäftslogik von Facade ändern müssen (z. B. die Interaktion zwischen den Subsystemen, die es einkapselt). Aber das ist keine SRP-Verletzung.

Btw scheint, wie es implizit in dem Zitat erwähnt:

Fassade (185) Stellen Sie eine einheitliche Schnittstelle zu einer Reihe von Schnittstellen in einem Subsystem

+0

Ja, das macht Sinn, außer dass die Aufgabe der Fassade darin besteht, die Verbraucher vor Veränderungen in den zugrunde liegenden Systemen zu schützen. Wenn das sich lohnt, bedeutet das nicht, dass diese Systeme komplex genug sind, dass sich sogar ihre Schnittstellen ändern, wenn sie versioniert werden? – goofballLogic

+0

Ich habe verstanden, was du meinst. Ja, wenn Sie die Schnittstelle eines bestimmten Subsystems aktualisieren müssen - dies bedeutet, dass Sie das Interface Separation Principle für diese Schnittstelle verletzt haben. Und vergessen Sie nicht das Open-Closed-Prinzip - es ist besser, die bestehende Schnittstelle/Klasse zu erweitern, als den internen Inhalt zu aktualisieren. Scheint so, als müsstest du alle SOLID-Prinzipien kennen, während du eine neue Klasse konstruierst :) –