Vorwort
In diesem Kapitel werden wir das vierte Kapitel der Implementierung der fünf Hauptprinzipien von solidem JavaScript, dem Grenzflächensegregationsprinzip, erklären.
Original Englisch Text: http://freshbrewedcode.com/derekgreeer/2012/01/08/solid-javascript-the-interface-segregation-principle/
Hinweis: Der Autor dieses Artikels ist ziemlich berührend, daher ist der Onkel auch depressiv, um ihn zu verstehen. Lesen Sie es einfach so, wie Sie möchten, bleiben Sie nicht darin.
Die Beschreibung des Prinzips der Schnittstellenisolation lautet:
Die Codekopie lautet wie folgt:
Kunden sollten nicht gezwungen sein, sich auf Methoden zu verlassen, die sie nicht anwenden.
Kunden sollten nicht gezwungen sein, sich auf Methoden zu verlassen, die sie nicht anwenden.
Wenn die Schnittstellenmethode, von der der Benutzer abhängt, nur von anderen Benutzern verwendet wird und sie nicht verwendet, muss diese Schnittstellen implementiert werden. Mit anderen Worten, wenn ein Benutzer auf eine Schnittstelle angewiesen ist, die von anderen Benutzern nicht verwendet, aber von anderen Benutzern verwendet wird, werden alle Benutzer, die sich auf die Schnittstelle verlassen, betroffen. Dies verstößt offensichtlich gegen das Prinzip des Öffnens und Schließens und ist nicht das, was wir erwarten.
Das ISP der Schnittstellenisolierung ist der einzelnen Verantwortung etwas ähnlich. Beide werden verwendet, um funktionale Verantwortlichkeiten zu aggregieren. Tatsächlich kann ISP verstanden werden, um Programme mit einzelnen Verantwortlichkeiten in ein Objekt mit einer öffentlichen Schnittstelle umzuwandeln.
JavaScript -Schnittstelle
Wie halten wir uns an dieses Prinzip unter JavaScript? Immerhin hat JavaScript nicht das Merkmal von Schnittstellen. Wenn die Schnittstelle das ist, was wir durch abstrakte Typen, die von einer bestimmten Sprache bereitgestellt werden, festlegen und entkoppeln möchten, kann gesagt werden, dass es in Ordnung ist, aber JavaScript hat eine andere Form der Schnittstelle. In den Buchentwurfsmuster Elemente der wiederverwendbaren objektorientierten Software haben wir die Definition der Schnittstelle gefunden:
http://www.amazon.com/design-patterns-element-resable-object-oriented/dp/0201633612
Jede von einem Objekt deklarierte Operation enthält einen Betriebsnamen, einen Parameterobjekt und einen Rückgabewert der Operation. Wir nennen es die Unterschrift des Bedieners.
Alle in einem Objekt deklarierten Operationen werden als Schnittstelle dieses Objekts bezeichnet. Die Schnittstelle eines Objekts zeigt alle Anforderungsinformationen, die in diesem Objekt auftreten.
Unabhängig davon, ob eine Sprache ein separates Konstrukt zur Darstellung einer Schnittstelle bereitstellt, haben alle Objekte eine implizite Schnittstelle, die aus allen Eigenschaften und Methoden des Objekts besteht. Siehe den folgenden Code:
Die Codekopie lautet wie folgt:
var Beispielbinder = {};
Beispielbinder.Modelobserver = (function () {
/* Private Variable*/
zurückkehren {
Beobachten Sie: Funktion (Modell) {
/* Code*/
Newmodel zurückgeben;
},
Onchange: Funktion (Rückruf) {
/* Code*/
}
}
}) ();
Beispielbinder.ViewAdaptor = (function () {
/* Private Variable*/
zurückkehren {
BIND: Funktion (Modell) {
/* Code*/
}
}
}) ();
Beispielbinder.bind = Funktion (Modell) {
/* Private Variable*/
Beispielbinder.Modelobserver.onchange (/ * Callback -Rückruf */);
var om = examplebinder.modelobserver.observe (Modell);
Beispielbinder.ViewAdaptor.bind (OM);
kehren om zurück;
};
Die obige Beispielbinderklasse-Bibliothek implementiert eine bidirektionale Bindung. Die von dieser Klassenbibliothek entlarvte öffentliche Schnittstelle ist die Bind -Methode, bei der die in Bind verwendeten Funktionen der Änderungsbenachrichtigung und -ansicht durch separate Objekte modelobserver bzw. ViewAptor implementiert werden. Diese Objekte sind in gewissem Sinne die spezifische Implementierung der öffentlichen Schnittstellenbindungsmethode.
Obwohl JavaScript keine Schnittstellentypen zur Unterstützung von Objektverträgen bereitstellt, kann die implizite Schnittstelle des Objekts den Programmnutzern weiterhin als Vertrag zur Verfügung gestellt werden.
ISP und JavaScript
Einige der nachstehend diskutierten Unterabschnitte sind die Auswirkungen der Verletzung des Prinzips der Schnittstellenisolierung in JavaScript. Wie oben ersichtlich, ist es zwar schade, das Prinzip der Schnittstellenisolierung in JavaScript -Programmen zu implementieren, aber es ist nicht so leistungsfähig wie statisch typisierte Sprachen. Die Sprachmerkmale von JavaScript machen die sogenannte Schnittstelle manchmal zu einem kleinen Stick.
Die Verwirklichung der Verderbtheit
In statisch typisierten Sprachen ist einer der Gründe für die Verletzung der ISP -Prinzipien die entartete Umsetzung. Die in allen Schnittstellen in Java und C# definierten Methoden müssen implementiert werden. Wenn Sie nur einige von ihnen benötigen, müssen auch die anderen Methoden implementiert werden (können durch leere oder werkende Ausnahmen implementiert werden). In JavaScript, wenn nur einige Schnittstellen in einem Objekt benötigt werden, kann es das Problem der degenerierten Implementierung nicht lösen, obwohl es nicht erforderlich ist, die Implementierung der obigen Schnittstelle zu erzwingen. Diese Implementierung verstößt jedoch immer noch gegen das Prinzip des Richterersatzes.
Die Codekopie lautet wie folgt:
var rechteck = {
Bereich: function () {
/* Code*/
},
zeichnen: function () {
/* Code*/
}
};
var GeometryApplication = {
GetLargestrectangle: Funktion (Rechtecke) {
/* Code*/
}
};
var DrawingApplication = {
DrawRectangles: Funktion (Rechtecke) {
/* Code*/
}
};
Wenn eine Rechteck -Alternative zur Befriedigung des GetLargestrectangle der neuen Objektgeometrieanplikation erfüllt ist, benötigt es nur die Rechteckfläche (), die jedoch gegen die LSP verstößt (da sie nicht die Zeichnungsmethode verwenden kann, die nur in der DrawRectangles -Methode verwendet werden kann).
Statische Kupplung
Ein weiterer Grund für ISP -Verstöße in statisch typisierten Sprachen ist die statische Kopplung. In statisch typisierten Sprachen spielen Schnittstellen eine wichtige Rolle in einem locker gekoppelten Designprogramm. Ob in einer dynamischen oder statischen Sprache, manchmal muss ein Objekt möglicherweise zwischen mehreren Kundennutzern kommunizieren (z. B. gemeinsamer Status). Bei statisch typisierten Sprachen besteht die beste Lösung darin, Rollenschnittstellen zu verwenden, wodurch der Benutzer mit dem Objekt interagieren kann (das möglicherweise in mehreren Rollen in mehreren Rollen sein muss), um den Benutzer und das nicht verwandte Verhalten zu entkoppeln. Es gibt kein solches Problem in JavaScript, da Objekte durch die einzigartigen Vorteile dynamischer Sprachen entkoppelt werden.
Semantische Kopplung
Ein häufiger Grund für die Verletzung von ISP ist sowohl dynamische als auch statisch typisierte Sprachen, nämlich semantische Kopplung. Die sogenannte semantische Kopplung ist gegenseitig abhängig, dh das Verhalten eines Objekts hängt von einem anderen Objekt ab, was bedeutet, dass ein Benutzer, wenn es eines der Verhaltensweisen ändert, wahrscheinlich einen anderen Benutzer betrifft. Dies verstößt auch gegen das Prinzip der einzigen Verantwortung. Dieses Problem kann durch Vererbung und Objektsubstitution gelöst werden.
Skalierbarkeit
Ein weiterer Grund für das Problem ist die Skalierbarkeit. Viele Menschen geben Beispiele zum Rückruf an, um Skalierbarkeit zu demonstrieren (z. B. die Rückrufeinstellungen nach dem Erfolg in Ajax). Wenn eine solche Schnittstelle eine Implementierung benötigt und im Ziel dieser Implementierung viele bekannte oder Methoden enthalten sind, wird der ISP sehr wichtig. Das heißt, wenn eine Schnittstellenschnittstelle zu einer Notwendigkeit, viele Methoden zu implementieren, wird ihre Implementierung äußerst komplex und kann diese Schnittstellen dazu führen, dass eine nicht klebrige Verantwortung übernimmt. Dies ist die fette Schnittstelle, die wir oft erwähnen.
Zusammenfassen
Die dynamischen Sprachmerkmale in JavaScript machen unsere Implementierung von nicht spielenden Schnittstellen weniger einflussreich als statisch typisierte Sprachen, aber das Prinzip der Schnittstellenisolation hat immer noch seine Funktion im JavaScript-Programmiermodell.