web-dev-qa-db-ja.com

Coffeescriptの長所と短所は何ですか?

もちろん、大きな利点の1つは、多くの場合、コードが短くなるために必要な構文の量です。 http://jashkenas.github.com/coffee-script/ には、印象的な例があります。一方、これらの例が複雑な現実世界のアプリケーションのコードを表していることに疑問を感じています。たとえば私のコードでは、裸のオブジェクトに関数を追加するのではなく、プロトタイプに関数を追加します。さらに、プロトタイプ機能はユーザーから隠されており、慣用的なJavaScriptではなく、古典的なOOPを示唆しています。

配列内包の例は、おそらく次のように私のコードで見られます:

cubes = $.map(list, math.cube); // which is 8 characters less using jQuery...
49
Philip

私は、CoffeeScriptに関する次の本の著者です。
http://pragprog.com/titles/tbcoffee/coffeescript

当時の言語はほんの数か月しかなく、現在よりもはるかに荒削りでしたが、CoffeeScriptを使用して約1週間後に使用する価値があると確信しました。公式サイトは、言語の機能(のほとんど)をリストアップするのに優れているので、ここでは繰り返しません。むしろ、私はこの言語の長所は次のとおりだと言います。

  1. 優れたJavaScriptパターンの使用を奨励する
  2. JavaScriptアンチパターンを阻止する
  3. 優れたJavaScriptコードをより短く読みやすくします

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 などの優れたライブラリは、これらの問題の一部を処理できますが、すべてを処理できるわけではありません。

短所のために:

  1. コンパイルは苦痛になる可能性があります。 CoffeeScriptコンパイラーがスローする構文エラーは、多くの場合あいまいです。将来的には、その道が進むことを期待しています。 (コンパイラーの防御では、JavaScriptで記述した場合、そのコード行が実行されるまでエラーとして発見されないことがしばしばキャッチされます。これらのバグは後で検出する方が良いでしょう。)
  2. 関連して、デバッグは面倒な場合があります。コンパイルされたJS行を元のCoffeeScriptに一致させる方法はまだありません(Firefoxの人々はこれが来ると約束していますが)。
  3. 変化する傾向があります。 CoffeeScriptの将来のバージョンでは、コードの実行が異なるか、まったく実行されない可能性があります。もちろん、これはほとんどの言語に当てはまります。RubyまたはPythonの新しいバージョンに移動することは似ています)—ただし、JavaScriptには当てはまりません。今日の主要なブラウザーで正常に実行されるコードは、Webが存在していることがわかっている限り、主要なブラウザーで正常に実行されると合理的に期待できます。
  4. それはあまり知られていない。 JavaScriptはlingua francaです。 CoffeeScriptは短期間で非常に人気が出てきましたが、JavaScriptほど広大なコミュニティを楽しむことはまずありません。

個人的にはプロの方が短所を上回ると思いますが、それはすべての人、チーム、プロジェクトに当てはまるわけではありません。 (Jeremy Ashkenasでも多くのJavaScriptを記述しています。)CoffeeScriptは、JavaScriptを置き換えるものではなく、JavaScriptの優れた補完物と見なすのが最適です。

54
Trevor Burnham

やや大規模なJavaScriptコードベースがあり、約1か月前にCoffeeScriptを試してみることにしました。開発者の1人が http://js2coffee.org/ を使用してJSからCSにモジュールの1つを移行することから始めました。このツールはかなり便利で、JavaScriptの1000行を移植するのに約2〜3時間かかりました。その時点で気づいたいくつかの観察:

  1. 結果のCoffeeScriptコードは非常に読みやすかったです。

  2. JavaScriptにコンパイルし直したところ、ナビゲートとデバッグは非常に簡単でした。そのモジュールを移植しているときに、チームの別の開発者がバグを発見しました。これらの2人の開発者は、古いJavaScriptコードとCSコンパイラから出てきた新しいJavaScriptコードのこのバグを修正しました。彼らは独立して働き、それと同じくらいの時間(15〜20分)かかりました。

  3. これはポートであるという事実により、結果のコードは適切または望ましいコーヒー固有の機能を使用していませんでした。 CoffeeScriptで最初から記述する場合、コードはより慣用的なものになります。そのため、後で既存のコードを移植しないことを決定しました。

  4. 一般に、短い関数と小さいオブジェクトの読みやすさはある程度向上しました。しかし、まったくそうではなかったより長い方法については。最大の節約は->と明示的な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コードよりも実際には読みにくいというものでした。

  5. CoffeeScriptのデバッグは予想よりも簡単でしたが、編集エクスペリエンスはかなり低下しました。この言語に適したエディタ/ IDEが見つかりませんでした。私たちはプロジェクトのクライアント側コードのエディター/ IDEで標準化しておらず、実際にはすべて異なるツールを使用しています。実際、チームの全員がCoffeeScriptに切り替えると、ツールからのサポートがかなり貧弱になることに同意します。 IDEおよびエディタープラグインは非常に初期の状態であり、適切な構文の強調表示やインデントのサポートさえ提供できない場合があります。コードスニペットやリファクタリングについて話していません。WebStorm、Eclipseを使用しています。 、NetBeans、VisualStudio、Notepad ++、SublimeText2。

  6. ツールについて言えば、CoffeScriptコンパイラ自体はNode JSパッケージとして提供されます。私たちは主にJava/.NETショップなので、誰もがWindowsボックスで開発しています。最近まで、Windowsサポートはほとんどありませんでした-Nodeに存在します。CoffeeScriptコンパイラーをWindowsで実行することができなかったため、当面は<script type="text/coffeescript">タグとブラウザーベースのオンザフライコンパイラーを使用することにしました。

    コンパイラは非常に高速で、起動時間をそれほど長くしません。欠点は、結果のJavaScriptがevaledになることと、ブラウザーの開発者ツール(特にIE8)でJavaScriptにブレークポイントを設定するのが少し難しいことです。デバッグに苦労した場合は、上にリストしたのと同じ移行ツールを使用してCoffeeScriptコードをプリコンパイルしますが、それでもまだあまり便利ではありません。

  7. varの自動挿入や脂肪矢印演算子(=>)を使用したthisの半透過的な管理など、CoffeeScriptの他の約束は、期待したほど多くの利益をもたらさないことがわかりました。ビルドプロセスの一部として既にJSLintを使用しており、言語のES3 x ES5-Strictサブセットでコードを記述しています。とにかく、Coffeeが同じ種類の "clean"コードを生成するという事実は、良いことです。すべてのサーバー側フレームワークが有効なHTML5およびCSS3マークアップも生成したいと思います!

    とは言っても、CoffeeScriptがvarキーワードを入力することで多くの時間を節約できるとは言いません。欠落しているvarsは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よりもさらに悪いものです。

