DOM、ThreeJS、そして現在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 が以下で指摘しているように、連鎖用に設計されたメソッドが他の値を返すことができないことです。これはかなり無駄に思えます。