Javascript pour adultes

TOC

  1. Introduction
  2. Au menu
  3. Rappels de base
  4. Bonnes pratiques
  5. Nouveautés de javascript
  6. Futur de javascript
  7. Introduction aux closures
  8. Pack-man
  9. Conclusion

Une conférence pas drôle du tout

- Some things ain't funny

Raconter des blagues

"dmp" sur #xulfr ou #developers

Pro

LinkedIn: Olivier Gambier (le seul qui fait du dev) http://www.linkedin.com/pub/5/744/a42

© xulfr - XUL Workshop Septembre 2008

Introduction

Pourquoi pour adultes?

  1. Un language (trop) facile à aborder
  2. Un language mal compris
  3. Un language très puissant, en plein ascension

Pour qui?

  1. Public de développeurs relativement avertis
  2. Familiarité avec le language
  3. Notions de prog OO

Pour quoi?

  1. Dev mozilla
  2. Dans une certaine mesure dev web

Au menu: première partie (grands débutants):

  1. Heads-up! Rappels de base concernant l'environnement de travail du développeur javascript mozilla
  2. Keep your heads-up! Rappels concernant les bonnes pratiques
  3. Interlude Nouveautés de la version 1.6 / 1.7 / 1.8
  4. Science fiction futur de javascript
... seconde partie (ceux qui sont toujours là):
  1. Be strong Closures
  2. All UR package belong to usDéveloppement d'un gestionnaire de packages
  3. Conclusion

© xulfr - XUL Workshop Septembre 2008

Rappels de base concernant l'environnement de développement

Configuration firefox

Démarrer sur un profil clean. Configurer pour le développement.

       user_pref("nglayout.debug.disable_xul_cache", true);
       user_pref("nglayout.debug.disable_xul_fastload", true);
       user_pref("javascript.options.strict", true);
       user_pref("javascript.options.showInConsole", true);
       user_pref("browser.dom.window.dump.enabled", true);
       user_pref("extensions.logging.enabled", "true");
      

© xulfr - XUL Workshop Septembre 2008

Rappels de base concernant l'environnement de développement

Extensions essentielles

Extensions utiles

© xulfr - XUL Workshop Septembre 2008

Rappels de base concernant l'environnement de développement

Autres extensions pour certains usages particuliers

© xulfr - XUL Workshop Septembre 2008

Rappels de base concernant l'environnement de développement

Outils de développement

Ur choice...

... mais... coloration javascript dans XBL... complétion sur les composants XPCOM mozilla... validation de syntaxe...

© xulfr - XUL Workshop Septembre 2008

Rappels de base concernant l'environnement de développement

Références

© xulfr - XUL Workshop Septembre 2008

Rappels: bonnes pratiques minimales

Gestion de projet (minimum vital)

Code

© xulfr - XUL Workshop Septembre 2008

Rappels: bonnes pratiques minimales

DOCUMENTEZ

© xulfr - XUL Workshop Septembre 2008

Rappels: bonnes pratiques minimales (code)

Faites du test unitaire!

© xulfr - XUL Workshop Septembre 2008

Rappels: bonnes pratiques minimales (code)

Modularisez!

© xulfr - XUL Workshop Septembre 2008

Rappels: bonnes pratiques minimales (code)

Modularisez! Détails

        // YUI
        <script type='text/javascript' src='coincoin.js'>
        // Résultat
        stuff.thing.coincoin.doSomething();
        // DOJO
        dojo.require('stuff.thing.coin');
        // Résultat
        stuff.thing.coincoin.doSomething();
        // Subscript
        var subscriptLoader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                .getService(Components.interfaces.mozIJSSubScriptLoader);
        subscriptLoader.loadSubScript(url, scope);
        // Résultat
        scope.something();
        // Code modules
        var EXPORTED_SYMBOLS = ["foo", "bar"]
        var bar = "stuff";
        var hidden = "dummy";
        function foo() {
          return dummy;
        }
        // Puis...
        Components.utils.import("resource://app/modules/my_module.jsm");
      

© xulfr - XUL Workshop Septembre 2008

Rappels: bonnes pratiques minimales (code)

Recommandations finales

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript 1.6

E4X

Arrays

      var monArray = [1, 2, 0, 4, 1];
      function doSomething(){};
      // Index
      monArray.indexOf(2);
      monArray.lastIndexOf(2);
      // doSomething pour chaque élément du tableau
      monArray.forEach(doSomething);
      // comme forEach et renvoie true si tous les appels renvoient true
      var result = monArray.every(doSomething);
      // comme every mais renvoie true si l'un au moins des appels renvoie true
      var result = monArray.some(doSomething);
      // Réduit le tableau aux éléments pour lesquels l'appel de la fonction renvoie true
      monArray.filter(doSomething);
      // transforme un tableau en appliquant à chaque élément la fonction doSomething
      monArray.map(doSomething);
      // array et strings generics: plutôt que
      Array.prototype.every.call(someString, someMethod);
      // ... utiliser un generic
      Array.every(someString, someMethod);
    

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript 1.7, 1.8

Sucre syntaxique et autres goodies

        //// Expression closures, ou lambda notation
        function(x) x * x
        // Est strictement équivalent à
        function(x) { return x * x; }
        
        //// reduce et reduceRight sur les array
        var sum = function(a, b) a+b;;
        monArray.reduce(sum);
        monArray.reduceRight(sum);
        
        //// Array comprehension
        // Ancienne mode
        for(var i = 0; i < 10; i++){
          someArray.push(i);
        }
        // Nouvelle mode
        someArray = [i for (i = 0; i < 10; i++)]
        someArray = [key for (key in obj)]
      

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript 1.7, 1.8

