[英]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.