我在洗澡,想到了什麼。推遲/承諾推動違反德米特法律嗎?
遞延/許模式是降低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