2

DOMThreeJS、そして現在canvasにはすべて、メソッドチェーンを提供するために書かれたライブラリがあります (おそらく jQuery で最もよく知られています)。連鎖はコア C ライブラリでも使用されています。

これらの流暢なインターフェースは、関心のあるオブジェクトの不必要な繰り返しを回避します。比較:

var cx = cq(640, 480);
cx.drawImage(image, 0, 0);
cx.fillStyle("#ff0000");
cx.fillRect(64, 64, 32, 32);
cx.blur();
cx.appendTo("body");

に:

cq(640, 480)
  .drawImage(image, 0, 0)
  .fillStyle("#ff0000")
  .fillRect(64, 64, 32, 32)
  .blur()
  .appendTo("body");

以前の「伝統的な」スタイルは冗長であり、DRYに違反していると主張することができます。

変数の繰り返しを避けるために、一部の言語ではステートメントcxを使用して一連の呼び出しを表現できます。with

with ( cq(640, 480) ) {
    drawImage(image, 0, 0);
    fillStyle("#ff0000");
    fillRect(64, 64, 32, 32);
    blur();
    appendTo("body");
}

JavaScript のwithステートメントはタイプミスがあると危険ですが、Scala のより制限的withなステートメントは安全に使用できます。また、Haxe はそのusingキーワードを介してローカル スコープへの関数のインポートも提供します。残念ながら、Java と C にはそのような近道がないため、従来のコードとチェーンのどちらかを選択する必要があります。

言語の作成者は安全withなステートメントをメソッドチェーンの代替として検討する必要がありますか?それともそれを避ける十分な理由がありますか? そのような機能が望ましいとすれば、それはどのような形をとるべきでしょうか?


メソッドの連鎖に関して私が懸念していることの 1 つは、連鎖内の後続の呼び出しの主題に関するあいまいさが、 の繰り返し使用が明示的であったコードをコンパイルするときに以前に利用可能だった最適化を妨げる可能性があることです。cxたとえば、cxのメソッドへの呼び出しがオーバーラップしない場合、それらは並列化できますが、チェーンされた例では、コンパイラがこれを確認するのが難しい場合があります。

もう 1 つの欠点は、rambo が以下で指摘しているように、連鎖用に設計されたメソッドが他の値を返すことができないことです。これはかなり無駄に思えます。

4

2 に答える 2

2

メソッドチェーンと呼ばれます。これはFluent Interfaceの議論によく出てきます。

おそらく最大の欠点は、連鎖を可能にするために暗黙のオブジェクトを返さなければならないため、値を返すことができないことです。すべてのメソッドが値を返さずに意味をなすわけではなく、連鎖可能なメソッドとそうでないメソッドを持つインターフェイスになってしまいます。

言語機能がなくても機能が大幅に失われることはないため、言語機能が欠落していることを示しているとは思いません。しかし、このようなものの言語サポートは興味深いかもしれません。

于 2013-01-05T02:23:25.427 に答える
1

これは言語機能の欠落ではなく、言語機能です。欠落している場合、Javascript でそれを行うことはできません。

これは構文ではありません。代わりに、それは設計パターンです。そして、それは連鎖と呼ばれます。実際、チェーンのみを実装するライブラリがあります。たとえば、DED|Chain は YUI2 のチェーンを実装するライブラリですが、チェーンを念頭に置いて作成されていません。

(あなたが言及したように実際にjsで実装されている)のような特殊な構文withは、あなたがそれを何と呼んでも問題があります(「on」という名前を使用することを提案しましたが、「with」が持つすべての問題があります)。

問題は、コードブロック内で、メソッドまたは変数がオブジェクトのメソッドを参照している場合、またはタイプミスがあり、誤ってグローバル変数またはオブジェクトの一部ではないがスコープ内にある変数。

もちろん、混乱を招く可能性のある変数名やメソッド名を使用しないようにするのは、プログラマーの仕事であると言えます。その場合、使用できますwith

于 2013-01-05T02:12:42.783 に答える