В предыдущей части этой серии мы понизили связанность симфонийского контроллера и фреймворка, удалив зависимость от базового класса контроллера из FrameworkBundle
. А в этой части мы избавимся от некоторых неявных зависимостей, которые появляются из-за аннотаций.
Читать полностью »
Рубрика «dependency injection» - 10
Избавьтесь от аннотаций в своих контроллерах!
2014-06-26 в 16:07, admin, рубрики: dependency injection, php, symfony, symfony2Как делать независимые от фреймворка контроллеры?
2014-06-26 в 15:17, admin, рубрики: dependency injection, php, symfony, symfony2Обычно считается, что контроллеры — наиболее связанные классы в приложении. Как правило, на основании данных запроса они получают или сохраняют данные в базу данных, затем превращают данные или результат сохранения в HTML, который выступает в качестве ответа клиенту, который произвел запрос.
Получается, что контроллеры — повсюду, они соединяют те части приложения, которые обычно достаточно независимы друг от друга. Это сильно повышает связанность контроллеров: среди их зависимостей есть менеджер сущностей Doctrine, шаблонизатор Twig, базовый контроллер из FrameworkBundle, и прочее.
В этой записи я покажу, что этот уровень связанности совершенно не нужен. Я покажу вам, как значительно понизить связанность, предприняв всего несколько простых шагов. В результате мы получим контроллер, который можно будет повторно использовать в разных типах приложений, например, на базе Silex или даже Drupal.
Читать полностью »
Перевод legacy-проекта на Dependency Injection. Путь Ситха
2014-03-31 в 20:46, admin, рубрики: dependency injection, guice, java, spring, star wars, ненормальное программирование, печеньки, Программирование, метки: dependency injection, guice, java, spring, star wars, печеньки Внесу и свой вклад в тренд темного программирования.
Многим из вас знакома дилемма: использовать ли DI в своем проекте или нет.
Поводы перехода на DI:
- создание развитой системы авто-тестов
- повторное использование кода в различном окружении, в том числе в различных проектах
- использование 3rd-party библиотек, построенных на DI
- изучение DI
Доводы не использовать DI:
- усложнение понимания кода (поначалу)
- необходимость конфигурирования контекста
- изучение DI
Допустим, у нас есть большой рабочий проект, принято решение: переводить на DI. Разработчики чувствуют свой потенциал, уровень мидихлориан в крови зашкаливает.
Путь тебя ждет тернистый и долгий, мой юный падаван.
Если проект большой и в нем много разработчиков, одним коммитом вряд ли удастся сделать такой рефакторинг. Поэтому мы используем несколько плохих практик, упростив переход, а затем от них избавимся.
Читать полностью »
Внедрение зависимостей the Python way
2014-02-11 в 8:53, admin, рубрики: dependency injection, python, Программирование, метки: dependency injection, pythonЗачем нужно внедрение зависимостей? Оно уменьшает связанность компонентов в приложение и упрощает тестирование. У некоторых разработчиков есть мнение, что внедрение зависимостей нужно только в больших проектах и что оно сильно усложняет программы. Думаю, это исторически сложилось из-за популярный фрейморков вроде Спринга или Джуса в Джаве. Особенно из-за Спринга, который является невероятным комбайном.
Python-inject — это небольшая библиотека для внедрения зависимостей в Питоне. Третья версия написана в unix-стиле, т.е. она прекрасно выполняет только одну фукнцию и не пытается быть всем. В отличие от уже упомянутых Спринга и Джуса Инжект не ворует конструкторы классов у разработчиков, не навязывает разработчикам необходимость писать приложение в каком-то определенном стиле и не пытается управлять всем графом объектов приложения.
Инжект практически не требует конфигурации (об этом подробнее подкатом) и очень прост в использовании.
# Возможные зависимости
class Db(object): pass
class Mailer(object): pass
# Внедряем зависимости в класс пользователя
class User(object):
db = inject.attr(Db)
mailer = inject.attr(Mailer)
def __init__(self, name):
self.name = name
def register(self):
self.db.save(self)
self.mailer.send_welcome_email(self.name)
# Используем в тестах inmemory базу данных и моки.
class TestUser(unittest.TestCase):
def setUp(self):
inject.clear_and_configure(lambda binder: binder
.bind(Db, InMemoryDb())
.bind(Mailer, Mock()))
self.mailer = inject.instance(Mailer)
def test_register__should_send_welcome_email(self):
# Пример теста.
user = User('John Doe')
# Регистрируем нового пользователя.
user.register()
# Должно отправиться письмо с приветствием.
self.mailer.send_welcome_email.assert_called_with('John Doe')
Laravel: Dependency Injection на практике
2013-12-17 в 21:19, admin, рубрики: dependency injection, inversion of control, ioc, laravel, php, метки: dependency injection, inversion of control, ioc, laravel, PHPВ своих двух предыдущих статьях я рассказал о Dependency Injection и IoC контейнере, и о том, как они работают конкретно в Laravel. Данный пост будет посвящен практическому применению DI и IoC на реальном примере. А так же, какие все таки преимущества нам дают эти два прекрасных инструмента и паттерна в приложении.
Знакомимся с Dependency Injection на примере Dagger
2013-11-20 в 8:17, admin, рубрики: android, dependency injection, java, Разработка под android, метки: android, dependency injection, java
В данной статье мы попытаемся разобраться с Dependency Injection в Android (и не только) на примере набирающей популярность open source библиотеки Dagger
И так, что же такое Dependency Injection? Согласно википедии, это design pattern, позволяющий динамически описывать зависимости в коде, разделяя бизнес-логику на более мелкие блоки. Это удобно в первую очередь тем, что впоследствии можно эти самые блоки подменять тестовыми, тем самым ограничивая зону тестирования.
Несмотря на замудреное определение, принцип довольно прост и тривиален. Я уверен, что большинство из программистов так или иначе реализовывали этот pattern, даже порой об этом не догадываясь.
Рассмотрим упрощенную (до псевдокода) версию Twitter клиента.
Читать полностью »
Pimple? Не… Не слышал
2013-10-28 в 9:01, admin, рубрики: dependency injection, php, переводы, метки: dependency injection, PHP Удивительно, что на Хабре всё ещё нет статей об этом гениальном DI контейнере для PHP.
Почему гениальном? Потому, что весь код этого творения укладывается в 80 строк – маленький объект с большими возможностями.
Контейнер представляет из себя один класс, и его подключение в проект выглядит следующим образом:
require_once '/path/to/Pimple.php';
Создание контейнера так же просто:
$container = new Pimple();
Как и многие другие DI контейнеры, Pimple поддерживает два вида данных: сервисы и параметры.
Читать полностью »
Dependency Injection в Objective-C с Магией и Кровью
2013-10-20 в 20:46, admin, рубрики: bloodmagic, dependency injection, магия крови, Проектирование и рефакторинг, разработка под iOS, тяжелые, убей синглтонРазделения на MVC недостаточно
С каждым днем iOS приложения становятся все более громоздкими, в следствие чего одного MVC становится мало.
Мы видим все больше и больше классов различного назначения: логика выносится в сервисы, модели оборачиваются декораторами, крупные представления разбиваются на более мелкие части. И самое главное, что в этом случае у нас появляется масса зависимостей, и мы должны ими как-то управлять.
Очень часто для решения проблемы зависимостей используется Singleton, по сути глобальная переменная, к которой все имеют доступ.
Как часто вам приходилось видеть подобный код?
[[RequestManager sharedInstance] loadResourcesAtPath:@"http://example.com/resources" withDelegate:self];
// или
[[DatabaseManager sharedManager] saveResource:resource];
Этот подход используется во множестве проектов, но он имеет некоторые недостатки:
- тяжело застабать синглтон который используется внутри тестируемого класса
- синглтон, по сути, глобальная переменная
- с точки зрения SRP объект не должен контролировать свое Singleton'овское поведение
Первую проблему решить довольно просто — нужно использовать свойства:
@interface ViewController : UIViewController
@property (nonatomic, strong) RequestManager *requestManager;
@end
Но этот подход имеет другие минусы — теперь кто-то должен «заполнить» это свойство.
Магия Крови способствует решению этой проблемы.
Читать полностью »
Dependency Injection в Unity3d
2013-08-15 в 9:23, admin, рубрики: dependency injection, game development, unity3d, метки: dependency injection, unity3dДобрый день, уважаемые коллеги!
Так получилось, что к моменту начала работы с Unity3D, у меня был четырехлетний опыт разработки на .NET. Три года из этих четырех я успешно применял dependency injection в нескольких крупных промышленных проектах. Этот опыт оказался для меня настолько позитивен, что я постарался привнести его и в геймдев.
Сейчас уже могу сказать, что затеял это не зря. Дочитав до конца, вы увидите пример того, как dependency injection позволяет сделать код читабельнее и проще, но в то же время гибче, а заодно еще и более пригодным для юнит-тестирования. Даже если вы впервые слышите словосочетание dependency injection — ничего страшного. Не проходите мимо! Эта статья задумана как ознакомительная, без погружения в тонкие материи.
Читать полностью »