SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
Google Closure visto da vicino
             Davide Ficano

        davide.ficano@gmail.com


      GTUG, Palermo, Gennaio, 2010
Google, API e licenze
●   Ogni applicazione rilasciata da Google e'
    accessibile tramite API

●   Quasi tutte le applicazioni dispongono di API
    pubbliche e documentate

●   Le API generalmente non hanno licenze open
    source
Google Closure
Nel Novembre 2009 Google presenta Closure

●   E' Open Source (Apache license 2.0)

●   Contiene gli stessi strumenti utilizzati per
    sviluppare le applicazioni Google
Cosa fa Closure
Lo sviluppo di applicazioni Enterprise lato client rende
difficoltoso

●   gestire la dipendenza tra moduli JS
●   ottimizzare il codice prodotto
●   gestire la generazione dinamica delle pagine
Quali strumenti
Closure e' composto da tre elementi, ognuno dei
quali e' utilizzabile indipendente dall'altro

●   Closure Library
●   Closure Compiler
●   Closure Template
Closure Library
             Javascript Standard Library
Il sogno di una STL/JDK anche per Javascript

●   Concentrare le energie sullo sviluppo dell'applicazione e
    non sui task ripetitivi

●   Server agnostic, deploy della libreria in modo semplice

●   Cross browser compatibile, sempre lo stesso problema
Closure Library
                    cosa contiene
Contiene centinaia di classi che coprono le piu' disparate
aree

●   goog.dom.*
●   goog.json.*
●   goog.css.*
●   goog.net.*
●   goog.graphics.* (HTML5 canvas)
Closure Library
                  il valore aggiunto
Il considerevole numero di classi fornite è
paradossalmente l'elemento meno interessante di
Closure Library.

Il vero valore aggiunto è dato da

 ● Alta leggibilità del codice scritto
 ● Alta integrabilità con IDE

 ● Documentazione ed esempi disponibili



 ● Inclusione dinamica delle sole classi referenziate
 ● Controllo delle dipendenze tra script
Closure Library
                            Inclusione dinamica
                                            base.js

  ● Ogni applicazione deve includere via tag <script/>
    soltanto il file base.js
  ●
    base.js rende disponibili due metodi(*)
    ● goog.require(name)

    ● goog.provide(name)




(*) Comprende anche altri metodi la cui trattazione non risulta pertinente in questo contesto
Closure Library
                        goog.require()
 
goog.require('goog.dom');
 
                                                   hello.js
 function createHello() {
   goog.dom.createDom('h1', {
         'style': 'background-color:#EEE'},
         'Hello world!');
 }


<html>
    <head>
                                                       hello.html
        <script src="closure/goog/base.js"></script> 
    
        <script src="hello.js"></script>
    </head>
    <body onload="createHello()">
    </body>
 
</html>
Closure Library
                           goog.provide()

// Presenti in dom.js
                                          Le classi definite in dom.js
 
goog.provide('goog.dom');
                                          Vengono dichiarate tramite provide
  
goog.provide('goog.dom.DomHelper');
   
goog.provide('goog.dom.NodeType');


goog.require('goog.array');
 
...
  
...
                                         Le classi da cui dom.js dipende
   
goog.require('goog.userAgent');      Vengono dichiarate tramite require


goog.dom.getDocument = function() { 
  return document; 
};
Closure Library
                  Gestione dipendenze
                              deps.js

● base.js “carica” il file deps.js che contiene la lista di tutte
  le dipendenze presenti in Library
● deps.js contiene il mapping tra nome modulo e nome

  file, le classi che fornisce e le classi da cui dipende


// require('goog.dom')


goog.addDependency('dom/dom.js',            // percorso file    

   ['goog.dom', ..., 'goog.dom.NodeType'],   // classi fornite
   ['goog.array', ..., 'goog.userAgent']);   // classi richieste
Closure Library
      Gestione dipendenze per i propri file
                         calcdeps.py

La scrittura di propri moduli conformi a Closure Library
richiede la creazione di un proprio “deps.js”

