<p><em>Mise à jour :</em> Je pense que je vais finallement changer d’avis. Pourquoi ? Tout d’abord, je viens de découvrir un convertisseur javascript vers coffeescript, ensuite Denis Knauf m’a laissé un commentaire et m’a appris l’existence d’une fonction <code>CoffeeScript.eval</code>. De plus, il faut voir CoffeeScript comme javascript avec une syntaxe similaire à Ruby et pas comme un langage similaire à Ruby.</p>
</div>
<divclass="intro">
<p><spanclass="sc"><abbrtitle="Trop long; pas lu">tlpl</abbr>: </span> Qu’est-ce qui n’allait pas avec Coffeescript? La meta-programmation, il faut le “vendre” aux autres, une nouvelle étape de compilation intermédiaire sans fournir les avantages de Cappuccino, la sensation que c’est un peu instable.</p>
</div>
<p>Le commentaire le mieux classé de <ahref="http://news.ycombinator.com/item?id=2053956">la question suivante</a> posée sur HackerNews mentionnait <ahref="http://coffeescript.org">CoffeeScript</a>. Récemment j’ai beaucoup programmé en javascript. Après avoir essayé <ahref="http://sproutcore.com">Sroutcore</a>, <ahref="http://cappuccino.org">Cappuccino</a>, <ahref="http://wiht.link/backbonejs-intro">backbone.js</a><em>&</em><ahref="http://javascriptmvc.com">javascriptMVC</a>, Je me suis décidé à créer mon propre framework MVC minimal pour client javascript.<ahref="#fn1"class="footnote-ref"id="fnref1"><sup>1</sup></a></p>
<p>Je me suis battu avec l’horrible syntaxe de javascript. C’était comme revenir des années dans le passé :</p>
<ul>
<li>une syntaxe à la Java très verbeuse ;</li>
<li>une syntaxe follement verbeuse et étrange pour la programmation orientée objet ;</li>
<li>pas de manière naturelle de se référer à l’instance d’une classe ;</li>
<li>etc…</li>
</ul>
<p>J’étais tellement ennuyé par tous ces point qu’il était arrivé un moment où je commençais à vouloir faire mon propre CoffeeScript.</p>
<p>J’ai fini une première version de mon framework MVC en javascript et j’ai appris l’existence de CoffeeScript. Merci à git, j’ai immédiatement créé une nouvelle branche dans le seul but d’essayer CoffeeScript.</p>
<p>Voici mon expérience :</p>
<oltype="1">
<li>J’ai dû installer <code>node.js</code> et utiliser <code>npm</code> simplement pour utiliser CoffeeScript. Ce n’était pas très difficile, mais pas aussi facile que ce que j’aurai aimé.</li>
<li>Les fichier javascript existants ne sont pas compatible avec coffee.</li>
<li>Il n’y a pas script pour aider à transformer les anciens fichiers javascripts en fichier coffee. Du coups j’ai dû faire ça manuellement. Merci à <ahref="http://vim.org">vim</a>, il ne fut pas très difficile de transformer 90% des fichiers avec des expressions régulières. L’option <code>--watch</code> de coffee était très utile pour debugger cette transformation. Cependant, il m’a fallu écrire mon propre script pour que tous mes fichiers soient <em>watchés</em> dans tous les sous-répertoires.</li>
<li>Quelque chose à laquelle je n’avais pas pensé. J’ai fait un peu de meta-programmation en javascript en utilisant <code>eval</code>. Mais pour que celà fonctionne correctement, il faut que la chaîne de caractère que je passe à <code>eval</code> soit codée en javascript et pas en coffee. C’est un peu comme écrire dans deux langages différents au même endroit. Ça ne me parraissait vraiment pas agréable.</li>
</ol>
<h2id="conclusion">Conclusion</h2>
<p>Avantages :</p>
<ul>
<li>Code plus lisible : CoffeeScript résoud la majorité des problèmes de syntaxes de javascript</li>
<li>Concision : j’ai gagné 14% de lignes, 22% de mots et 14% de caractères.</li>
</ul>
<p>Inconvénients :</p>
<ul>
<li>Ajout d’une nouvelle étape de compilation avant de pouvoir vérifier le comportement de mon site</li>
<li>Facilité d’utilisation : il m’a fallu créer un script pour gérer la génératio automatique des fichiers</li>
<li>Il faut apprendre un autre langage proche de ruby</li>
<li>La meta-programmation devient une expérience désagréable</li>
<li>Je dois convaincre les personnes travaillant avec moi :
<ul>
<li>d’installer <code>node.js</code>, <code>npm</code> et CoffeeScript ;</li>
<li>de se souvenir de lancer un script à chaque session de codage ;</li>
<li>d’apprendre un autre language proche de ruby.</li>
</ul></li>
</ul>
<p>Les deux derniers points étant de mon point de vue les plus problématiques.</p>
<p>Mais même si j’avais à travailler seul, je n’utiliserai certainement pas CoffeeScript. Il s’agit d’un tier dont la moindre mise à jour pourrait rendre mon code inutilisable. Cette situation m’est déjà arrivée plusieurs fois et c’est très désagrable. Beaucoup plus que coder avec une mauvaise syntaxe.</p>
<h2id="digression">Digression</h2>
<p>Je suis attristé. J’espérais tant pouvoir programmer Javascript avec une touche de Ruby. En fin de compte, cette solution n’est pas pour moi. Je vais devoir utiliser l’<em>horrible</em> syntaxe javascript pour l’instant. À la limite j’aurai préféré un script Ruby2Js par exemple<ahref="#fn2"class="footnote-ref"id="fnref2"><sup>2</sup></a>. Mais il me semble que ça serait un travail très difficile rien que pour simuler l’accès à la classe courante.</p>
<p>Typiquement <code>@x</code> est transformé en <code>this.x</code>. Mais le code suivant ne fait pas ce que j’attendrai de lui.</p>
<p>Sachant celà, la notation <code>@</code> perd tout son intérêt pour moi.</p>
<sectionclass="footnotes">
<hr/>
<ol>
<liid="fn1"><p>Je sais que ce n’est certainement ni la meilleure ni la plus productive des décisions. Mais j’aime bien fabriquer les choses pour savoir comment tout fonctionne dans le détail.<ahref="#fnref1"class="footnote-back">↩</a></p></li>
<liid="fn2"><p>Je sais qu’il existe un projet <code>rb2js</code>, mais il ne résoud pas le problème dont je parle.<ahref="#fnref2"class="footnote-back">↩</a></p></li>