Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

CoffeeScript une réponse possible au champ miné qu'est JavaScript ?
Un blogueur explique pourquoi ce n'est pas le cas

Le , par Arsene Newman

0PARTAGES

4  0 
« Pourquoi CoffeeScript n’est pas la réponse ? » telle est la question posée dans le billet de blog de Jeff Walker, un développeur avec plusieurs années d’expériences qui revient sur les plus et les moins de CoffeeScript.

Tout d’abord, CoffeeScript est un projet open source qui introduit une nouvelle syntaxe au langage JavaScript et qui apporte son lot de concepts nouveaux. L’autre mérite de ce projet est décrit dans ce qui suit : « La règle d’or de CoffeeScript se résume à : C’est juste du JavaScript. Cela veut dire qu’il y a équivalent strict à chaque ligne de CoffeeScript. Par conséquent, il n’y a pas autant de problèmes d’interopérabilité du JavaScript qu’avec d’autres comme Dart ».

Forts de ces arguments, Jeff Walker a décidé d’utiliser cette variante de JS dans un nouveau projet, néanmoins il semble que l’expérience n’a pas été concluante : « Cette expérience m’a amené à ne pas utiliser CoffeeScript sur mon projet actuel ». Pourquoi donc ? Le blogueur s’explique sur la base de quelques points essentiels :

- Un code ambigu :
Sous CoffeeScript, les parenthèses, les accolades et les virgules sont optionnels, remplacés par des espaces blancs et de l’indentation, toutefois cela amène à certaines situations ambigus, en voici un exemple :
  • Le code suivant ne peut être compilé :


func 5, {

event: (e) ->

if e.something
36
else
45,
val: 10}
Il est nécessaire de supprimer la virgule ou de la placer sur la ligne suivante devant val.

  • A + B revient à additionner A et B, alors que A +B est équivalent à un appel de A avec comme argument +B


- Lisibilité du code :
Sous CoffeeScript, tout est expression logique (une valeur de retour existe), or selon notre blogueur : « Le cerveau humain comprend facilement la logique sous forme de symboles ». Ainsi évalué l’exemple ci-dessous reste complexe (tiré du tutoriel officiel sur les boucles):

foods = ['broccoli', 'spinach', 'chocolate']
eat food for food in foods when food isnt 'chocolate'
  • En premier lieu la déclaration de foods qui est effectuée au milieu de cette expression n’apparait pas clairement comme une déclaration de variable.
  • De plus il n’est pas clair quelle est la valeur retournée à eat.
  • Enfin l’existence d’une condition n’est révélée qu’en dernier lieu.


- L’illusion de l’existence des classes :
Malgré les demandes des développeurs, la notion de classe n’a pas vu le jour sous JavaScript. Sous CoffeeScript le pas a été franchi, mais les classes ne sont qu’une simple émulation du concept, (cela est dû à la règle d’or de CoffeeScript). Cette situation mène à une plus grande confusion pour certains concepts de JS, en particulier le mot clé This qui n’a pas la même signification que sous les langages OO.

Pour finir, il est important de noter que « CoffeeScript a commencé à partir d’une position forte et une bonne approche philosophique vis-à-vis du champ miné qu’est Javascript ». De plus le blogueur signale qu’au quotidien cela diffère : « En réalité, les questions que j'ai soulevées en ce qui concerne CoffeeScript ne se rencontrent pas tous les jours », même si « En fin de compte, elles sont suffisantes pour dire que nous avons besoin de quelque chose de mieux ».

Source : Blog de Jeff Walker
Et vous ?

Qu’en pensez-vous ?

Utilisez-vous CoffeeScript ou bien une autre variante de JS ? Avez-vous rencontrés ces mêmes difficultés ?

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de SpaceFrog
Rédacteur/Modérateur https://www.developpez.com
Le 02/04/2014 à 9:27
Javascript un champs miné ?
Je dois avoir de la chance parce que ça fait un bail que je me promène dans ce champs et je n'ai pas encore sauté
8  3 
Avatar de SylvainPV
Rédacteur/Modérateur https://www.developpez.com
Le 02/04/2014 à 1:04
Ce n'est que mon avis, mais je trouve que donner un sens logique à des espaces est une hérésie (en CoffeeScript l'indentation remplace les accolades pour déterminer le scope). Pour la même raison, je n'ai jamais utilisé Jade ou SASS.

