もちろん、大きな利点の1つは、多くの場合、コードが短くなるために必要な構文の量です。 http://jashkenas.github.com/coffee-script/ には、印象的な例があります。一方、これらの例が複雑な現実世界のアプリケーションのコードを表していることに疑問を感じています。たとえば私のコードでは、裸のオブジェクトに関数を追加するのではなく、プロトタイプに関数を追加します。さらに、プロトタイプ機能はユーザーから隠されており、慣用的なJavaScriptではなく、古典的なOOPを示唆しています。
配列内包の例は、おそらく次のように私のコードで見られます:
cubes = $.map(list, math.cube); // which is 8 characters less using jQuery...
私は、CoffeeScriptに関する次の本の著者です。
http://pragprog.com/titles/tbcoffee/coffeescript
当時の言語はほんの数か月しかなく、現在よりもはるかに荒削りでしたが、CoffeeScriptを使用して約1週間後に使用する価値があると確信しました。公式サイトは、言語の機能(のほとんど)をリストアップするのに優れているので、ここでは繰り返しません。むしろ、私はこの言語の長所は次のとおりだと言います。
No. 3は最初の2つ(私の本でも)よりもはるかに注目されていますが、考えれば考えるほど、私はかなりの構文だけでジャンプしなかったことがわかります。言語が私をより良く、エラーが起こりにくいJavaScriptに向けて動かしたので、私はジャンプをしました。簡単な例をいくつか示します。
var
を省略して誤ってグローバルを上書きしたり、同じ名前の変数をシャドーしたり(名前付き引数を除く)、異なるファイルに変数を相互作用させたり( https://stackoverflow.com/questions/5211638/pattern-for-coffeescript-modules/5212449 )。->
_はfunction(){}
よりもはるかに簡単に記述できるため、コールバックを使用する方が簡単です。セマンティックインデントにより、コールバックがネストされていることが明確になります。また、_=>
_を使用すると、必要に応じてthis
を保持しやすくなります。unless x
_は英語を話す人にとってif (!x)
よりも解析が簡単で、_if x?
_はif (x != null)
よりも簡単なので、例を2つ挙げれば、より少ない脳を費やすことができます。ロジック構文を繰り返し、さらにロジック自体を繰り返します。Underscore.js などの優れたライブラリは、これらの問題の一部を処理できますが、すべてを処理できるわけではありません。
短所のために:
個人的にはプロの方が短所を上回ると思いますが、それはすべての人、チーム、プロジェクトに当てはまるわけではありません。 (Jeremy Ashkenasでも多くのJavaScriptを記述しています。)CoffeeScriptは、JavaScriptを置き換えるものではなく、JavaScriptの優れた補完物と見なすのが最適です。
やや大規模なJavaScriptコードベースがあり、約1か月前にCoffeeScriptを試してみることにしました。開発者の1人が http://js2coffee.org/ を使用してJSからCSにモジュールの1つを移行することから始めました。このツールはかなり便利で、JavaScriptの1000行を移植するのに約2〜3時間かかりました。その時点で気づいたいくつかの観察:
結果のCoffeeScriptコードは非常に読みやすかったです。
JavaScriptにコンパイルし直したところ、ナビゲートとデバッグは非常に簡単でした。そのモジュールを移植しているときに、チームの別の開発者がバグを発見しました。これらの2人の開発者は、古いJavaScriptコードとCSコンパイラから出てきた新しいJavaScriptコードのこのバグを修正しました。彼らは独立して働き、それと同じくらいの時間(15〜20分)かかりました。
これはポートであるという事実により、結果のコードは適切または望ましいコーヒー固有の機能を使用していませんでした。 CoffeeScriptで最初から記述する場合、コードはより慣用的なものになります。そのため、後で既存のコードを移植しないことを決定しました。
一般に、短い関数と小さいオブジェクトの読みやすさはある程度向上しました。しかし、まったくそうではなかったより長い方法については。最大の節約は->
と明示的なreturn
によるものですが、それ以外のコードは大幅に短くまたは単純化されていませんでした。一部の構文、特にオブジェクトリテラルは、非常に混乱しているように見えました。 CSは、メンバー定義の周りの中括弧を省略し、 "everything-is-an-expression"および暗黙のreturn
と組み合わせると、コードの一部が読みにくくなります。
JavaScriptは次のとおりです。
var rabbitGenerator = {
makeRabbit: function(rabbitName, growCarrots) {
if (growCarrots) {
carrots.growMore(10);
} else {
carrots.ensureSupply();
}
return {
name: rabbitName,
height: 0,
actions: {
jump: function (height) {
this.height += height;
},
eatCarrot: function () {
// etc
}
}
};
},
// more members
}
そして、対応するCoffeeScriptコードは次のようになります。
rabbitGenerator =
makeRabbit: (rabbitName, growCarrots) ->
if growCarrots
carrots.growMore 10
else
carrots.ensureSupply()
name: rabbitName // (*)
height: 0
actions:
jump: (height) ->
@height += height
eatCarrot: ->
現在、returnステートメントが(*)
行で始まることを理解するのは非常に困難です。このプロジェクトでは、オブジェクトリテラルに大きく依存しています。それらを関数パラメーターとして渡し、他の関数から返します。多くの場合、これらのオブジェクトは非常に複雑になる傾向があります。異なるタイプのメンバーといくつかのレベルのネストがあります。私たちの場合、全体的な感じは、CoffeeScriptコードはプレーンなJavaScriptコードよりも実際には読みにくいというものでした。
CoffeeScriptのデバッグは予想よりも簡単でしたが、編集エクスペリエンスはかなり低下しました。この言語に適したエディタ/ IDEが見つかりませんでした。私たちはプロジェクトのクライアント側コードのエディター/ IDEで標準化しておらず、実際にはすべて異なるツールを使用しています。実際、チームの全員がCoffeeScriptに切り替えると、ツールからのサポートがかなり貧弱になることに同意します。 IDEおよびエディタープラグインは非常に初期の状態であり、適切な構文の強調表示やインデントのサポートさえ提供できない場合があります。コードスニペットやリファクタリングについて話していません。WebStorm、Eclipseを使用しています。 、NetBeans、VisualStudio、Notepad ++、SublimeText2。
ツールについて言えば、CoffeScriptコンパイラ自体はNode JSパッケージとして提供されます。私たちは主にJava/.NETショップなので、誰もがWindowsボックスで開発しています。最近まで、Windowsサポートはほとんどありませんでした-Nodeに存在します。CoffeeScriptコンパイラーをWindowsで実行することができなかったため、当面は<script type="text/coffeescript">
タグとブラウザーベースのオンザフライコンパイラーを使用することにしました。
コンパイラは非常に高速で、起動時間をそれほど長くしません。欠点は、結果のJavaScriptがeval
edになることと、ブラウザーの開発者ツール(特にIE8)でJavaScriptにブレークポイントを設定するのが少し難しいことです。デバッグに苦労した場合は、上にリストしたのと同じ移行ツールを使用してCoffeeScriptコードをプリコンパイルしますが、それでもまだあまり便利ではありません。
var
の自動挿入や脂肪矢印演算子(=>
)を使用したthis
の半透過的な管理など、CoffeeScriptの他の約束は、期待したほど多くの利益をもたらさないことがわかりました。ビルドプロセスの一部として既にJSLintを使用しており、言語のES3 x ES5-Strict
サブセットでコードを記述しています。とにかく、Coffeeが同じ種類の "clean"コードを生成するという事実は、良いことです。すべてのサーバー側フレームワークが有効なHTML5およびCSS3マークアップも生成したいと思います!
とは言っても、CoffeeScriptがvar
キーワードを入力することで多くの時間を節約できるとは言いません。欠落しているvar
sはJSLintによって簡単にキャッチされ、簡単に修正できます。さらに、しばらくの間それによって修正されると、とにかく自動的に良いJavaScriptを書き始めます。したがって、私はコーヒーがこの点で本当にそれ役立つとは言いません。
CoffeeScriptを約1週間評価しました。チームメンバー全員がコードを記述していて、私たちの経験を互いに共有しました。私たちはそれを使っていくつかの新しいコードを書き、適切だとわかったときにいくつかの既存のコードを移植しました。言語についての私たちの感情はさまざまでした。
一般的に、それは私たちの開発をスピードアップしなかったと言いますが、それも私たちを遅くしていません。タイピングの減少とエラーサーフェスの減少による速度の向上は、他の領域、主にツールサポートでのスローダウンにより相殺されました。 1週間後、CoffeeScriptの使用を強制しないことを決定しましたが、禁止もしません。 自由に選択できるようにしてください。実際には、少なくとも今のところ誰も使用していません。時々、新しい機能のプロトタイプを作成し、コードをJavaScriptに変換してから残りの部分と統合することを考えていますプロジェクトをより早く開始するために、私はまだそのアプローチを試していません。
長所
表示 トレヴァー・バーナムの答え 。
さらに、JavaScriptの汚れをいじるのではなく、流行の仕事をしているヒップな男のように自分を考えることができます。
短所
CoffeeScriptは、構文糖とピンクのメガネにすぎません。
簡単なこと-簡単なことはどんな言語でも簡単なので、CoffeeScriptは冗長です。そして、jQueryはおそらくCoffeeScriptよりもさらに単純です。
難しいもの-あなたはあなたの媒体を理解する必要があります。そしてあなたの媒体はHTML、DOM、CSSであり、Javascriptはそれらを相互接続するための単なるツールですが、すべてのAPIはJavascript専用に書かれています。 「実際の」言語にコンパイルされる他の言語を使用すると、Java(GWT)、Dart、CoffeeScriptのいずれであっても、かなり危険です。
アンチパターンや言語ルールの平凡な無知は、1冊から2冊の良い本を読むことで解決できます。そして、Coffeescriptには独自のアンチパターンがあるのは確かです。
IDEによるCoffeescriptのサポートは、JSよりもさらに悪いものです。
私の心の中で最大のプロは:
簡単なcoffescriptは、書いておくべきはずのjavascriptにコンパイルされますが、簡単ではなかったため、作成しませんでした。
Javascriptのいくつかの厄介なコーナーがあり、警戒を怠らないと回避できません-頭の上の例:
あなたがcoffeescriptを書いた場合、それらはすべてあなたのために処理されます自動的に。
短所は、IMO、ほとんどマイナーです:
上記のAndrewの実用的な例は、啓蒙的であることがわかりました。既存のオブジェクトリテラルリターンの可読性は、リターンを手動で識別するだけで強化されると思います
返す
//ここにオブジェクトリテラル
IDEツールが拡張され、TextMateおよびCloud9がCoffeeScriptをサポートしています。確かに、Windowsのサポートは遅れています(ただし、Web開発全般についてはそうではありませんか?)
ブラウザーで解釈されたCoffeeScriptはデバッグが難しい場合があります。
これは、JavaScriptの上に追加されるレイヤーであり、開発者による理解と考慮が必要です。