Nei file della distribuzione di Library e' presente lo script
Python calcdeps.py

calcdeps.py fa il parsing dei file sorgenti alla ricerca delle
dichiarazioni goog.require()/goog.provide() e crea un file
con l'albero delle dipendenze
Closure Library
               documentazione e testing
Al suo interno Library usa strumenti diventati uno
standard de facto nella comunità Javascript.

●   JSDoc - http://code.google.com/p/jsdoc-toolkit/

●   JSUnit - http://www.jsunit.net/
Closure Compiler
                   Cosa non fa

●   Non produce codice macchina!

                     Cosa fa

● Ottimizza il codice
● Segnala errori e warning

● Analizza le dipendenze “at compile time”

● Offre strumenti di debug e test
Closure Compiler
                       come usarlo
E' possibile usare Compiler tramite

 ●   Applicazione Java a linea di comando
     Facilita l'automazione di build process

 ●   Applicazione web
     http://closure-compiler.appspot.com/home

 ●   API RESTful
Closure Compiler
                          ottimizzazioni
Sono disponibili tre livelli di ottimizzazione.
Ogni livello comprende le ottimizzazioni dei livelli inferiori

 1.WHITESPACE_ONLY
      Elimina gli spazi e gli “a capo”
 2.SIMPLE_OPTIMIZATIONS
      Il default, rinomina variabili locali e funzioni con nomi “corti”
 3.ADVANCED_OPTIMIZATIONS
     Effettua l'inline delle funzioni, molto aggressivo può produrre
  codice non funzionante se non si rispettano alcuni vincoli
Closure Compiler
SIMPLE_OPTIMIZATIONS
Closure Compiler
ADVANCED_OPTIMIZATIONS
Closure Compiler
     Alla fiera delle follie dell'ottimizzatore 1
Si supponga di avere il costruttore
function ctor() {
   
 this.name = "";

}



Utilizzando il livello di ottimizzazione Simple tutto va bene

Utilizzando il livello Advanced invece...
Closure Compiler
     Alla fiera delle follie dell'ottimizzatore 1
… si ottiene un warning sull'uso globale di this.

Per compilare senza warning e' necessario dire, tramite
JSDoc, che la funzione e' un costruttore

/**
    * @constructor
    */

function ctor() {
    
 this.name = "";
 
}
Closure Compiler
    Alla fiera delle follie dell'ottimizzatore 2
Si supponga di avere il seguente frammento di codice


alert(typeof f); // print "undefined"

var f = function (){};



Utilizzando il livello di ottimizzazione Simple il codice
rimane inalterato

Utilizzando il livello Advanced invece...
Closure Compiler
    Alla fiera delle follie dell'ottimizzatore 2
… il frammento di codice
alert(typeof f); // print "undefined"

var f = function (){};

Viene trasformato in

alert(typeof a); // print "function"
 
function a(){};

Contestualmente si ottiene un warning su f non definita

Viene stravolto il significato del codice originale!!!
Closure Compiler
    Alla fiera delle follie dell'ottimizzatore 3
Si supponga di avere il seguente frammento di codice

function f(a, b) {
 
 b = typeof(b) == "undefined" ? 1 : b;
  
}

f(1); // al parametro b viene dato un valore di default

Utilizzando il livello di ottimizzazione Simple il codice
generato risulta essere

function f(){}f(1);


Utilizzando il livello Advanced invece...
Closure Compiler
     Alla fiera delle follie dell'ottimizzatore 3
… si ottiene un warning sulla mancanza di un valore per
b ma non c'e' nessun codice generato

La soluzione consiste nel dire, tramite JSDoc, che b e'
opzionale

/**
   
* @param a
    
* @param {string} [b="hello"]
     
*/
 
function f(a, b) { 
}


f(1);
Closure Templates
                        Tofu e Soy