Les éditeurs sont incapables d'auto-indenter ce genre de code, puisqu'ils ne peuvent pas deviner à quel scope on souhaite placer une instruction. Et si jamais ils réindentent tout de même le fichier (ce qui est loin d'être rare, surtout dans les équipes où chacun a son propre IDE), le fonctionnel du code peut changer ! Un bogue à cause d'une mauvaise indentation, il fallait l'inventer.
6  2 
Avatar de SylvainPV
Rédacteur/Modérateur https://www.developpez.com
Le 02/04/2014 à 19:36
L'indentation codante, un gain en lisibilité et de maintenance ??? Pour toi, en donnant la possibilité de péter un code juste en rajoutant/retirant des espaces, ça rend le langage plus facile à maintenir ?

On a pas besoin de retirer les accolades pour convaincre les développeurs d'indenter leur code. C'est comme si on forçait quelqu'un à longer le bord d'une falaise pour lui apprendre à marcher droit...
5  1 
Avatar de frfancha
Membre éclairé https://www.developpez.com
Le 02/04/2014 à 20:29
Citation Envoyé par Enerian Voir le message
Si tous ceux qui utilisent JavaScript prenaient le temps de l'apprendre et de comprendre le pourquoi de ce qu'ils considèrent être des incohérences, ils se rendraient compte que le champs de mines n'est qu'une illusion.
+1000
4  0 
Avatar de Enerian
Membre éclairé https://www.developpez.com
Le 02/04/2014 à 17:16
Citation Envoyé par SylvainPV  Voir le message
Ce n'est que mon avis, mais je trouve que donner un sens logique à des espaces est une hérésie (en CoffeeScript l'indentation remplace les accolades pour déterminer le scope). Pour la même raison, je n'ai jamais utilisé Jade ou SASS.

Je suis partiellement d'accord. En python ça passe nickel par exemple, mais ils sont beaucoup plus stricts. Notamment, les lambda ne peuvent pas dépasser une ligne. Et là tout change.

Quand je vois ça :
Code : Sélectionner tout
1
2
3
setTimeout -> 
  doSomethind() 
, 1000
ou ça
Code : Sélectionner tout
1
2
3
4
5
 
myFunc 
  hello: 'world' 
  , -> 
    doSomething()
(équivalent JS pour ceux qui veulent pas chopper une migraine : )
Code JavaScript : Sélectionner tout
1
2
3
4
5
myFunc({ 
  hello: 'world' 
}, function() { 
  return doSomething(); 
});

j'ai envie de vomir (ou presque)...
CF est bien trop permissif et ambigu à mon gout. Ou plutôt il permet de produire trop facilement du code permissif et ambigu.
Après je pense qu'on peut faire un code élégant avec, en établissant des règles et des conventions strictes, mais c'est rarement le cas.

champ miné qu’est JavaScript

Si tous ceux qui utilisent JavaScript prenaient le temps de l'apprendre et de comprendre le pourquoi de ce qu'ils considèrent être des incohérences, ils se rendraient compte que le champs de mines n'est qu'une illusion.
4  1 
Avatar de
https://www.developpez.com
Le 02/04/2014 à 17:06
Citation Envoyé par Arsene Newman  Voir le message
Ainsi évalué l’exemple ci-dessous reste complexe (tiré du tutoriel officiel sur les boucles):
Code : Sélectionner tout
1
2
foods = ['broccoli', 'spinach', 'chocolate'] 
eat food for food in foods when food isnt 'chocolate'
  • En premier lieu la déclaration de foods qui est effectuée au milieu de cette expression n’apparait pas clairement comme une déclaration de variable.
  • De plus il n’est pas clair quelle est la valeur retournée à eat.
  • Enfin l’existence d’une condition n’est révélée qu’en dernier lieu.



