Loading...

Université Léonard de Vinci - Paris, La Défense

Jean-Claude Lévy - twitter : @jclevy
4 octobre 2011

Cette présentation est une simple page web HTML5

Modèle disponible sur http://html5rocks.com/

Appuyer sur PgDn pour avancer.

AltR exécute votre code.

Ctrl1 commute le panneau Javascript.

Remerciements à Jean Rohmer

  • Des esprits atypiques
  • Les informaticiens ont réussi à inventer le désordre sans espace
  • Un univers intentionnel

Les langages - historique personnel

Les langages - historique personnel

  • X Windows : DEC Ultrix (1990)
  • Objective C, Postscript : NeXT (1991-1992)
  • MS Basic : RaPID - Access 2.0 (1994) - générateur d'applications de gestion
  • C++ : Windows 95, MFC 4.0 et Visual Studio 4 (1997)
    Pour un éditeur multimédia : La bible de Jérusalem
  • Premiers concepts de programmation intentionnelle (1998)
  • ASP, Javascript, Ajax (1999) - premiers pas, premiers clients
  • C# (1999-2000) - premier cours donnés en interne chez Microsoft France
  • Création d'Intentware.com (2001)
  • .NET, ASP.NET (2002)

Les langages - historique personnel

Bases de données

Frameworks Javascript

Frameworks Javascript pour mobiles

Développment pour Mobile

HTML5

De nouveaux services sur les clients Web

Javascript sur le serveur

Editeur de code en ligne

Environnement de développement en ligne

Nouveaux langages

CoffeeScript

JavaScript sans Echec

Bodil Stokke

@bodiltv

JavaScript

Pourquoi ça fait mal ?

Au début ...

Brendan Eich

Inventeur du JavaScript,
une semaine sombre et orageuse de 1995

Ben alors JS?
  • Variables globales
    function plus_two(n) { two = 2; return n + two; }
    plus_two(3); // 5 - évidemment, 3 + 2 = 5
    two;         // 2 - ben alors JS ?
  • Le bloc with
    var foo = 5;
    with (obj)
        foo; // 5, à moins que obj.foo n'existe
  • C'est quoi le problème de l'opérateur == ?
    2 === "2"; // faux - évidemment un nombre n'est pas une chaine
    2 == "2";  // vrai - ben alors JS ?

Que s'est-il passé ?

  • Contraintes de temps ?
  • Interferences avec le business ?
  • Usage de substances interdites ?
  • Programmation en binôme ?

John McCarthy

Inventeur du Lisp, 1958

Dennis Ritchie

Co-inventeur du C, 1973

Bjarne Stroustrup

Inventeur du C++, 1983

Guido van Rossum

Inventeur du Python, 1991

James Gosling

Inventeur du Java, 1995

Brendan Eich

Inventeur du JavaScript, 1995

La théorie de la conception des langages de programmation

par l'analyse de la pilosité faciale

Anders Hejlsberg

Inventeur du C#, 2001

Alors aucun espoir pour Javascript ?

Ryan Dahl

Inventeur de Node.JS

Les joies de la programmation asynchrone

server.listen(function(request, response) {
    database.open(function(connection) {
        connection.query("SELECT * FROM posts", function(cursor) {
            cursor.fetchAll(function(posts) {
                response.write(posts.forEach(function(post) {
                    return post.title;
                }));
            });
        });
    });
});

// ben alors ?

Les doigts dans le nez !

CoffeeScript

Jeremy Ashkenas

Inventeur du CoffeeScript, 2009

La théorie de la conception des langages de programmation

par l'analyse de la pilosité faciale

La syntaxe Javascript est trop grasse

Javascript est trop répétitif

Débarrassons-nous de ce trop plein

Que deviennent les accolades ?
  • CoffeeScript utilise l'indentation.
    foo = (a, b) ->
      c = a + b     # l'indentation délimite un bloc - "{" implicite
      console.log c # même niveau d'indentation, même bloc
    foo 2, 3        # désindente termine le bloc - "}" implicite
  • Les blocs sont définis par l'indentation que vous mettez de toute façon :
    if name != "honey badger"
      care()
    else
      eat_cobra()
    Vous voyez les blocs ?