Closure Templates è un sistema di templating che facilita
la scrittura di elementi di interfaccia utente dinamici

 ●   Nasce per creare frammenti di elementi grafici invece
     di monolitici template per pagina

 ●   “A tool, not a framework” come riportato nella
     documentazione ufficiale; "coabita" insieme ad altri
     ambienti, librerie e framework

 ●   La sintassi del linguaggio SOY è semplice ed intuitiva
     e comprende i comuni costrutti di un linguaggio;
     iterazione, espressioni condizionali
Closure Templates
                         Tofu e Soy
●   Lo stesso template può essere utilizzato sia lato client
    che server (Java)

●   I templates vengono compilati in codice Javascript
    efficiente (SoyToJsSrcCompiler / SoyParseInfoGenerator )
●   Nessuna dipendenza da Compiler e Library,
    l'integrazione con Library va esplicitamente attivata in
    fase di compilazione (shouldProvideRequireSoyNamespaces)
●   Estendibile tramite plugin Java (come una tag library)
Closure Templates
                       Un esempio

/**
  * Greets a person using "Hello" by default. 

  * @param name The name of the person. 

  * @param? greetingWord Optional greeting word to
  * use instead of "Hello".
  */
  
{template .helloName}
     {if not $greetingWord}
        Hello {$name}!
     {else} 
    
        {$greetingWord} {$name}!
     {/if}
  {/template}
Tools
                  Integrazione Firebug
●   Closure Inspector viene utilizzata per debug e test
    integration.
    ● Attraverso dei file di source mapping (generati con

      Compiler) permette di fare debug partendo dal codice
      compilato
    ● Mostra un migliore stack trace

    ● Eseguendo le unit test mostra le assert che falliscono



●   Page Speed viene utilizzata per misurare tempi di
    risposta di una pagina
    ● Fornisce indicazioni su come ottimizzare la pagina
Conclusioni


    Pro

   Contro
Conclusioni
                             Pro
●   E' Open Source

●   E' una libreria Javascript scritta da programmatori Java
    ● package razionali e con bassa interdipendenza



●   Documentazione e supporto

●   Incoraggia l'utilizzo di good software engineering
    practices
    ● Documentare con JSDoc

    ● Scrivere test unit con JSUnit



●   Closure Compiler generalmente migliore di YUI
    Compressor
Conclusioni
                           Contro
●   E' una libreria Javascript scritta da programmatori Java

●   A discapito del nome, le closure Javascript sono
    sottoutilizzate (vedi Jquery)

●   Troppe operazioni command line come calcdeps.py

●   L'ottimizzazione advanced e' inutilizzabile

●   Non esiste un CSS compiler
Closure Visto Da Vicino
Closure Visto Da Vicino
Closure Visto Da Vicino

Contenu connexe

Tendances

High Performance Web Apps con PHP e Symfony 2
High Performance Web Apps con PHP  e Symfony 2High Performance Web Apps con PHP  e Symfony 2
High Performance Web Apps con PHP e Symfony 2Giorgio Cefaro
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummiesfirenze-gtug
 
RESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineRESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineGiancarlo Valente
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Giancarlo Valente
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8Valerio Radice
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Ivan Gualandri
 
Modern web development with python and Web2py
Modern web development with python and Web2pyModern web development with python and Web2py
Modern web development with python and Web2pyDavide Marzioni
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationTiziano Serritella
 
Lezione 6a: Design Pattern Strutturali
Lezione 6a: Design Pattern StrutturaliLezione 6a: Design Pattern Strutturali
Lezione 6a: Design Pattern StrutturaliAndrea Della Corte
 
Lezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliLezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliAndrea Della Corte
 
Lezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme ProgrammingLezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme ProgrammingAndrea Della Corte
 

Tendances (20)

High Performance Web Apps con PHP e Symfony 2
High Performance Web Apps con PHP  e Symfony 2High Performance Web Apps con PHP  e Symfony 2
High Performance Web Apps con PHP e Symfony 2
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummies
 
Corso Javascript
Corso JavascriptCorso Javascript
Corso Javascript
 
App Engine + Python
App Engine + PythonApp Engine + Python
App Engine + Python
 
