Download - Javascript per applicazioni complesse - Lo Stretto digitale

Transcript
Page 1: Javascript per applicazioni complesse - Lo Stretto digitale

LO STRETTO DIGITALESUMMER TALKS 2013

Page 2: Javascript per applicazioni complesse - Lo Stretto digitale

MESSINA - TORRE DEGLI INGLESI C/O HORCYNUS ORCA - 23/07/2013

JAVASCRIPT PERAPPLICAZIONI

COMPLESSEDESIGN PATTERNS & BEST PRACTICES

/ / Giuseppe PIZZIMENTI @gpizzimenti @strettodigitale

Page 4: Javascript per applicazioni complesse - Lo Stretto digitale

JAVA..CHE?Cos'era ed a cosa serviva Javascript ...fino a 5 minuti

(informatici) fa...

Page 5: Javascript per applicazioni complesse - Lo Stretto digitale
Page 6: Javascript per applicazioni complesse - Lo Stretto digitale

ALCUNI FATTI SU JAVASCRIPT...Sviluppato da una sola persona ( ) in 10 giorniSintassi come il CInterpretato come BasicDinamico come PythonFunzionale come SchemeAd oggetti ...ma senza classi! (come Perl)...ed ha Java nel nome!

@BrendanEich

Page 7: Javascript per applicazioni complesse - Lo Stretto digitale

https://www.destroyallsoftware.com/talks/wat

Page 8: Javascript per applicazioni complesse - Lo Stretto digitale

...ED ALCUNI, ALTRI, FATTI...

Page 9: Javascript per applicazioni complesse - Lo Stretto digitale

OGGETTI IN JAVA

Page 10: Javascript per applicazioni complesse - Lo Stretto digitale

