2013-07-17 10 views
8

Underscore.JS源(https://github.com/jashkenas/underscore/blob/master/underscore.js)によれば:なぜUnderscore.js chain()メソッドが怠惰ではないのですか?

// Start chaining a wrapped Underscore object. 
chain: function() { 
    this._chain = true; 
    return this; 
}, 

// Extracts the result from a wrapped and chained object. 
value: function() { 
    return this._wrapped; 
} 

鎖()と値()関数は、アンダー・オブジェクトの単純なラッパーです。

私は次のような構成使用しているのであれば:

_.chain(someCollection) 
.map(function1) 
.map(function2) 
.map(function3) 
.value() 

を下線は二つの中間のコレクションを作成し、3つの列挙を実行します。

LINQのように評価された遅延がそのメソッドを実装するため、chain()メソッドとvalue()メソッドが実装されないのはなぜですか?たとえば、このチェーンは次のように扱うことができます。

このような実装にはJS関連の問題はありますか?

答えて

12

基本的に.chain()を記述するのが怠け者になるためには、各メソッドのバージョンがほぼ2つ必要です。ドキュメントが述べる(配列を返す)即時の応答メソッドが必要で、遅延評価を行う遅延メソッドが必要になります(各要素の後で実行されることを期待する関数を返します)。

これを実装する1つの方法は、すべてのアンダースコアを遅延として記述し、これを連鎖したアンダースコアとして公開することです。その後、通常のアンダースコアをレイジーアンダースコアのラッパーとしてエクスポーズし、怠惰なアンダースコアを呼び出し、すぐに評価してから結果を返します。 (1)はるかに多くの作業があります。(2)チェーンメソッドの遅延評価をサポートするために、すべてのアンダースコアを怠惰な形で記述する必要があります。

JSLinqと.NETのLINQで展示されているように確かに実行可能ですが、開発とメンテナンスのための開発時間とバグの可能性が増します。アンダースコアは、1,200行のコードで80種類のユーティリティメソッドの非遅延評価を提供します。 JSLinqは、7,000行のコードで21種類のユーティリティメソッドの遅延評価を提供します。より多くのコード、少ない機能量。

トレードオフがあります。各開発者は、自分のために働いている限り、自分の意思決定を下すことができます。

7

私はあなたがLazy.jsような何かを探していると信じて:

Lazy.jsは、アンダースコアに類似したJavaScriptのためのユーティリティライブラリ、およびLO-ダッシュが、1つの重要な違いである:としても知られている遅延評価(遅延実行)。これは、多くの場合、特に大規模な配列を扱う場合や、複数のメソッドを「連鎖する」場合、優れたパフォーマンスにつながります。小さな配列の単純なケース(mapfilterなど)の場合、LazyのパフォーマンスはUnderscoreまたはLo-Dashに似ているはずです。

編集:それはLo-Dash may be adding the ability to do lazy evaluationているかのようにも見えます。

関連する問題