7. Locator.prototype.locateUsers = function(users) {
// Create map service
// Could be an Fabric Method, Service Locator, DI
var mapService = new ConcreteMapService(...);
!
// Create map
var map = mapService.createMap(...);
!
// Run each users, making markers
users.forEach(...);
}
7
8. Single responsibility?
Locator.prototype.locateUsers = function(users) {
// Create map service
// Could be an Fabric Method, Service Locator, DI
var mapService = new ConcreteMapService(...);
!
// Create map
var map = mapService.createMap(...);
!
// Run each users, making markers
users.forEach(...);
}
8
9. Проблемы
• Невозможно написать юнит тесты;
• Использование сервиса карт во многих местах в
коде;
• Избыточная функциональность локатора;
• Reusability.
9
10. Задача из жизни
1. Разместить на карте зарегистрированных
пользователей;
2. Поменять поставщика карт;
3. Перенести локатор в другой проект, как плагин.
10
11. Result
Locator.prototype = {
// injection
setMapService: function(mapService) {
this.mapService = mapService;
},
!
locateUsers: function(users) {
// Create map
var map = this.mapService.createMap(...);
!
// Run each users, making markers
users.forEach(...);
}
}
11
20. Плюсы
• Каждый объект отвечает за свою функцию;
• Соблюден принцип инверсии зависимостей;
• Простая конфигурация объектов;
• Безболезненная смена имплементаций;
• Легко писать юнит тесты.
20
21. dm.js
• Javascript Реализация IoC;
• Работает в node.js и браузере;
• Легко расширяется (любые загрузчики скриптов
и Promise/A+ библиотеки);
• Простая конфигурация (в духе Symfony).
21