Skip to content

Instantly share code, notes, and snippets.

@k33g
Created August 2, 2012 13:27
Show Gist options
  • Save k33g/3237104 to your computer and use it in GitHub Desktop.
Save k33g/3237104 to your computer and use it in GitHub Desktop.
Mini-Book : Coffeescript en 5 minutes

##Coffeescript "tourne"

  • côté client ➤ Navigateur
  • côté serveur & "shell" ➤ NodeJS
  • sous Windows, sous Linux, sous Mac

##Citation

"CoffeeScript is JavaScript, the same language with a different accent"

Patrick Lee (CoffeeScript in Action)

##Coffeescript

  • Simplifie le javascript ...
  • Génère du javascript "propre"
  • ... et "apporte" de nombreux "plus" ...

... qui vont simplifier & rendre le code plus lisible

##Fonctions

addition = (a,b) ->
    a+b

##Coffeescript est compatible avec les "libs" javascript

###Avant :

jQuery $(document).ready()

###Après :

$ -> 
    some()
    init()
    calls()

##Strings - Interpolations

bob =
    firstName : "Bob"
    lastName : "Morane"
    hello : ->
        "Hello !"

console.log "
    Firstname : #{bob.firstName},
    LastName  : #{bob.lastName},
    Method (hello) : #{bob.hello()}
"

... templating plus facile

##Arrays, par exemple "select"

buddies = [
    {name:"Bob", age:30}
    {name:"Sam", age:50}
    { name : "John", age : 20 }
]

#tous les copains de moins de 50 ans
result = (buddy for buddy in buddies when buddy.age < 50)

##Et enfin (surtout) : Les Classes !!!

###Classes

class Human
    constructor : (firstName, lastName) ->
        #fields : @ = this
        @firstName = firstName
        @lastName = lastName
    #method
    hello : ->
        console.log "Hello #{@firstName} #{@lastName}"

Bob = new Human "Bob", "Morane"

###Classes : propriétés & valeurs par défaut en paramètres

class Human
    constructor : (@firstName = "John", @lastName = "Doe") ->
    hello : ->
        console.log "Hello #{@firstName} #{@lastName}"

###Classes : Composition, Association, ...

class Dog
    constructor:(@name)->
class Human
    constructor:(@first, @last, @dog)->

Bob = new Human "Bob", "Morane", new Dog "Wolf"
console.log "Le chien de Bob s'appelle #{Bob.dog.name}"

###Classes : Encapsulation

class Human
    class Hand
        constructor:(@whichOne)->
    constructor:(@first, @last)->
        @leftHand = new Hand "left"
        @rightHand = new Hand "right"

console.log JSON.stringify new Human "Bob", "Morane"

###Static members :

class Human
    @counter : 0 #static property
    constructor : (@firstName, @lastName) ->
        Human.counter += 1
    #static method
    @howMany : ->
        Human.counter

Bob = new Human "Bob", "Morane"
console.log "Human.counter #{Human.howMany()}"

###Héritage : "extends"

class Human
    constructor : (@firstName, @lastName) ->
    hello : ->
        "Hello #{@firstName} #{@lastName}"

class Superhero extends Human
    constructor : (@firstName, @lastName, @name) ->
    hello : ->
        super + " aka #{@name}"

SuperMan = new Superhero "Clark", "Kent", "SuperMan"
console.log SuperMan.hello()

Donc : Vous pouvez faire du JS "orienté Classes", Tout en conservant les possibilités de JS

@k33g
Copy link
Author

k33g commented Aug 2, 2012

@mklabs
Copy link

mklabs commented Aug 2, 2012

Donc : Vous pouvez faire du JS "orienté Classes", Tout en conservant les possibilités de JS

Ca marche aussi sans coffee :) juste avec un différent accent.

@k33g
Copy link
Author

k33g commented Aug 2, 2012

Question de point de vue :

en JS c'est de l'orienté objet, à la limite de l'orienté "pseudo classe"
en Coffee c'est de l'orienté Class (même si la mécanique derrière est du bricolage)
mais l'aspect sémantique est important

@mklabs
Copy link

mklabs commented Aug 2, 2012

juste avec un différent accent.

Mwé, après c'est pas magique. Ca reste du JS, prototype et compagnie. Quand tu classet extends, derrière ca reste du JS.

@k33g
Copy link
Author

k33g commented Aug 2, 2012

c'est ce que je disais :

(même si la mécanique derrière est du bricolage)

@mklabs
Copy link

mklabs commented Aug 2, 2012

je sais que tu sais.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment