Каковы, на ваш взгляд, преимущества и недостатки неинстанцируемых объектов для внедрения зависимостей в 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 в приведенном выше коде), у меня возникают мысли о полезности.