Destructuring


        function returnArrayOfStuff() [1, 2, 3, 4];
        
        var [a, b, c, d] = returnArrayOfStuff();
        
        // Marche aussi sur les objets bien sûr...
        // Et aussi dans une boucle, pour un exemple élaboré
        
        var superSecret = [
          {girl: 'alex', phone: '0101010101'},
          {girl: 'audrey', phone: '0202020202'},
        ]
        
        for(let [girl: girl, phone: phone] in superSecret){
          if(dump(phone))
            throw(girl);
        }
      

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript 1.7, 1.8

Let

        // I. Let statement
        var stuff = 0;
        let (stuff = 1){
        // Stuff vaut 1 à l'intérieur de ce bloc
        }
        // Stuff vaut à nouveau 0
        
        // II. Let expression
        var stuff = 0;
        someMethod(let (stuff = 1) stuff)
        
        // III. Let definition
        if(true){
          let maSuperNewVar = 5;
        // Blabla do something with maSuperNewVar
        }
        // maSuperNewVar n'est plus définie
        
        // IV. Let dans les for:
        for(let x = 0; x < 10; x++){
        }
        // x n'est plus défini

      

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript 1.7, 1.8

Iterators

Un itérateur est un objet permettant de "traverser" tous les éléments d'une collection. Plus précisément, un itérateur est un type de pointeur doté de deux opérations principales: référencer un élément spécifique dans une collection (accès), et se modifier lui-même pour pointer sur l'élément suivant (traversal).

        var stuff = ['one', 'two', 'three'];
        iter = Iterator(stuff);
        try{
          while(true){
            dump('La valeur suivante de ce tableau est ' + iter.next());
          }
        }catch(e if e instanceof StopIteration){
          dump('Fini!\n');
        }catch(e){
          throw('Aya Caramba! Something is rotten! ' + e + '\n');
        }
        
      

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript 1.7, 1.8

Generators: un itérateur spécialisé

       //Iterator generator
       function multiply(obj) {
         for ( let i in obj ){
           yield i * 5;
         }
       }

       let it = multiply(someObj);
       try {
         while (true) {
           dump(it.next() + "\n");
         }
       } catch (err if err instanceof StopIteration) {
       }
      

© xulfr - XUL Workshop Septembre 2008

Interlude: nouveautés de javascript

Références et conclusions

© xulfr - XUL Workshop Septembre 2008

Futur

© xulfr - XUL Workshop Septembre 2008

Closures

Quezako?

        // Par l'exemple
        function createClosure(){
          var something = 'coincoin';
          return function(){
            alert('Haha je peux faire ' + something);
          };
        }
        
        var canard = createClosure();
        canard();
      

© xulfr - XUL Workshop Septembre 2008

Closures

Intérêt?

© xulfr - XUL Workshop Septembre 2008

Closures

Attachement de scope: résoudre le problème du this dans les eventListener

        var clickyManagerClass = function(){
        };
        clickyManagerClass.prototype.nbClicks = 0;


        clickyManagerClass.prototype.handleClicky = function(event){
          alert(typeof this.nbClicks);
        };

        clickyManagerClass.prototype.registerClicky = function(node){
        // Traditionnel, renverra document en guise de this
          node.addEventListener('click', this.handleClicky, true);
        // Avec une closure bien sympathique... (par le haut), this renverra bien l'instance de notre objet
          var scope = this;
          node.addEventListener('click', function(event){return scope.handleClicky(event);}, true);
        }; 

        var someClickyManager = new clickyManagerClass();
        someClickyManager.registerClicky(document);
      

© xulfr - XUL Workshop Septembre 2008

Closures

Implémenter des concepts objet avancés: rappels de base - privé, public, privilégié, static, instance

        // Constructeur
        var maClass = function(something){
          // private static
          var privateThing = function(){};
          // publique instance, privilégiée au niveau de l'instance
          this.publicPriviledged = function(){};
        };
        
        // publique instance
        maClass.prototype.publicThing = function(){};
        
        // statique publique
        maClass.staticThing = function(){};
      

© xulfr - XUL Workshop Septembre 2008

Closures

Implémenter des concepts objet avancés: obtenir des propriétés statiques privées et une large palette de privilèges

var maClass = (function() {
  // Private static property
  var privateStaticProperty = 'something';

  // Class constructor
  function realConstructor(stuff) {

    // Private instance property
    var privateInstanceProperty = function(){};

    // (Doubly) privileged instance method
    // Can access both static and instance private data
    this.priviledgedInstanceMethod = function() {
    };
  };

  // Privileged static method (can access private static members)
  realConstructor.priviledgedStaticMethod = function() {
  };

  // Public instance method, with class level privileges
  realConstructor.prototype.publicInstanceMethod = function() {
  };

  return realConstructor;
})();

// Public static property sans aucun privilège
maClass.publicStaticProperty = function(){};

// Public instance property sans aucun privilège
maClass.prototype.publicInstanceProperty = function(){};

      

© xulfr - XUL Workshop Septembre 2008

Closures

Implémenter des concepts objet avancés: mmmmm, static protected?

(function() {
  var protectedStatic = 0;
  this.maClass = function() {
  };
  this.maClass.prototype.increment = function(){
    protectedStatic++;
    alert(protectedStatic);
  };

  this.descendantClass = function() {
  };

  this.descendantClass.prototype = new maClass();

})();
      

© xulfr - XUL Workshop Septembre 2008

Closures

Librairies OO et documentation additionelle

© xulfr - XUL Workshop Septembre 2008

All ur package are belong to us

PackMan, un gestionnaire de modules plus ou moins raffiné en soixante lignes.

Conclusion

- Be an artist

© xulfr - XUL Workshop Septembre 2008