public class Point { private int x = 0; private int y = 0; //constructor public Point(int a, int b) { x = a; y = b; } public int sumXY() { return x+y; } }

Point origin = new Point(23, 94); out.print(origin.sumXY());

Page 11: Javascript per applicazioni complesse - Lo Stretto digitale

OGGETTI IN JAVASCRIPT

Page 12: Javascript per applicazioni complesse - Lo Stretto digitale

var point = {};

point.x = 23;point.y = 94;

point.sumXY = function() { return this.x + this.y;

};

alert(point.sumXY());

Page 13: Javascript per applicazioni complesse - Lo Stretto digitale

INSTALLAZIONE

Page 14: Javascript per applicazioni complesse - Lo Stretto digitale
Page 15: Javascript per applicazioni complesse - Lo Stretto digitale
Page 16: Javascript per applicazioni complesse - Lo Stretto digitale

AGGIORNAMENTO

Page 17: Javascript per applicazioni complesse - Lo Stretto digitale
Page 18: Javascript per applicazioni complesse - Lo Stretto digitale
Page 19: Javascript per applicazioni complesse - Lo Stretto digitale

SVILUPPO

Page 20: Javascript per applicazioni complesse - Lo Stretto digitale
Page 21: Javascript per applicazioni complesse - Lo Stretto digitale
Page 22: Javascript per applicazioni complesse - Lo Stretto digitale

...INTANTO, LÀ FUORI...

Page 23: Javascript per applicazioni complesse - Lo Stretto digitale
Page 24: Javascript per applicazioni complesse - Lo Stretto digitale
Page 25: Javascript per applicazioni complesse - Lo Stretto digitale
Page 26: Javascript per applicazioni complesse - Lo Stretto digitale
Page 27: Javascript per applicazioni complesse - Lo Stretto digitale
Page 28: Javascript per applicazioni complesse - Lo Stretto digitale
Page 29: Javascript per applicazioni complesse - Lo Stretto digitale

LA LEGGE DI ATWOODCos'è ed a cosa serve Javascript ...ora!

Page 30: Javascript per applicazioni complesse - Lo Stretto digitale

“any application that can be written inJavaScript, will eventually be written in

JavaScript”

Jeff Atwood, 17/07/2007

Page 31: Javascript per applicazioni complesse - Lo Stretto digitale

http://www.codinghorror.com/blog/2007/07/the-principle-of-least-power.html

Page 32: Javascript per applicazioni complesse - Lo Stretto digitale
Page 33: Javascript per applicazioni complesse - Lo Stretto digitale

FACCIAMO UN PÒ D'ORDINE..

Page 34: Javascript per applicazioni complesse - Lo Stretto digitale

NAMESPACING

Page 35: Javascript per applicazioni complesse - Lo Stretto digitale

var coord = 0;

.

.

. var showCoord = function() {

var coord = 1; alert(coord);

};

Page 36: Javascript per applicazioni complesse - Lo Stretto digitale

var myApp = {};

myApp.coord = 0;

myApp.data.coords.x = 0;

myApp.utils.geo.setCoords = function(x,y){

myApp.data.coords.x = x; myApp.data.coords.y = y;

}; ;

myApp.utils.geo.setCoords(10,10);

Page 37: Javascript per applicazioni complesse - Lo Stretto digitale

//Flyweight;

myApp.utils.geo.processCoords(myApp.data.coords);

myApp.utils.geo.processCoords = function(coords){

process(coords.x,coords.y);

}; ;

Page 38: Javascript per applicazioni complesse - Lo Stretto digitale

IIFE & REVEALING MODULE

Page 39: Javascript per applicazioni complesse - Lo Stretto digitale

//IIFE: Immediately invoked Function Expression

(function() { // scope}());

Page 40: Javascript per applicazioni complesse - Lo Stretto digitale

// Revealing Module Pattern

var myApp.utils.geo = (function() { //private var x = 0, y = 0, set = function(coordx,coordy) { x = coordx; y = coordy; }; // public return { setCoords: set };}());

myApp.utils.geo.setCoords(10,10);

Page 41: Javascript per applicazioni complesse - Lo Stretto digitale

REQUIRE.JSHTTP://REQUIREJS.ORG/

Page 42: Javascript per applicazioni complesse - Lo Stretto digitale

// File Name: utils/geo.js // per convenzione , il nome del modulo è quello del filedefine( [ "underscore", "jquery" ], // dipendenze function( _, $ ) { /* Callback : i parametri corrispondono alle dipendenze richieste */ . . . // public return { setCoords: set };});

Page 43: Javascript per applicazioni complesse - Lo Stretto digitale

require( [ "utils/geo" ], function( geo ) { geo.setCoords(10,10); });

Page 44: Javascript per applicazioni complesse - Lo Stretto digitale

<script src="./libs/require.min.js" data-main="./js/main"></script>

Page 45: Javascript per applicazioni complesse - Lo Stretto digitale

/* main.js */ require.config({ paths: { "jquery": "../libs/jquery.min", "underscore": "../libs/underscore.min" }, shim: { // Underscore.js non è un modulo AMD underscore: { exports: "_" } }});

Page 46: Javascript per applicazioni complesse - Lo Stretto digitale

L'IMPORTANZA DEL DIALOGO

Page 47: Javascript per applicazioni complesse - Lo Stretto digitale

$('div#coords li').each(function(el) { var $el = $(el); $el.on('click', function(e) { var jsonUrl = "myData.jsp?id=" + $el.attr("id"); $.get(jsonUrl, function(data) { $(el).text(data.result); }) });});

Page 48: Javascript per applicazioni complesse - Lo Stretto digitale

MEDIATOR

Page 49: Javascript per applicazioni complesse - Lo Stretto digitale

var myApp = {};

myApp.mediator = $({});

myApp.mediator.on("myApp:loadData", function(e,id) { var jsonUrl = "myData.jsp?id=" + id; $.get(jsonUrl, function(data) { myApp.mediator.trigger('myApp:dataLoaded', data, id); }) })

myApp.mediator.on("myApp:dataLoaded", function(e, data, id) { $('div#coords').find('li[id="' + id+ '"]'.text(data.result); })

$('div#coords li').on("click", function(e) { myApp.mediator.trigger('myApp:loadData',$(e.currentTarget).attr("id")); })

Page 50: Javascript per applicazioni complesse - Lo Stretto digitale

DIVIDIAMOCI I COMPITI

Page 51: Javascript per applicazioni complesse - Lo Stretto digitale

[ { "id":"1", "title":"Code Complete", "author":"Steve McConnell" }, { "id":"2", "title":"JavaScript: The Good Parts", "author":"Douglas Crockford" }, { "id":"3", "title":"The Mythical Man-Month", "author":"Fred Brooks" }]

Page 52: Javascript per applicazioni complesse - Lo Stretto digitale

TEMPLATE

Page 53: Javascript per applicazioni complesse - Lo Stretto digitale

UNDERSCORE.JSHTTP://UNDERSCOREJS.ORG/

Page 54: Javascript per applicazioni complesse - Lo Stretto digitale

// Template<script id="tmpl-books" type="text/template">

</script>

<ul> <% for (var i = 0; i < books.length; i++) { %> <% var book = books[i]; %> <li> <em><%= book.title %></em> di <%= book.author %> </li> <% } %> </ul>

Page 55: Javascript per applicazioni complesse - Lo Stretto digitale

var tmplMarkup = $('#tmpl-books').html();

var compiledTmpl = _.template(tmplMarkup, { books : data });

$('#target').html(compiledTmpl);

Page 56: Javascript per applicazioni complesse - Lo Stretto digitale

<ul> <li><em>Code Complete</em> di Steve McConnell</li> <li><em>JavaScript: The Good Parts</em> di Douglas Crockford</li> <li><em>The Mythical Man-Month</em> di Fred Brooks</li></ul>

Page 57: Javascript per applicazioni complesse - Lo Stretto digitale

MVC ED I SUOI FRATELLI

Page 58: Javascript per applicazioni complesse - Lo Stretto digitale

MODEL : Rappresenta i dati e la logica utile per recuperarlie manipolarli

VIEW : Visualizza i dati e interagisce con il fruitore

CONTROLLER : Riceve i comandi del fruitore e li attuamodificando lo stato degli altri due componenti

Page 59: Javascript per applicazioni complesse - Lo Stretto digitale
Page 60: Javascript per applicazioni complesse - Lo Stretto digitale
Page 61: Javascript per applicazioni complesse - Lo Stretto digitale
Page 62: Javascript per applicazioni complesse - Lo Stretto digitale

BACKBONE.JSHTTP://BACKBONEJS.ORG/

Page 63: Javascript per applicazioni complesse - Lo Stretto digitale

JSON

[ { "id":"1", "title":"Code Complete", "author":"Steve McConnell" }, { "id":"2", "title":"JavaScript: The Good Parts", "author":"Douglas Crockford" }, { "id":"3", "title":"The Mythical Man-Month", "author":"Fred Brooks" }]

Page 64: Javascript per applicazioni complesse - Lo Stretto digitale

MODEL

myLib.models.libro = Backbone.Model.extend({ defaults: { id: _.uniqueId(), title: null, author: null }});

Page 65: Javascript per applicazioni complesse - Lo Stretto digitale

COLLECTION

myLib.collections.libri = Backbone.Collection.extend({ url: myLib.settings.urls.services.libri , model: myLib.models.libro, , sortField: 'id' // default , comparator: function(item) { return item.get(this.sortField); } , sortByField: function(fieldName) { this.sortField = fieldName; this.sort(); } });

Page 66: Javascript per applicazioni complesse - Lo Stretto digitale

"VIEW"

myLib.views.libri = Backbone.View.extend({ template: myLib.templates.libri,

initialize: function() { var _this = this; _.bindAll( _this, "render" , "openBook"); this.listenTo(this.collection,"sort",this.render); }, events: { "click .libro": 'openBook' } , render: function() { var html = this.template({ books: this.collection.toJSON() }); this.$el.find( ".main" ).html( html ); }, openBook: function(e) { document.location.href="#libro:" + $(e.currentTarget()).attr("data-id"); } });

Page 67: Javascript per applicazioni complesse - Lo Stretto digitale

TEMPLATE

myLib.templates.libri = _.template([ '<ul>', '<% for (var i = 0; i < books.length; i++) { %>', '<% var book = books[i]; %>', '<li>', '<em><a href="myPage?id=<%= book.id %>" class="roll"><span data-title="', '<%= book.title %>">', '<%= book.title %></span></a></em>', ' di <%= book.author %>', '</li>', '<% } %>', '</ul>'].join(''));

Page 68: Javascript per applicazioni complesse - Lo Stretto digitale

"CONTROLLER"

myLib.modules.libri = function(ns){ var _main = function(opts) { var membri = new ns.collections.libri(); membri.fetch({success: function(){_render(membri,opts)}}), }; var _render = function(data,opts) { if (options && options.sort) membri.sortByField(options.sort); else membri.sortByField("title"); var libriView = new ns.views.libri({ collection: data, el: $("div.container") }); libriView.render(); }; return { run: function(opts){_main(opts);} }; }(myLib);

Page 69: Javascript per applicazioni complesse - Lo Stretto digitale

ROUTER

myLib.router = Backbone.Router.extend({ routes: { "/libri/sort:p_sort": "showBooks" } , showBooks: function(p_sort) { myLib.modules.libri.run(p_sort); } });

Page 70: Javascript per applicazioni complesse - Lo Stretto digitale

..ANCORA NON M'È CHIARO...

Page 71: Javascript per applicazioni complesse - Lo Stretto digitale

( )http://eloquentjavascript.net/ @marijnjh

Page 72: Javascript per applicazioni complesse - Lo Stretto digitale

( )

http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/@addyosmani

Page 73: Javascript per applicazioni complesse - Lo Stretto digitale

( )

http://addyosmani.github.io/backbone-fundamentals/@addyosmani

Page 74: Javascript per applicazioni complesse - Lo Stretto digitale

THAT'S ALL FOLKS!LO STRETTO DIGITALE - SUMMER TALKS 2013 - #LOSTRETTODIGITALE