Created by Giacomo Secchi
Beer&Learn - @GetConnected 20/4/2016
Un design pattern è una soluzione software
riutilizzabile per uno specifico tipo di problema
che avviene frequentemente
durante lo sviluppo di un prodotto software
Builder pattern, Prototype pattern, Composite pattern, Facade pattern, Observer pattern, Mediator pattern, ecc. ecc. ecc. ecc. ecc. ecc. ecc. ecc.
Perché?
Anonymous closure, Global import, Object interface Revealing module pattern
Questa è la struttua di un modulo
var Beer = { // Oggetto
pushOrSomething: function () { //public method
GoogleAnalytics.pushOrSomething.apply(this, arguments);
},
anotherOne: function (key) { //altro public method
this.pushOrSomething('action', key);
}
};
Sorge un problema:
il metodo Beer.pushOrSomething()
rimane esposto
Usare una Self-Executing Anonymous Function
var Beer = (function() {
var _pushOrSomething = function () { //private method
GoogleAnalytics.pushOrSomething.apply(this, arguments);
};
var anotherOne = function (key) { //private method
_pushOrSomething('action', key);
};
return {
anotherOne: anotherOne // we've defined what we want to return
};
})();
ATTENZIONE: la differenza fra Object interface e Revealing Module Pattern è molto labile
Object interface: all'interno dell'export (return
) si possono trovare propietà e metodi che implementano le logiche del modulo stesso.
Revealing Module pattern: il return
viene utilizzato esclusivamente per esporre metodi e proprietà all'esterno del modulo
Importiamo librerie esterne
(function ($, YAHOO) {
// now have access to globals jQuery (as $) and YAHOO in this code
}(jQuery, YAHOO));
var Beer = (function($, _) {
var _pushOrSomething = function () { //private method
GoogleAnalytics.pushOrSomething.apply(this, arguments);
};
var anotherOne = function (key) { //private method
_pushOrSomething('action', key);
};
var format = function (el) {
$('.container').html(el);
};
findAleBeers = function () {
list = _pushOrSomething();
_.filter(list, function(item){ return item === 'Ale'; });
}
return {
anotherOne: anotherOne // we've defined what we want to return
};
})( jQuery, _ );
come far interagire più moduli fra di loro
Esempio: Supponiamo di avere un modulo helper, alcune sue funzionalità sono necessare sia sul file cart.js (disponibile solo nella pagina http://miosito.com/cart/) che su account.js (disponibile solo nella pagina http://miosito.com/account/)
file: /helpers.js
var helperModule = (function() {
function logMultipleTimes (n) {
for (i = 0; i < n; i++) {
console.log('La funzione logMultipleTimes è stata chiamata ' + n + ' volte dal modulo Beer');
}
}
return {
logMultipleTimes: logMultipleTimes
};
})();
file: /cart.js
var Cart = (function(h) {
function productsAddedToCart (key) {
// Do some stuff
helperTest();
h.logMultipleTimes(2);
}
function helperTest () {
// Do other stuff
h.logMultipleTimes(6);
}
return {
productsAddedToCart: productsAddedToCart
}
})(helperModule);
file: /account.js
var User = (function(h) {
function logUserName (key) {
// log user credit cards number
h.logMultipleTimes(key);
}
function listCreditCards (key) {
// Do some stuff with my helper and underscore libray
h.logMultipleTimes(_.size(key));
}
return {
logUserName: username
listCreditCards: listCreditCards
}
})(helperModule, _);
User.listCreditCards({one: 1, two: 2, three: 3});
A differenza della Strict augmentation, la Loose augmentation ti permette di caricare i moduli in modo asincrono (ordine a piacere nella chiamata ai files)
var MODULE = (function (my) {
// add capabilities...
return my;
}(MODULE || {}));
var MODULE = (function (my) {
var old_moduleMethod = my.moduleMethod;
my.moduleMethod = function () {
// method override, has access to old through old_moduleMethod...
};
return my;
}(MODULE));
https://carldanley.com/javascript-design-patterns/
http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html -> approfondimento per i test http://www.adequatelygood.com/Writing-Testable-JavaScript.html
http://www.raymondcamden.com/2013/05/13/JavaScript-Design-Patterns-The-Revealing-Module-Pattern/
https://addyosmani.com/resources/essentialjsdesignpatterns/book/
https://medium.freecodecamp.com/javascript-modules-a-beginner-s-guide-783f7d7a5fcc#.k4vjrukps
w2ui.com/web/blog/1/A-Variation-of-JavaScript-Module-Pattern