2011-10-02 8 views
2

私はCoffeeScriptについて読んでいますが、まだ言語の配置を試みています。何ができるか、ベストプラクティスなどです。私はより多くのように私の二つの質問は、あなたが少し笑顔にすることを強く型付けされた言語(AS3、ジャワ、スカラ座)を使用してい:)Coffeescriptのカスタムコレクションと変更可能性

質問1:カスタムコレクション

カスタムコレクションについてどう思いますか? JS/CSは、この側面で最も弱い言語の1つです。たとえば、Array.removeはありません。代わりに面倒なsplice()メソッドを使用する必要があります。 (アンダースコアのように)いくつかの関数ライブラリは、最初の引数として配列/オブジェクトを取ったが、私は書くことを好むだろう選択肢を与えられた機能を提供することで、APIを強化:

list fancyFunction 3, 4 

ではなく

fancyFunction list 3, 4 

をの私を言ってみましょうListクラスを作成します。それが可能かどうか、そしてもしそうなら、このクラスがCSの理解構文を使用するために必要なことは何ですか?最悪のシナリオでは、ListにtoArray()メソッドを持たせることができ、代わりにその戻り値に対して通常のCS操作を実行できますが、より良い解決策があることを願っています。

理想的には、私が内包を失うことのコストで豊富な、カスタムコレクションを定義できるようにしたいが、ないだろう、など

質問2:可変性

非常に慎重であることについて、人々の感情は何ですか一般的にCS/JSでの可変性はありますか?

私は様々なコードをオンラインで読むとき、私はすべてが変更可能であるという印象を持っています。人々は一般的に、気にしないでコードの行を少なくする方が良いと一般的に思っています。

不変の基本的なPointクラス対可変たとえば

、(うまくいけば、私は何か間違ったことをやっていないよ)

変更可能な

class Point 
    constructor: (@x, @y) -> 

不変

class Point 
    constructor: (x, y) -> 
    @x = -> x 
    @y = -> y 

ないようにはるかに複雑けどやや奇妙な構文。もう一つの考慮すべき点は、JSは人間にとって最も速いものではなく、純粋主義者のためにループ内にたくさんのオブジェクトを作成しなければならないということは、パフォーマンスが犠牲になる可能性があるということです。私は、新しいPointオブジェクトを作成するコストとベンチマークのメンバを変更するコストをベンチマークしませんでした。

薄いAPIで通信するモジュールがたくさんある大きなアプリを想像してみてください。不変のオブジェクトを渡す必要はありませんか?あるいは代わりに防御的なコピーを実行しますか?

注:私は知っている言語にCSを試してみようとしていません。むしろ、他の言語で認められている概念の一部を再利用することが理にかなっているかどうかを知りたいと思っています。

おかげ

+1

"JSは人間にとって最も速いものではありません">あなたは驚くかもしれません。 JSは、ブラウザ戦争のおかげで、最も速い言語の1つになっています。 http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php、http://attractivechaos.github.com/plb/。オブジェクト/関数を作成する際のオーバーヘッドもごくわずかです。http://jsperf.com/object-and-function-creation –

答えて

6

私はこのショート答えはJavaScriptが万能であるということだと思うが、それは安全ではないのです。静的型はなく、何も不変ではありません(あなたの例のように、別のスコープで分離されている場合を除く)。この緩みと戦おうとする人もいます。たとえば、GoogleではJavaDocスタイルのコードに大きな注釈を付けます。しかし、主流のJavaScriptプログラマはそうではありません。ゲッターの背後にあるインスタンス変数を隠すことはめったになく、ブール値を予期したときに文字列でAPIを呼び出すと例外がスローされます。これは部分的には実用的な理由があります.SSは、コードのバイトサイズについて人々がよく話すところで私が知っている唯一の言語ですが、ドキュメンテーションやテストが手持ちのものよりもはるかに高い言語の文化を反映しています。

だから、要するに、私は

constructor: (@x, @y) -> 

に固執し、いくつかの良いテストを書くと思います。 APIを誤って使用しても、それを防ぐことはできません。優れたドキュメントやテストを通じて適切な使用法を明確にすることをお勧めします。

_(list).remove ... 

それとも、[アレイ]プロトタイプを拡張することができます:ところで

は、アンダースコアは、所望の順序で、あなたのコードを書くことができます別の構文を提供します。詳細な例については、Sugar.jsを参照してください。

+0

最後に、一般的なルールとして、次のアプローチをとることにしました。 1)シンプルシムライブラリ 2)より豊富な操作のためのより豊富な型を作成する(foldLメソッドなどのリストのように) 3)カプセル化/不変性であまり気にしないでください。それはJSの標準であると思われ、開発者が豚でない場合はおそらくうまく動作します。 – AlexG

関連する問題