[英]Advantages & Disadvantages of Dependency-Injecting Non-Instantiable Objects
您认为JavaScript中依赖项注入非实例化对象的优缺点是什么?
您可能想探索的一些背景是:
不可实例化的对象:
WindowFactory = {
buildWindow: function() {
return {};
}
};
依赖注入:
(House = function(windowFactory) {
this.windowFactory = windowFactory;
}).prototype = {
build: function() {
var window = this.windowFactory.buildWindow();
}
};
var house = new House(WindowFactory);
与非依赖注入变量:
(House = function() {
}).prototype = {
build: function() {
var window = WindowFactory.buildWindow();
}
};
var house = new House();
我的主要目标是使上面的代码可测试。 我已经习惯了将可实例化依赖项外部化(例如, var window = new Window(); var house = new House(window);
)。 这在对可初始化对象(例如House
)进行单元测试时会有所帮助,因为我可以使用伪造的对象( var fakeWindow = {}; var house = new House(fakeWindow);
)来实例化对象,而不是真实的依赖项( Window
var fakeWindow = {}; var house = new House(fakeWindow);
不得不担心在测试我的对象时冗余测试依赖项。 (这种形式的依赖项注入在测试依赖于通过XHR,DOM事件,sessionStorage或cookie检索的某些数据的对象时也很有用。)
现在,当依赖项本身就是一个可实例化的对象时,对我来说好处显而易见。 但是,当依赖项是不可实例化的对象时(例如,上面代码中的WindowFactory),我对有用性有了第二个想法。
如果您在单元测试中有所收获,那对我来说可能绰绰有余。 您将能够干净地测试功能,而无需依赖于全局/外部状态。 然后增加的红利变为可读性; 您可以在函数的参数中清楚地显示所依赖的全局状态/ api。
能够在测试的设置/拆卸中更改静态方法是解决该问题的方法,但我个人认为它容易出错,并且很麻烦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.