Code : Sélectionner tout
1
2
3
# Health conscious meal. 
foods = ['broccoli', 'spinach', 'chocolate'] 
eat food for food in foods when food isnt 'chocolate'
Avec la couleur ça me parait plutôt clair...
2  1 
Avatar de TiranusKBX
Expert confirmé https://www.developpez.com
Le 02/04/2014 à 18:24
les indentations codantes ne sont pas tellement le problème car sur python les IDE te le disent direct si tu merde
mais sur CoffeeScript le fait que tout est expression ça c'est une connerie pour moi, il y a pas mieux pour avoir du code ilisible
0  0 
Avatar de anykeyh
Membre confirmé https://www.developpez.com
Le 03/04/2014 à 0:28
CoffeeScript c'est supercool, j'expliquais pas plus tard que la semaine derniere comment il peut être utilisé pour générer des métas objets, par le principe de classes et d'appelles de fonctions (et l'utilisation de @ à la place de this)

Par exemple, à l'usage il devient aisé de développer une ecriture fluide pour un ORM (notamment pour nodejs)

Code : Sélectionner tout
1
2
3
4
5
6
7
8
class DbTable
  @table = ->  ... #Code pour aller chercher la table par exemple et recuperer tout les champs
  @validatesPresenceOf = (fields...) ->  #On check à la sauvegarde les champs etc...

class Post extends DbTable
  @table 'posts'
  @validatesPresenceOf 'id', 'content' #Ruby style :)