Corso progettazione
Corso progettazioneCorso progettazione
Corso progettazione
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
Java Advanced
Java AdvancedJava Advanced
Java Advanced
 
RESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachineRESTful APIs (ITA) - /w WebMachine
RESTful APIs (ITA) - /w WebMachine
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4
 
Javascript
JavascriptJavascript
Javascript
 
Modern web development with python and Web2py
Modern web development with python and Web2pyModern web development with python and Web2py
Modern web development with python and Web2py
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
 
Lezione 6a: Design Pattern Strutturali
Lezione 6a: Design Pattern StrutturaliLezione 6a: Design Pattern Strutturali
Lezione 6a: Design Pattern Strutturali
 
Lezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliLezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern Strutturali
 
Lezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme ProgrammingLezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme Programming
 

Similaire à Closure Visto Da Vicino

Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazioneDaniele Costarella
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerMatteo Magni
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Marco Chiesi
 
Introduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIntroduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIvan Gualandri
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsCommit University
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiMarco Gasparetto
 
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013Massimo Caliman
 

Similaire à Closure Visto Da Vicino (20)

Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazione
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Logging
LoggingLogging
Logging
 
Linuxday2013
Linuxday2013 Linuxday2013
Linuxday2013
 
GNU Linux Programming introduction
GNU Linux Programming introductionGNU Linux Programming introduction
GNU Linux Programming introduction
 
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continuaDDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Spring e Flex
Spring e FlexSpring e Flex
Spring e Flex
 
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
Sviluppare un plugin WordPress da zero - WordCamp Bologna 2018
 
Introduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIntroduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulug
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Guida C++
Guida C++Guida C++
Guida C++
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step Functions
 
Js intro
Js introJs intro
Js intro
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessi
 
Grasso Frameworks Ajax
Grasso Frameworks AjaxGrasso Frameworks Ajax
Grasso Frameworks Ajax
 
Google AppEngine
Google AppEngineGoogle AppEngine
Google AppEngine
 
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
 

Dernier

Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIinfogdgmi
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 

Dernier (9)

Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
ScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AIScrapeGraphAI: a new way to scrape context with AI
ScrapeGraphAI: a new way to scrape context with AI
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 

Closure Visto Da Vicino

  • 1. Google Closure visto da vicino Davide Ficano davide.ficano@gmail.com GTUG, Palermo, Gennaio, 2010
  • 2. Google, API e licenze ● Ogni applicazione rilasciata da Google e' accessibile tramite API ● Quasi tutte le applicazioni dispongono di API pubbliche e documentate ● Le API generalmente non hanno licenze open source
  • 3. Google Closure Nel Novembre 2009 Google presenta Closure ● E' Open Source (Apache license 2.0) ● Contiene gli stessi strumenti utilizzati per sviluppare le applicazioni Google
  • 4. Cosa fa Closure Lo sviluppo di applicazioni Enterprise lato client rende difficoltoso ● gestire la dipendenza tra moduli JS ● ottimizzare il codice prodotto ● gestire la generazione dinamica delle pagine
  • 5. Quali strumenti Closure e' composto da tre elementi, ognuno dei quali e' utilizzabile indipendente dall'altro ● Closure Library ● Closure Compiler ● Closure Template
  • 6. Closure Library Javascript Standard Library Il sogno di una STL/JDK anche per Javascript ● Concentrare le energie sullo sviluppo dell'applicazione e non sui task ripetitivi ● Server agnostic, deploy della libreria in modo semplice ● Cross browser compatibile, sempre lo stesso problema
  • 7. Closure Library cosa contiene Contiene centinaia di classi che coprono le piu' disparate aree ● goog.dom.* ● goog.json.* ● goog.css.* ● goog.net.* ● goog.graphics.* (HTML5 canvas)
  • 8. Closure Library il valore aggiunto Il considerevole numero di classi fornite è paradossalmente l'elemento meno interessante di Closure Library. Il vero valore aggiunto è dato da ● Alta leggibilità del codice scritto ● Alta integrabilità con IDE ● Documentazione ed esempi disponibili ● Inclusione dinamica delle sole classi referenziate ● Controllo delle dipendenze tra script
  • 9. Closure Library Inclusione dinamica base.js ● Ogni applicazione deve includere via tag <script/> soltanto il file base.js ● base.js rende disponibili due metodi(*) ● goog.require(name) ● goog.provide(name) (*) Comprende anche altri metodi la cui trattazione non risulta pertinente in questo contesto
  • 10. Closure Library goog.require() 
