【发布时间】:2014-12-18 05:01:35
【问题描述】:
我正在阅读 http://misko.hevery.com/attachments/Guide-Writing%20Testable%20Code.pdf(尤其是第 8 页)并观看 Misko 关于编写可测试代码的 Youtube 视频,我突然想到 Angular 执行 DI 的方式迫使您违反 Demeter 定律。
从PDF简化,一个Java构造函数违反得墨忒耳定律的例子:
class AccountView {
boolean isAdmin;
AccountView(AccountService) {
isAdmin = AccountService.getCurrentUser().getProfile().isAdmin();
}
}
因为该类只需要用户是否是管理员,而不需要 AccountService。
似乎 Angular 用它的 DI 迫使你打破得墨忒耳定律。我看不到以下内容的替代方案:
.controller('AccountServiceController',
['AccountService',
function(AccountService) {
this.user = AccountService.getCurrentUser().getProfile().isAdmin();
}]
);
如果这是一个控制器,一个控制器是一个具有解析参数的路由器,我们可以注入一个用户,但不适用于一般情况。有什么想法吗?请注意,我假设只有 AccountService 是一个单例,并且每个后续对象都是一个实例(并且不能是 DI)。
【问题讨论】: