Ковыряюсь в руби. Появился некоторый навык и теперь хочется докопаться до подробностей.
Полез посмотреть, как там с моей навязчивой идеей об IoC. Для PHP эта концепция красиво и легковесно (300 строк кода) решена в
Phemto (рус. перевод
здесь). Более продвинуто концепция реализована в
компоненте для Symfony.
В Руби, однако, такая концепция не дает столь замечательных результатов, поскольку там в класс можно добавлять и переопределять методы уже после того, как класс объявлен и объект создан. А также там есть механизм модулей:
# connection_provider.rb
module ConnectionProvider
def connection
# open a database connection and return it
end
end
# reopening the class to mix the module in
class Repository
include ConnectionProvider
end
Т.е. минимальная инъекция может быть сделана средствами языка.
В сообществе есть Jamis Buck, который сначала сделал тяжелый IoC для руби -
Copland. О котором делал доклад на рубиконф в 2004. По следам доклада Jim Weirich написал статью
Dependency Injection in Ruby о том, как можно сделать легкий DI контейнер без тяжелой артиллерии.
Подход, изложенный в статье очень похож на Phemto, о котором я уже говорил.
Вдохновившись такой легковесностью, Jamis Buck делает еще один фреймворк, --
Needle Он пытается использовать концепт в своих проектах. В частности в библиотеке Net::SSH 1. И постепенно приходит к выводу, что фреймворк для IoC в Руби не нужен, -- все, что нужно от DI можно сделать встроенными средствами. Таким образом ценность концепции DI для руби сохраняется.
В результате автор двух фреймворков пишет длинный лирично-исторический пост
LEGOs, Play-Doh, and Programming.
Ну что ж, пока не попробуешь, не поймешь насколько удобно без библиотеки для контейнера. В PHP, из-за отсутствия гибкости, данный подход очень часто спасал от неконтролируемых зависимостей.
Дополнительное чтение:
Fabio Kung,
Ruby and dependency injection in a dynamic world