1 апр. 2010 г.

Внедрение зависимостей (Dependency Injection)

При написании программ мне давно уже не нравилось использовать какие-то общие статические класса для обращения к базе данных например, но до последнего времени альтернативы не знал.
Посмотрев видео с Google Developer Days 2009 о создании Google Wave вынес для себя подход к разработке с использованием отдельной шины событий, по возможности хранение в каждом контроле собственной копии объекта, с которым он связан и принцип внедрения зависимостей (dependency injection).
Принцип внедрения зависимостей гласит - все объекты, от которых зависит данный должны в него передаваться. В объекте не должны создаваться какие-то объекты напрямую, отсутствуют обращения к статическим переменным/константам.
Т.е. например у нас есть форма, показывающая и изменяющая объект в базе данных. Внутри этой формы не должно быть вызовов вроде Common.getDB(). - объект для работы с базой данных передается в него через конструктор (предпочтительно) или устанавливается через вызов метода, но не берется из какого-то внешнего класса внутри самой формы и не создается внутри формы.
Так же все дочерние элементы, которые создаются в объекте.
При создании дочерних объектов конструктор объекта не вызывается напрямую, а создается фабрикой внедрения зависимостей (Injector).
Создание объектов через фабрику внедрения зависимостей позволяет:
1. Указывать конкретные типы создающихся объектов где-то в другом месте (аннотация в коде, конфигурационный файл, вызов методов и т.п.).
2. Опустить процесс написания собственных фабрик и передачи кучи параметров из одного объекта в другой (объект настроек приложения, объект для работы с БД и т.п.)
Первый пункт позволяет облегчить создание модульных тестов: вместо всех объектов, от которых зависит проверяемый объект ему передаются заглушки, которые просто фиксируют что сделал объект и простейшим образом реализуют нужные интерфейсы. Это позволяет тестировать каждый объект отдельно, без связи с остальными объектами
Второй пункт сильно снижает рутинное написание фабрик объектов.
В этом же видео были упомянуты разработки Google для простого реализации принципе внедрения зависимостей:
Guice для Java
Gin для GWT

Комментариев нет:

Отправить комментарий