11
c69

私の心の中で最大のプロは:

簡単なcoffescriptは、書いておくべきはずのjavascriptにコンパイルされますが、簡単ではなかったため、作成しませんでした。

Javascriptのいくつかの厄介なコーナーがあり、警戒を怠らないと回避できません-頭の上の例:

  • プロトタイプを正しく設定する
  • ==の代わりに===を使用する
  • nullの確認
  • varを使用してすべての変数を宣言する
  • すべてを自己実行型の無名関数でラップします。

あなたがcoffeescriptを書いた場合、それらはすべてあなたのために処理されます自動的に

短所は、IMO、ほとんどマイナーです:

  • デバッグは面倒です
  • Coffeescriptプログラマーが少ない
  • ドキュメントをjavascriptからcoffeescriptに翻訳する必要があります。
7
Sean McMillan

長所

  1. CoffeeScriptはJavaScriptについてさらに学ぶのに役立ちました
  2. 複雑にネストされたコールバックであっても、かなり読みやすい
  3. 言語の問題を追跡するのが難しいjavascriptの一部に安全を提供します

上記のAndrewの実用的な例は、啓蒙的であることがわかりました。既存のオブジェクトリテラルリターンの可読性は、リターンを手動で識別するだけで強化されると思います

返す

//ここにオブジェクトリテラル

IDEツールが拡張され、TextMateおよびCloud9がCoffeeScriptをサポートしています。確かに、Windowsのサポートは遅れています(ただし、Web開発全般についてはそうではありませんか?)

短所

ブラウザーで解釈されたCoffeeScriptはデバッグが難しい場合があります。

これは、JavaScriptの上に追加されるレイヤーであり、開発者による理解と考慮が必要です。

3
user38265

長所

  1. 彼らは一般的なケースを統語論的に本当に最適化しました。実際、CoffeeScriptは、「一般的に」使用されている最も簡潔な言語ではないにしても、その1つです http://redmonk.com/dberkholz/2013/03/25/programming-表現力によってランク付けされた言語/
  2. javaScriptの悪い部分を隠します(auto-coercion ==、暗黙のグローバル、より伝統的なクラスシステムにより、一般的なことが簡単になります)
  3. python/Rubyプログラマーにとって習得が非常に簡単
  4. 複数行の無名関数+空白構文

短所

  1. varの削除は、オブジェクトを使用せずに内部スコープ内の外部スコープ変数を変更できないことを意味します。または、 `var fall_back_to_js;`がハッキングします= 'これは値を再割り当てするだけなので、obj.naem:= 5つのタイプミスをデバッグしやすくします]
  2. javaScriptをデバッグしたくない場合を除いて、すべてのツールにそのことを知らせなければなりません:(;ところで:Chromeからソーススクリプトのサポートを追加してCoffeeScriptをデバッグできます; yeoman(npm install yeoman)が役立ちますあなたはCoffeeScript用のgulpまたはgrunt設定ファイルを書きます
  3. オプションの静的型付けなし(次のEcmaScript標準を待つ必要があります)
  4. モジュールシステム用のサードパーティライブラリがまだ必要です
  5. 注意すべき構文トラップ:暗黙的な戻り値、abg oa(b(g(o))を意味します)、fp、b:2、c:8は、f(p、{b:2}、{c:8})ではなくf(p、{b:2、c:8})を意味します
  6. 壊れたJavaScriptの番号/タイプシステムは変更されません
0
aoeu256