Fonctions
  • Une fonction en JavaScript:
    var sum = function(a, b) {
        return a + b;
    }
  • En CoffeeScript:
    sum = (a, b) -> a + b
  • function(a, b) devient (a, b) ->
  • function() devient simplement ->
  • return est implicite: une fonction renvoie toujours la valeur de sa dernière expression.
Appel de fonction
  • Les parenthèses sont optionelles:
    sum = (a, b) -> a + b # vous vous en souvenez ? Ca calcule a + b :)
    
    sum(2, 3) # renvoie 5
    sum 2, 3  # renvoie 5
  • Appel de fonction sans argument:
    connection.close() # appelle la fonction close
    connection.close   # renvoie la fonction, ne l'appelle pas
sum = (a, b) -> a + b
Oubliez les défauts de Javascript
  • Toutes les déclarations de variables sont locales:
    foo = "bar"
    # est compilé en:
    var foo;
    foo = "bar";
  • Plus de problème mystérieux avec == :
    2 == "2"
    # est compilé en:
    2 === "2" # renvoie faux, comme vous vous y attendez
    
    2 is 2 # est équivalent à 2 == "2"

Wouah c'est renversant !

Déclaration d'objets
  • En JavaScript:
    var tweet = {
        user: {
            name: "bodiltv",
            url: "http://bodil.tv/"
        },
        text: "PONIES RULE SO HARD"
    };
  • En CoffeeScript:
    tweet =
      user:
        name: "bodiltv"
        url: "http://bodil.tv/"
      text: "PONIES RULE SO HARD"
Déclaration de tableaux
  • En JavaScript:
    var things_that_rule = [
        "robot unicorns",
        "honey badgers",
        "Lord Inglip"
    ];
  • En CoffeeScript:
    things_that_rule = [
        "robot unicorns"
        "honey badgers"
        "Lord Inglip"
    ]
Affectation destructurante
  • Affectation de variables à partir d'un tableau :
    sum_and_difference = (a, b) -> [ a + b, a - b]
    [ sum, difference ] = sum_and_difference 5, 2
    sum # renvoie 7
    difference # revoie 3
    
sumdiff = (a, b) -> [ a + b, a - b] [a, b] = sumdiff 23,12 a
Et pour if ?
  • Le bloc if :
    if elvis.state == "alive"
      console.log "Hail to the King!"
    else
      console.log "You lie!"
  • Il y a une forme plus courte :
    if power_level > 9000 then attack() else retreat()
  • Ca peut même être utilisé en tant que suffixe:
    reign_in_graceland() if name == "Elvis"
La boucle while
  • La bloucle classique :
    while count > 0
      count -= 1
  • until est un raccourci pour while not:
    until power_level > 9000
      power_level += 1
  • Et vous pouvez les mettre après une instruction, tout comme if:
    power_level++ while power_level <= 9000

Tout est expression.

Tout est expression
  • if fonctionne comme un opérateur ternaire:
    foo = false
    result = if foo then "foo is truthy" else "foo is falsy"
    # result est "foo is falsy"
  • while renvoie un tableau:
    counter = 0
    list = while counter < 5
      counter++
      "n" + counter
    # list is [ 'n1', 'n2', 'n3', 'n4', 'n5' ]
Tout est expression
  • Même l'instruction switch revoie quelque chose:
    result = switch request.error_code
      when 200 then "OK"
      when 301 then "don't live here anymore"
      when 404 then "not found"
      when 500 then "i maed u a page... but i eated it"
      else "unknown error call the police " + request.error_code
    