goog.require('goog.dom'); 
 hello.js function createHello() { goog.dom.createDom('h1', { 'style': 'background-color:#EEE'}, 'Hello world!'); } 
<html> <head> hello.html <script src="closure/goog/base.js"></script> 
     <script src="hello.js"></script> </head> <body onload="createHello()"> </body> 
</html>
  • 11. Closure Library goog.provide() 
// Presenti in dom.js Le classi definite in dom.js 
goog.provide('goog.dom'); Vengono dichiarate tramite provide 
goog.provide('goog.dom.DomHelper'); 
goog.provide('goog.dom.NodeType'); 
goog.require('goog.array'); 
... 
... Le classi da cui dom.js dipende 
goog.require('goog.userAgent'); Vengono dichiarate tramite require 
goog.dom.getDocument = function() { 
  return document; 
};
  • 12. Closure Library Gestione dipendenze deps.js ● base.js “carica” il file deps.js che contiene la lista di tutte le dipendenze presenti in Library ● deps.js contiene il mapping tra nome modulo e nome file, le classi che fornisce e le classi da cui dipende 
// require('goog.dom') 
goog.addDependency('dom/dom.js', // percorso file 
   ['goog.dom', ..., 'goog.dom.NodeType'], // classi fornite ['goog.array', ..., 'goog.userAgent']); // classi richieste
  • 13. Closure Library Gestione dipendenze per i propri file calcdeps.py La scrittura di propri moduli conformi a Closure Library richiede la creazione di un proprio “deps.js” Nei file della distribuzione di Library e' presente lo script Python calcdeps.py calcdeps.py fa il parsing dei file sorgenti alla ricerca delle dichiarazioni goog.require()/goog.provide() e crea un file con l'albero delle dipendenze
  • 14. Closure Library documentazione e testing Al suo interno Library usa strumenti diventati uno standard de facto nella comunità Javascript. ● JSDoc - http://code.google.com/p/jsdoc-toolkit/ ● JSUnit - http://www.jsunit.net/
  • 15. Closure Compiler Cosa non fa ● Non produce codice macchina! Cosa fa ● Ottimizza il codice ● Segnala errori e warning ● Analizza le dipendenze “at compile time” ● Offre strumenti di debug e test
  • 16. Closure Compiler come usarlo E' possibile usare Compiler tramite ● Applicazione Java a linea di comando Facilita l'automazione di build process ● Applicazione web http://closure-compiler.appspot.com/home ● API RESTful
  • 17. Closure Compiler ottimizzazioni Sono disponibili tre livelli di ottimizzazione. Ogni livello comprende le ottimizzazioni dei livelli inferiori 1.WHITESPACE_ONLY Elimina gli spazi e gli “a capo” 2.SIMPLE_OPTIMIZATIONS Il default, rinomina variabili locali e funzioni con nomi “corti” 3.ADVANCED_OPTIMIZATIONS Effettua l'inline delle funzioni, molto aggressivo può produrre codice non funzionante se non si rispettano alcuni vincoli
  • 20. Closure Compiler Alla fiera delle follie dell'ottimizzatore 1 Si supponga di avere il costruttore function ctor() { 
 this.name = ""; 
} Utilizzando il livello di ottimizzazione Simple tutto va bene Utilizzando il livello Advanced invece...
  • 21. Closure Compiler Alla fiera delle follie dell'ottimizzatore 1 … si ottiene un warning sull'uso globale di this. Per compilare senza warning e' necessario dire, tramite JSDoc, che la funzione e' un costruttore /** * @constructor */ 
