her.esy.fun/src/Scratch/fr/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/index.html
Yann Esposito (Yogsototh) 059fabd7d0
many minor details to update
2022-10-26 11:38:50 +02:00

165 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>YBlog - Pas de CoffeeScript pour moi (malheureusement)</title>
<meta name="keywords" content="Coffeescript" />
<link rel="shortcut icon" type="image/x-icon" href="../../../../Scratch/img/favicon.ico" />
<link rel="stylesheet" type="text/css" href="../../../../css/y.css" />
<link rel="stylesheet" type="text/css" href="/css/legacy.css" />
<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="apple-touch-icon" href="../../../../Scratch/img/about/FlatAvatar@2x.png" />
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
<!-- IndieAuth -->
<link href="https://twitter.com/yogsototh" rel="me">
<link href="https://github.com/yogsototh" rel="me">
<link href="mailto:yann.esposito@gmail.com" rel="me">
<link rel="pgpkey" href="../../../../pubkey.txt">
</head>
<body lang="fr" class="article">
<div id="content">
<div id="header">
<div id="choix">
<span id="choixlang">
<a href="../../../../Scratch/en/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/">Anglais</a>
</span>
<span class="tomenu"><a href="#navigation">↓ Menu ↓</a></span>
<span class="flush"></span>
</div>
</div>
<div id="titre">
<h1>Pas de CoffeeScript pour moi (malheureusement)</h1>
</div>
<div class="flush"></div>
<div id="afterheader" class="article">
<div class="corps">
<div>
<img src="../../../../Scratch/img/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/main.png" alt="Title image" />
</div>
<div class="encadre">
<p><em>Mise à jour :</em> Je pense que je vais finallement changer davis. Pourquoi ? Tout dabord, je viens de découvrir un convertisseur javascript vers coffeescript, ensuite Denis Knauf ma laissé un commentaire et ma appris lexistence dune 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>
<div class="intro">
<p><span class="sc"><abbr title="Trop long; pas lu">tlpl</abbr>: </span> Quest-ce qui nallait 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 cest un peu instable.</p>
</div>
<p>Le commentaire le mieux classé de <a href="http://news.ycombinator.com/item?id=2053956">la question suivante</a> posée sur HackerNews mentionnait <a href="http://coffeescript.org">CoffeeScript</a>. Récemment jai beaucoup programmé en javascript. Après avoir essayé <a href="http://sproutcore.com">Sroutcore</a>, <a href="http://cappuccino.org">Cappuccino</a>, <a href="http://wiht.link/backbonejs-intro">backbone.js</a> <em>&amp;</em> <a href="http://javascriptmvc.com">javascriptMVC</a>, Je me suis décidé à créer mon propre framework MVC minimal pour client javascript.<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a></p>
<p>Je me suis battu avec lhorrible syntaxe de javascript. Cétait comme revenir des années dans le passé&nbsp;:</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 à linstance dune classe ;</li>
<li>etc…</li>
</ul>
<p>Jétais tellement ennuyé par tous ces point quil était arrivé un moment où je commençais à vouloir faire mon propre CoffeeScript.</p>
<p>Jai fini une première version de mon framework MVC en javascript et jai appris lexistence de CoffeeScript. Merci à git, jai immédiatement créé une nouvelle branche dans le seul but dessayer CoffeeScript.</p>
<p>Voici mon expérience&nbsp;:</p>
<ol type="1">
<li>Jai 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 jaurai aimé.</li>
<li>Les fichier javascript existants ne sont pas compatible avec coffee.</li>
<li>Il ny a pas script pour aider à transformer les anciens fichiers javascripts en fichier coffee. Du coups jai dû faire ça manuellement. Merci à <a href="http://vim.org">vim</a>, il ne fut pas très difficile de transformer 90% des fichiers avec des expressions régulières. Loption <code>--watch</code> de coffee était très utile pour debugger cette transformation. Cependant, il ma 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 navais pas pensé. Jai 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. Cest un peu comme écrire dans deux langages différents au même endroit. Ça ne me parraissait vraiment pas agréable.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>Avantages&nbsp;:</p>
<ul>
<li>Code plus lisible : CoffeeScript résoud la majorité des problèmes de syntaxes de javascript</li>
<li>Concision : jai gagné 14% de lignes, 22% de mots et 14% de caractères.</li>
</ul>
<p>Inconvénients&nbsp;:</p>
<ul>
<li>Ajout dune nouvelle étape de compilation avant de pouvoir vérifier le comportement de mon site</li>
<li>Facilité dutilisation : il ma 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>dinstaller <code>node.js</code>, <code>npm</code> et CoffeeScript ;</li>
<li>de se souvenir de lancer un script à chaque session de codage ;</li>
<li>dapprendre 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 javais à travailler seul, je nutiliserai certainement pas CoffeeScript. Il sagit dun tier dont la moindre mise à jour pourrait rendre mon code inutilisable. Cette situation mest déjà arrivée plusieurs fois et cest très désagrable. Beaucoup plus que coder avec une mauvaise syntaxe.</p>
<h2 id="digression">Digression</h2>
<p>Je suis attristé. Jespérais tant pouvoir programmer Javascript avec une touche de Ruby. En fin de compte, cette solution nest pas pour moi. Je vais devoir utiliser l<em>horrible</em> syntaxe javascript pour linstant. À la limite jaurai préféré un script Ruby2Js par exemple<a href="#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 laccè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 jattendrai de lui.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode ruby"><code class="sourceCode ruby"><a class="sourceLine" id="cb1-1" title="1">-&gt; </a>
<a class="sourceLine" id="cb1-2" title="2"><span class="kw">class</span> <span class="dt">MyClass</span></a>
<a class="sourceLine" id="cb1-3" title="3"> <span class="st">foo: </span>-&gt;</a>
<a class="sourceLine" id="cb1-4" title="4"> alert(<span class="st">'ok'</span>)</a>
<a class="sourceLine" id="cb1-5" title="5"></a>
<a class="sourceLine" id="cb1-6" title="6"> <span class="st">bar: </span>-&gt;</a>
<a class="sourceLine" id="cb1-7" title="7"> $(<span class="st">'#content'</span>).load( <span class="st">'/content.html'</span>, ( -&gt; <span class="ot">@foo</span>(x) ) )</a>
<a class="sourceLine" id="cb1-8" title="8"> <span class="co"># Ça n'appellera pas MyClass.foo</span></a></code></pre></div>
<p>La seule façon de résoudre ce problème est avec le code suivant&nbsp;:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode ruby"><code class="sourceCode ruby"><a class="sourceLine" id="cb2-1" title="1">-&gt; </a>
<a class="sourceLine" id="cb2-2" title="2"><span class="kw">class</span> <span class="dt">MyClass</span></a>
<a class="sourceLine" id="cb2-3" title="3"> <span class="st">foo: </span>-&gt;</a>
<a class="sourceLine" id="cb2-4" title="4"> alert(<span class="st">'ok'</span>)</a>
<a class="sourceLine" id="cb2-5" title="5"></a>
<a class="sourceLine" id="cb2-6" title="6"> <span class="st">bar: </span>-&gt;</a>
<a class="sourceLine" id="cb2-7" title="7"> <span class="dv">self</span>=this</a>
<a class="sourceLine" id="cb2-8" title="8"> $(<span class="st">'#content'</span>).load( <span class="st">'/content.html'</span>, ( -&gt; <span class="dv">self</span>.foo(x) ) )</a></code></pre></div>
<p>Sachant celà, la notation <code>@</code> perd tout son intérêt pour moi.</p>
<section class="footnotes">
<hr />
<ol>
<li id="fn1"><p>Je sais que ce nest certainement ni la meilleure ni la plus productive des décisions. Mais jaime bien fabriquer les choses pour savoir comment tout fonctionne dans le détail.<a href="#fnref1" class="footnote-back"></a></p></li>
<li id="fn2"><p>Je sais quil existe un projet <code>rb2js</code>, mais il ne résoud pas le problème dont je parle.<a href="#fnref2" class="footnote-back"></a></p></li>
</ol>
</section>
</div>
<div id="afterarticle">
<div id="social">
<a href="/rss.xml" target="_blank" rel="noopener noreferrer nofollow" class="social">RSS</a>
·
<a href="https://twitter.com/home?status=http%3A%2F%2Fyannesposito.com/Scratch/fr/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/%20via%20@yogsototh" target="_blank" rel="noopener noreferrer nofollow" class="social">Tweet</a>
·
<a href="http://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fyannesposito.com/Scratch/fr/blog/2011-01-03-Why-I-sadly-won-t-use-coffeescript/" target="_blank" rel="noopener noreferrer nofollow" class="social">FB</a>
<br />
<a class="message" href="../../../../Scratch/fr/blog/Social-link-the-right-way/">Ces liens sociaux préservent votre vie privée</a>
</div>
<div id="navigation">
<a href="../../../../">Accueil</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/blog">Blog</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/softwares">Logiciels</a>
<span class="sep">¦</span>
<a href="../../../../Scratch/fr/about">Auteur</a>
</div>
<div id="totop"><a href="#header">↑ Top ↑</a></div>
<div id="bottom">
<div>
Published on 2011-01-03
</div>
<div>
<a href="https://twitter.com/yogsototh">Follow @yogsototh</a>
</div>
<div>
<a rel="license" href="http://creativecommons.org/licenses/by/3.0/deed.en_US">Yann Esposito©</a>
</div>
<div>
Done with
<a href="http://www.vim.org" target="_blank" rel="noopener noreferrer nofollow"><strike>Vim</strike></a>
<a href="http://spacemacs.org" target="_blank" rel="noopener noreferrer nofollow">spacemacs</a>
<span class="pala">&amp;</span>
<a href="http://nanoc.ws" target="_blank" rel="noopener noreferrer nofollow"><strike>nanoc</strike></a>
<a href="http://jaspervdj.be/hakyll" target="_blank" rel="noopener noreferrer nofollow">Hakyll</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>