foo = false result = if foo then "truthy" else "falsy"
code = 301 result = switch code when 200 then "OK" when 301 then "don't live here anymore" when 404 then "not found" when 500 then "i maed u a page... but i eated it" else "unknown error call the police " + request.error_code
Pour votre confort
  • Comparisons chainées:
    if 20 < temperature < 30
      venture_outside()
  • L'opérateur d'existence:
    foo = { bar: "bar" }
    if foo.bar? then console.log foo.bar
    # if (foo.bar != null) { ... }
Interpolation de chaîne
  • Fatigué de concaténer des chaînes de caractères ? On a récuppéré ça de Ruby:
    pokemon = "Snorlax"
    console.log "Wild #{pokemon} appeared!"
    "Wild Snorlax appeared!"
  • On peut même mettre du code dedans:
    pokemon = "Snorlax"
    console.log "Wild #{pokemon.toUpperCase()} appeared!"
    "Wild SNORLAX appeared!"
Heredocs
  • Vous voulez des chaînes vraiment grandes ? CoffeeScript n'est pas géné par les sauts de lignes :
    blurb = "I don't always drink beer,
             but when I do,
             I prefer Dos Equis."
    console.log blurb
    "I don't always drink beer, but when I do, I prefer Dos Equis."
  • Ou bien utilisez heredocs pour conserver le formatage et ne pas s'occuper des guillemets :
    html = """
           <div class="article">
             <h1>Honey Badger</h1>
             <p>Honey Badger don't care.</p>
           </div>
           """
Manipuler les tableaux
  • Opérateurs de découpage :
    numbers = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    
    numbers[3..6] # [ 3, 4, 5, 6 ]
    numbers[7..]  # [ 7, 8, 9 ]
    numbers[..3]  # [ 0, 1, 2, 3 ]
  • Et nous pouvons aussi faire des remplacements :
    numbers = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    
    numbers[3..6] = [ "foo", "bar" ]
    numbers # [ 0, 1, 2, "foo", "bar", 7, 8, 9 ]
                  
numbers = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
La boucle for
  • Itérer sur les membre d'une liste :
    numbers = [ 1, 2, 3, "many" ]
    for number in numbers
      console.log "I just counted to #{number}"
  • Il y a une forme suffixe, bien sûr :
    numbers = [ 1, 2, 3, "many" ]
    console.log "I just counted to #{number}" for number in numbers
  • Et ça renvoie une nouvelle liste:
    numbers = [ 1..5 ]
    result = number + 1 for number in numbers
    result # [ 2, 3, 4, 5, 6 ]
numbers = [ 1 .. 5 ] for number in numbers number
dictionary = "omg": "Object Management Group" "wtf": "World Taekwondo Federation" "lol": "League of Legends" for a of dictionary a
Création fonctionnelle de listes

Des syntaxes concises pour les opérations map et filter :

( expression for item in array )
( expression for item in array when condition )

( expression for key, value of object )
( expression for key, value of object when condition )

dictionary = "hello": "nuqneH" "yes": "HIja'" "no": "ghobe'" "okay": "lu'" "what": "nuqjatlh" a + ' - ' + b for a,b of dictionary
Le royaume des noms

Avez-vous jamais essayé de faire fonctionner Javascript comme un langage orienté objet ?

Shape = function(x, y) {
    this.x = x;
    this.y = y;
};

Shape.prototype.centre = function() {
    return [ this.x, this.y ];
};

Shape.prototype.area = function() {
    return 0;
};

var point = new Shape(13, 37);

class Shape constructor: (@x, @y) -> centre: -> [ @x, @y ] area: -> 0 point = new Shape 13, 37
Bien, mais puis-je l'utiliser où je veux ?
  • Dans votre page web :
    <script type="text/javascript" src="coffee-script.js"></script>
    
    <script type="text/coffeescript" src="my.coffee"></script>
  • Dans Node:
    $ npm install coffee-script
    var my_cs_module = require("./my_cs_module");
  • Compiler puis exécuter partout où Javascript fonctionne :
    $ coffee -c my_script.coffee

Merci d'avoir tenu le choc !

Jean-Claude Lévy
jclevy@intentware.net

Twitter : @jclevy