Das Modulmuster wurde ursprünglich als eine Möglichkeit definiert, sowohl private als auch öffentliche Kapselung für Klassen in konventioneller Softwareentwicklung bereitzustellen.
Wenn Sie mit dem Modulmuster arbeiten, kann es hilfreich sein, eine einfache Vorlage zu definieren, die wir für den Einstieg verwenden. Hier ist eine, die Namensabstände, öffentliche und private Variablen abdeckt.
In JavaScript wird das Modulmuster verwendet, um das Konzept von Klassen weiter zu emulieren, sodass wir sowohl öffentliche / private Methoden als auch Variablen in ein einzelnes Objekt aufnehmen können, wodurch bestimmte Teile vor dem globalen Bereich geschützt werden. Dies führt zu einer Verringerung der Wahrscheinlichkeit, dass unsere Funktionsnamen mit anderen Funktionen in Konflikt stehen, die in zusätzlichen Skripten auf der Seite definiert sind.
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// A private counter variable
myPrivateVar = 0;
// A private function which logs any arguments
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// A public variable
myPublicVar: "foo",
// A public function utilizing privates
myPublicFunction: function( bar ) {
// Increment our private counter
myPrivateVar++;
// Call our private method using bar
myPrivateMethod( bar );
}
};
})();
Vorteile
Warum ist das Modulmuster eine gute Wahl? Für Entwickler ist es zunächst viel sauberer, wenn sie einen objektorientierten Hintergrund haben, als die Idee einer echten Kapselung, zumindest aus JavaScript-Sicht.
Zweitens werden private Daten unterstützt. Im Modulmuster können öffentliche Teile unseres Codes die privaten Teile berühren, die Außenwelt kann jedoch die privaten Teile der Klasse nicht berühren.
Nachteile
Die Nachteile des Modulmusters bestehen darin, dass wir, da wir sowohl auf öffentliche als auch auf private Mitglieder unterschiedlich zugreifen, wenn wir die Sichtbarkeit ändern möchten, tatsächlich Änderungen an jedem Ort vornehmen müssen, an dem das Mitglied verwendet wurde.
Wir können auch nicht auf private Mitglieder in Methoden zugreifen, die dem Objekt zu einem späteren Zeitpunkt hinzugefügt werden . In vielen Fällen ist das Modulmuster jedoch immer noch sehr nützlich und kann bei korrekter Verwendung sicherlich die Struktur unserer Anwendung verbessern.
Das aufschlussreiche Modulmuster
Nachdem wir das Modulmuster etwas besser kennen, schauen wir uns eine leicht verbesserte Version an - das Heilungsmodul von Christian Heilmann.
Das Revealing Module-Muster entstand, als Heilmann frustriert war, dass er den Namen des Hauptobjekts wiederholen musste, wenn wir eine öffentliche Methode von einer anderen aufrufen oder auf öffentliche Variablen zugreifen wollten. Er mochte auch die Anforderung des Modulmusters, wechseln zu müssen, nicht wörtliche Notation für die Dinge zu beanstanden, die er öffentlich machen wollte.
Das Ergebnis seiner Bemühungen war ein aktualisiertes Muster, bei dem wir einfach alle unsere Funktionen und Variablen im privaten Bereich definieren und ein anonymes Objekt mit Zeigern auf die private Funktionalität zurückgeben, die wir als öffentlich offenbaren wollten.
Ein Beispiel für die Verwendung des Revealing Module-Musters finden Sie unten
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
Vorteile
Dieses Muster ermöglicht eine konsistentere Syntax unserer Skripte. Außerdem wird am Ende des Moduls klarer, auf welche unserer Funktionen und Variablen öffentlich zugegriffen werden kann, was die Lesbarkeit erleichtert.
Nachteile
Ein Nachteil dieses Musters besteht darin, dass, wenn sich eine private Funktion auf eine öffentliche Funktion bezieht, diese öffentliche Funktion nicht überschrieben werden kann, wenn ein Patch erforderlich ist. Dies liegt daran, dass die private Funktion weiterhin auf die private Implementierung verweist und das Muster nicht für öffentliche Mitglieder gilt, sondern nur für Funktionen.
Öffentliche Objektmitglieder, die auf private Variablen verweisen, unterliegen ebenfalls den obigen No-Patch-Regelhinweisen.