Преимущества и недостатки неинстанцируемых объектов, в которые вводят зависимости - PullRequest
2 голосов
/ 13 марта 2011

Каковы, на ваш взгляд, преимущества и недостатки неинстанцируемых объектов для внедрения зависимостей в JavaScript ?

Некоторый контекст, который вы, возможно, захотите изучить:

  • Юнит-тестирование
    • Стоит ли вводить инъекцию?В конце концов, вы можете перезаписать неинстанцируемую «статическую» зависимость для фальшивого объекта для каждого теста даже без развертывания.
  • Рефакторинг
    • Становится ли труднее найти и реорганизовать неинстанцируемую зависимость?
  • Читаемость
    • Какой реализации легче следовать?Важна ли для вас неявность или явность?
  • Размер файла

Код

Неинстанцируемый объект:

WindowFactory = {
  buildWindow: function() {
     return {};
  }
};

Введено зависимостей:

(House = function(windowFactory) {
  this.windowFactory = windowFactory;
}).prototype = {
  build: function() {
    var window = this.windowFactory.buildWindow();
  }
};

var house = new House(WindowFactory);

vs.Вариант без зависимостей:

(House = function() {
}).prototype = {
  build: function() {
    var window = WindowFactory.buildWindow();
  }
};

var house = new House();

Контекст

Моя основная задача - сделать приведенный выше код тестируемым.У меня появилась привычка экстернализировать инстанцируемые зависимости (например, var window = new Window(); var house = new House(window);).Это помогает при модульном тестировании инстанцируемых объектов (например, House), поскольку вместо реальных зависимостей (Window) я могу создать экземпляр объекта с фальшивкой (var fakeWindow = {}; var house = new House(fakeWindow);), и мне не нужно беспокоиться о избыточном тестировании зависимостейво время тестирования моего объекта.(Эта форма внедрения зависимости также полезна при тестировании объектов, которые зависят от некоторых данных, извлекаемых с помощью XHR, DOM-событий, sessionStorage или cookie.)

Теперь, когда зависимость является самим объектом, который может быть создан,польза для меня очевидна;но когда зависимость является неинстанцируемым объектом (например, WindowFactory в приведенном выше коде), у меня возникают мысли о полезности.

1 Ответ

1 голос
/ 28 апреля 2011

Если вы получите некоторый выигрыш в юнит-тестировании, этого может быть более чем достаточно для меня.Вы сможете точно протестировать функциональность, не завися от глобального / внешнего состояния.Добавленный бонус затем становится читабельностью;вы ясно показываете, от какого глобального состояния / API вы зависите в аргументах своей функции.

Возможность изменения статических методов в настройке / разборке тестов - это обходной путь для проблемы, но я лично нахожуэто должно быть подвержено ошибкам и рутинной работе.

...