function ctor() { 
 this.name = ""; 
}
  • 22. Closure Compiler Alla fiera delle follie dell'ottimizzatore 2 Si supponga di avere il seguente frammento di codice alert(typeof f); // print "undefined" 
var f = function (){}; Utilizzando il livello di ottimizzazione Simple il codice rimane inalterato Utilizzando il livello Advanced invece...
  • 23. Closure Compiler Alla fiera delle follie dell'ottimizzatore 2 … il frammento di codice alert(typeof f); // print "undefined" 
var f = function (){}; Viene trasformato in 
alert(typeof a); // print "function" 
function a(){}; Contestualmente si ottiene un warning su f non definita Viene stravolto il significato del codice originale!!!
  • 24. Closure Compiler Alla fiera delle follie dell'ottimizzatore 3 Si supponga di avere il seguente frammento di codice 
function f(a, b) { 
 b = typeof(b) == "undefined" ? 1 : b; 
} f(1); // al parametro b viene dato un valore di default Utilizzando il livello di ottimizzazione Simple il codice generato risulta essere function f(){}f(1); Utilizzando il livello Advanced invece...
  • 25. Closure Compiler Alla fiera delle follie dell'ottimizzatore 3 … si ottiene un warning sulla mancanza di un valore per b ma non c'e' nessun codice generato La soluzione consiste nel dire, tramite JSDoc, che b e' opzionale 
/** 
* @param a 
* @param {string} [b="hello"] 
*/ 
function f(a, b) { 
} 
f(1);
  • 26. Closure Templates Tofu e Soy Closure Templates è un sistema di templating che facilita la scrittura di elementi di interfaccia utente dinamici ● Nasce per creare frammenti di elementi grafici invece di monolitici template per pagina ● “A tool, not a framework” come riportato nella documentazione ufficiale; "coabita" insieme ad altri ambienti, librerie e framework ● La sintassi del linguaggio SOY è semplice ed intuitiva e comprende i comuni costrutti di un linguaggio; iterazione, espressioni condizionali
  • 27. Closure Templates Tofu e Soy ● Lo stesso template può essere utilizzato sia lato client che server (Java) ● I templates vengono compilati in codice Javascript efficiente (SoyToJsSrcCompiler / SoyParseInfoGenerator ) ● Nessuna dipendenza da Compiler e Library, l'integrazione con Library va esplicitamente attivata in fase di compilazione (shouldProvideRequireSoyNamespaces) ● Estendibile tramite plugin Java (come una tag library)
  • 28. Closure Templates Un esempio 
/** * Greets a person using "Hello" by default. 
  * @param name The name of the person. 
  * @param? greetingWord Optional greeting word to  * use instead of "Hello". */ 
{template .helloName} {if not $greetingWord} Hello {$name}! {else} 
     {$greetingWord} {$name}! {/if} {/template}
  • 29. Tools Integrazione Firebug ● Closure Inspector viene utilizzata per debug e test integration. ● Attraverso dei file di source mapping (generati con Compiler) permette di fare debug partendo dal codice compilato ● Mostra un migliore stack trace ● Eseguendo le unit test mostra le assert che falliscono ● Page Speed viene utilizzata per misurare tempi di risposta di una pagina ● Fornisce indicazioni su come ottimizzare la pagina
  • 30. Conclusioni Pro Contro
  • 31. Conclusioni Pro ● E' Open Source ● E' una libreria Javascript scritta da programmatori Java ● package razionali e con bassa interdipendenza ● Documentazione e supporto ● Incoraggia l'utilizzo di good software engineering practices ● Documentare con JSDoc ● Scrivere test unit con JSUnit ● Closure Compiler generalmente migliore di YUI Compressor
  • 32. Conclusioni Contro ● E' una libreria Javascript scritta da programmatori Java ● A discapito del nome, le closure Javascript sono sottoutilizzate (vedi Jquery) ● Troppe operazioni command line come calcdeps.py ● L'ottimizzazione advanced e' inutilizzabile ● Non esiste un CSS compiler