Ruby и IoC

Oct 07, 2010 19:24

Ковыряюсь в руби. Появился некоторый навык и теперь хочется докопаться до подробностей.

Полез посмотреть, как там с моей навязчивой идеей об 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

php, rails, development, ruby

Previous post Next post
Up