Il modello del modulo era originariamente definito come un modo per fornire incapsulamento sia pubblico che privato per le classi nell'ingegneria del software convenzionale.
Quando si lavora con il modello del modulo, potrebbe essere utile definire un modello semplice che utilizziamo per iniziare con esso. Eccone uno che copre le variabili di spaziatura, pubbliche e private.
In JavaScript, il modello del modulo viene utilizzato per emulare ulteriormente il concetto di classi in modo tale da poter includere sia metodi pubblici / privati che variabili all'interno di un singolo oggetto, proteggendo in tal modo parti particolari dall'ambito globale. Ciò si traduce in una riduzione della probabilità che i nomi delle nostre funzioni siano in conflitto con altre funzioni definite in script aggiuntivi nella pagina.
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 );
}
};
})();
vantaggi
perché il modello del modulo è una buona scelta? Per i principianti, è molto più pulito per gli sviluppatori che provengono da un background orientato agli oggetti rispetto all'idea del vero incapsulamento, almeno dal punto di vista JavaScript.
In secondo luogo, supporta i dati privati, quindi, nel modello del modulo, le parti pubbliche del nostro codice sono in grado di toccare le parti private, tuttavia il mondo esterno non è in grado di toccare le parti private della classe.
svantaggi
Gli svantaggi del modello del modulo sono che quando accediamo ai membri sia pubblici che privati in modo diverso, quando desideriamo modificare la visibilità, dobbiamo effettivamente apportare modifiche a ogni luogo in cui il membro è stato utilizzato.
Inoltre, non possiamo accedere ai membri privati nei metodi che verranno aggiunti all'oggetto in un secondo momento . Detto questo, in molti casi il modello del modulo è ancora abbastanza utile e, se usato correttamente, ha sicuramente il potenziale per migliorare la struttura della nostra applicazione.
Il modello di modulo rivelatore
Ora che abbiamo un po 'più familiarità con il modello del modulo, diamo un'occhiata a una versione leggermente migliorata - il modello del modulo rivelatore di Christian Heilmann.
Il modello del modulo rivelatore è nato dal momento che Heilmann era frustrato dal fatto che doveva ripetere il nome dell'oggetto principale quando volevamo chiamare un metodo pubblico da un altro o accedere a variabili pubbliche e non gli piaceva il requisito del modello modulo per dover cambiare opporsi alla notazione letterale per le cose che desiderava rendere pubbliche.
Il risultato dei suoi sforzi è stato un modello aggiornato in cui avremmo semplicemente definito tutte le nostre funzioni e variabili nell'ambito privato e restituito un oggetto anonimo con puntatori alla funzionalità privata che desideravamo rivelare come pubblica.
Di seguito è riportato un esempio di come utilizzare il modello del modulo rivelatore
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" );
vantaggi
Questo modello consente alla sintassi dei nostri script di essere più coerente. Inoltre, rende più chiaro alla fine del modulo quali funzioni e variabili sono accessibili pubblicamente per facilitare la leggibilità.
svantaggi
Uno svantaggio di questo modello è che se una funzione privata fa riferimento a una funzione pubblica, tale funzione pubblica non può essere ignorata se è necessaria una patch. Questo perché la funzione privata continuerà a fare riferimento all'implementazione privata e il modello non si applica ai membri pubblici, ma solo alle funzioni.
I membri di oggetti pubblici che fanno riferimento a variabili private sono anche soggetti alle note sulla regola senza patch sopra.