我在洗澡,想到了什么。推迟/承诺推动违反德米特法律吗?
递延/许模式是降低callback hell,通过允许开发者链通话功能,如提及here:
Parse.User.logIn("user", "pass").then(function(user) {
return query.find();
}).then(function(results) {
return results[0].save({ key: value });
}).then(function(result) {
// the object was saved.
});
从我的头顶 - 纠正我,如果我错了 - 但它似乎使用延期/承诺是打破德米特法简单的方法?
迪米特法则规定:
的对象的方法可以仅调用方法:
- 对象本身。
- 该方法的一个论据。
- 该方法内创建的任何对象。
- 对象的任何直接属性/字段。
每个单位对其他单位的知识应该是有限的:只有 单位与当前单位“密切”相关。或者:每个单位应该只有 与其朋友交谈;不要与陌生人交谈。
对此有何评论?
更新2013年12月1日:
一个总结我的问题的版本。 Promise框架旨在简化异步编码并避免“callback hell”。 Promise最有利的功能之一是,您可以使用.then()
来链接呼叫事件,如上面的示例所示。
鉴于所有的代码/功能,现在使用的承诺(如本杰明Gruenbaum(下面笔者)目前正在做),会不会它打开它,使链通话功能很容易通过去.then().then().then()
等
编写链接调用函数的代码(.then().then().then()
)必须是如何打破得墨忒耳定律的教科书范例。
因此我的问题; Promise框架是否促进/开放/更容易滥用/打破Demeter法律?
不能确定“淋浴声明”在这里有任何帮助... :) – benzonico
JavaScript函数不需要遵守Demeter法则,这使得闭包(一种超级方便的范例)不可能。在另一种意义上,使用apply/call可能实际上会重新定义法律中的“对象”,从而在实际执行之前使JS符合。无论如何,这并不重要。 – dandavis
我不明白你为什么认为这打破了德米特法则。你列出的所有方法只调用作为参数传递的函数(OO倾斜列表中第二个选项的泛化)和返回对象。在链中,那些对象有自己的方法被调用。 – kybernetikos