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
的语句作为方法链接的替代方案,还是有充分的理由避免使用它?如果这样的功能是可取的,它应该采取什么形式?
我对方法链接的一个担忧是,关于链中后续调用的主题的模糊性可能会阻止在编译代码时先前可用的优化,其中重复使用cx
是明确的。例如,如果对cx
's 方法的调用不重叠,它们可以被并行化,但编译器在链接示例中可能更难确定这一点。
正如 rambo 在下面指出的那样,另一个缺点是为链接设计的方法无法返回任何其他值,这似乎相当浪费。