Par contre effectivement il faut être discipliné pour avoir un code propre. Et eviter quelques pièges. Le pire étant celui-ci (c'est du vécue!)

Code : Sélectionner tout
1
2
3

['apple', 'peach', 'banana'].sort (a,b) -> a > b ? -1 : 1

Sortira ce code (WTF?!):

Code : Sélectionner tout
1
2
3
4
5
6
7
['apple', 'peach', 'banana'].sort(function(a, b) {
  var _ref;
  return (_ref = a > b) != null ? _ref : -{
    1: 1
  };
});
En fait l'operateur ternaire n'existe pas, il faut utiliser "if a > b then -1 else 1"... Mais c'est quand meme fou qu'il compile. Et du coup le code plante pas et fait n'importe quoi...

EDIT:

Je tiens a préciser que je code en cofeescript dés que je peux, je trouve le langage plus fluide que le javascript. J'ai un gain de productivité d'au moins 30%. Le problème des indentation ou autre joyeuseté n'est qu'un faux problème. C'est une question d'habitude, que tu prend en moins de 48 heures.

Les problèmes graves, sont selon moi:

- Les erreurs de syntaxes ne sont pas toujours claires, alors il ne faut pas hésiter à utiliser l'outil coffeelint si ça plante, afin d'avoir une meilleur comprehension sur le pourquoi
- Le code qui semble correcte mais qui compile complétement à coté de la plaque (il y a des cas d'école je pourrais les lister ici si vous le souhaitez...)
- L'inférence de type est moins bien géré sous coffeescript, donc le code est moins performant. Car toute fonction retourne la derniere instruction (comme en ruby). Du coup faut forcer un "return" en fin de fonction pour profiter des dernières optimisations de libv8

Mais meme ainsi, j'ai peu de chose à reprocher à coffescript. Ah, si, il me fait raler lorsque je doit (re)faire du javascript .

Et c'est à comparer avec des problèmes graves de javascript "natif":

- L'oublie d'un "var" = variable globale... Le plus grave des problèmes à mon sens
- Les milles façon de faire une classe, qui rend le code difficile à lire, notamment lorsque plusieurs développeurs travaillent dessus, à coup de prototype, de $.extend et autre manières... Si on peut le faire aussi avec CS, l'usage du mot clé "class" mets tout le monde d'accord sur le but final de ton code: "JE FAIS DE L'OBJET LA ICI MAINTENANT!".
- L'usage de "proxy" type "var self = this;" dans des callbacks imbriqués ne favorise vraiment pas la comprehension, à comparer avec l'opérateur "=>"
- La difficulté a découvrir un problème au niveau des operations, type "1" == 1 renvoie true, mais "1" === 1 renvoie faux.
Coffeescript n'utilise que l'operateur ===, ce qui force le développeur à caster ses types pour les comparer, rendant le code plus robuste à mes yeux.

Sinon, ça c'est cool c'est bien lisible:

Code : Sélectionner tout
1
2
3
4
5
 
#EX: Renvoyer un table de 10 fonctions differentes qui seront evaluées plus tard.
func = []
for x in [0..10] 
  do(x) -> func.push -> x*x
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
var x;
var func = [];

for (x = 0; x <= 10; x++) {
  func.push((function(x) {
    return function(){return x * x};
  })(x));
}


J'aime bien comment certains développeurs reste bloqués à la surface du concept du style "Les indentations c'est pas bien" ou autre... Je ne pense pas que l'on puisse juger un langage juste sur ce genre de "choix" à mon avis... Mais bon c'est que mon avis
0  0 
Avatar de xelab
Membre expérimenté https://www.developpez.com
Le 03/04/2014 à 11:31
Pour ma part j'utilise Coffeescript dès que je peux, c'est un gain de temps et de confort très appréciable! Je trouve que le blogueur s'est arrêté sur des trucs vraiment pas très graves, pas de quoi à mes yeux revenir à du JS natif qui est bien plus pénible à écrire et à lire.

Les histoires d'indentation forcée, pour moi c'est un faux débat. Je code aussi en Ruby et c'est juste très très confortable de pas avoir taper des accolades et des points virgules à toutes les lignes. C'est quand je dois refaire du code en PHP, Java ou JS natif que je trouve stupide de ne pas faire compiler un code à cause d'accolades oubliées. Et tous les préprocesseurs qui font foin des accolades et points virgules sont bons à prendre (SASS, HAML, Jade, que du bon) car en plus ça vous force à bien indenter le code. Et je peux dire en connaissance de cause que passer derrière un code mal indenté c'est une vraie plaie.
3  3 
Avatar de SylvainPV
Rédacteur/Modérateur https://www.developpez.com
Le 04/04/2014 à 10:47
Citation Envoyé par laerne  Voir le message
je préfère pas lire le code, même s'il est auto-indenté plus tard.

Et c'est nous qui faisons une fixette Un raccourci clavier c'est encore de trop ?

L'indentation, en programmation et plus généralement en typographie, a pour seul but de mettre en évidence l'organisation hiérarchique d'un texte : pas de changer le sens du texte ! J'estime qu'il n'est pas normal que ces deux codes renvoient un résultat différent:

Code coffeescript : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
n=0 
for i in [1..5] 
 n++ 
 n+=2 
 if n%2 
  n+=3 
 
 
console.log n 
 
 
 
 
n=0 
for i in [1..5] 
  n++ 
 n+=2 
 if n%2 
  n+=3 
     
console.log n

Un espace en plus ou en moins, c'est tout ce qu'il faut pour fausser le résultat d'un code CoffeeScript. Qu'on ne vienne pas dire que retirer les accolades et les points virgules rend le code plus lisible et facile à maintenir : c'est l'exact opposé. S'il suffisait de retours chariots et d'espaces insécables pour donner du sens, on aurait pas inventé la ponctuation. En voulant toujours plus "épurer" et "simplifier" la syntaxe, on vire au minimalisme et on amène tout un lot de problèmes de compréhension et de lisibilité juste pour satisfaire des caprices insensés : "c'est plus beau comme ça" ; "ça fait moins de code à taper".

Après, je ne crache pas sur tout ce qu'apporte CoffeeScript. Il présente de nombreux aspects très intéressants, sur la déclaration de variables, les keywords plus descriptifs, la déclaration d'Array... C'est juste ce principe d'indentation codante qui me fait tourner bourrique. Enfin, à chacun son avis et ses choix.
1  1