Javascript per applicazioni complesse - Lo Stretto digitale

74
LO STRETTO DIGITALE SUMMER TALKS 2013

description

Mentre ogni giorno di più crescono e si fanno sempre più complessi gli ambiti nei quali Javascript si propone (e spesso impone) come strumento di sviluppo, viene da chiedersi se (e quando) si avvererà la legge di Atwood per la quale "ogni applicazione che può essere scritta in Javascript, sarà necessariamente scritta in Javascript". Nell'attesa di scoprirlo meglio prepararsi con vecchi e nuovi patterns e best practices che ci consentono di realizzare software di qualità con uno dei linguaggi più duttili e trasversali di sempre. Presentazione realizzata nell'ambito del progetto "Lo Stretto Digitale"

Transcript of Javascript per applicazioni complesse - Lo Stretto digitale

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