Wzorzec modułu został pierwotnie zdefiniowany jako sposób zapewnienia enkapsulacji zarówno prywatnej, jak i publicznej dla klas w konwencjonalnej inżynierii oprogramowania.
Podczas pracy ze wzorcem modułu może się przydać zdefiniowanie prostego szablonu, którego używamy do rozpoczęcia pracy z nim. Oto jeden, który obejmuje odstępy między nazwami, zmienne publiczne i prywatne.
W JavaScript wzorzec modułu służy do dalszej emulacji koncepcji klas w taki sposób, że jesteśmy w stanie zawrzeć zarówno metody publiczne / prywatne, jak i zmienne w jednym obiekcie, chroniąc w ten sposób poszczególne części przed zasięgiem globalnym. Powoduje to zmniejszenie prawdopodobieństwa konfliktu nazw naszych funkcji z innymi funkcjami zdefiniowanymi w dodatkowych skryptach na stronie.
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 );
}
};
})();
Zalety
dlaczego wzorzec modułu jest dobrym wyborem? Na początek jest o wiele czystszy dla programistów pochodzących z obiektowego tła niż idea prawdziwej enkapsulacji, przynajmniej z perspektywy JavaScript.
Po drugie, obsługuje dane prywatne - więc, zgodnie ze wzorem modułu, części publiczne naszego kodu mogą dotykać części prywatnych, jednak świat zewnętrzny nie jest w stanie dotknąć części prywatnych klasy.
Niedogodności
Wady wzorca modułu polegają na tym, że ponieważ w różny sposób uzyskujemy dostęp zarówno do członków publicznych, jak i prywatnych, gdy chcemy zmienić widoczność, musimy wprowadzić zmiany w każdym miejscu, w którym członek był używany.
Nie możemy również uzyskać dostępu do prywatnych członków metodami dodanymi do obiektu w późniejszym czasie . To powiedziawszy, w wielu przypadkach wzorzec modułu jest nadal bardzo przydatny, a przy prawidłowym użyciu z pewnością może poprawić strukturę naszej aplikacji.
Wzorzec modułu ujawniania
Teraz, gdy jesteśmy trochę bardziej zaznajomieni ze wzorem modułu, spójrzmy na nieco ulepszoną wersję - wzór modułu ujawnienia Christiana Heilmanna.
Wzorzec modułu ujawniania pojawił się, gdy Heilmann był sfrustrowany faktem, że musiał powtórzyć nazwę głównego obiektu, gdy chcieliśmy wywołać jedną metodę publiczną z innej lub uzyskać dostęp do zmiennych publicznych. Nie podobało mu się również wymaganie, by wzorzec modułu wymagał zmiany sprzeciwić się dosłownej notacji rzeczy, które chciał upublicznić.
Rezultatem jego wysiłków był zaktualizowany wzorzec, w którym po prostu zdefiniujemy wszystkie nasze funkcje i zmienne w zakresie prywatnym i zwrócimy anonimowy obiekt ze wskazówkami do funkcji prywatnej, którą chcieliśmy ujawnić jako publiczną.
Przykład użycia wzoru modułu ujawniania znajduje się poniżej
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" );
Zalety
Ten wzorzec pozwala na bardziej spójną składnię naszych skryptów. Ułatwia także na końcu modułu, do których z naszych funkcji i zmiennych można uzyskać dostęp publiczny, co ułatwia czytelność.
Niedogodności
Wadą tego wzorca jest to, że jeśli funkcja prywatna odnosi się do funkcji publicznej, tej funkcji publicznej nie można zastąpić, jeśli łatka jest konieczna. Wynika to z faktu, że funkcja prywatna będzie nadal odnosić się do prywatnej implementacji, a wzorzec nie dotyczy członków publicznych, a jedynie funkcji.
Członkowie obiektów publicznych, którzy odnoszą się do zmiennych prywatnych, podlegają również powyższym uwagom dotyczącym zasady no-patch.