?

Log in

No account? Create an account
Main

Ruby и IoC

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

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

Comments

я не освоился еще пока до конца с этой кухней, так, что не буду строить предположений. не готов пока спорить, очень новая для меня эта материя.