簡體   English   中英

依賴注入非實例性對象的優缺點

[英]Advantages & Disadvantages of Dependency-Injecting Non-Instantiable Objects

您認為JavaScript中依賴項注入非實例化對象的優缺點是什么?

您可能想探索的一些背景是:

  • 單元測試
    • 值得注射嗎? 畢竟,即使沒有dep-jection,您也可以為每個測試將不可實例化的“靜態”依賴項覆蓋到偽造對象。
  • 重構
    • 定位和重構非實例性依賴關系會變得更加困難嗎?
  • 可讀性
    • 哪種實現更容易遵循? 隱性或顯性對您來說重要嗎?
  • 文件大小


不可實例化的對象:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM