Контейнеры Ioc и динамические языки (дубль 2) - PullRequest
5 голосов
/ 20 января 2011

Я много читал о внедрении зависимостей, инверсии управления и контейнерах IoC. Я также в основном программирую на динамических языках (PHP на работе, Python на дому). Вот вещи, которые я нахожу, но это оставляет много пробелов для меня, чтобы заполнить их, когда я собираю все это вместе:

Итак, что я читаю: контейнеры IoC намного более эффективны в статических языках, потому что намного проще выполнять DI в динамических языках. Но они также предоставляют преимущества, выходящие далеко за рамки DI, такие как управление зависимостями для вас и избавление от необходимости связывать дюжину объектов вручную. И, кстати, они сложные, поэтому не пытайтесь делать их самостоятельно (но хороших для PHP не существует).

Я чувствую, что эта информация оставляет меня ... застрявшей. Что мне с этим делать? Я работаю в очень большой кодовой базе с очень сложными зависимостями (и, вероятно, острой потребностью в рефакторинге, но это еще одна параллельная проблема). До сих пор мы очень плохо справлялись с реализацией DI, и я действительно стараюсь направить нас в правильном направлении. Похоже, что в динамических языках и IoC (или, по крайней мере, в контейнерах IoC) ничего нет.

Не лучше ли мне на время "связать вручную" зависимости и беспокоиться о том, чтобы автоматизировать их в контейнере позже, после того, как я лучше справлюсь с принципами? Стоит ли реализовывать свой собственный простой контейнер IoC? Или это преимущество в конечном итоге не стоит затрат в PHP?

Ответы [ 5 ]

3 голосов
/ 28 января 2011

Для PHP попробуйте Инъекция зависимостей Symfony .Это (предположительно - у меня слишком мало опыта, чтобы это проверить) основано на том, как работает Java Spring, но также использует много «волшебства» PHP.В результате он довольно легкий и простой в использовании, но при этом способен на многое.

1 голос
/ 07 января 2012

Сначала исправьте проблемы с зависимостями.Если вы используете IoC-контейнер в качестве пакета, который отвечает за ваши зависимости, он действительно сильно укусит вас, не слишком далеко вниз по линии.

Контейнеры IoC должны предоставить вам API / словарь для разговоров об архитектуре системы.

Внедрение зависимостей приводит к тому, что вы используете меньшие развязанные классы, которые выступают в качестве строительных блоков для подсистем.Это хорошо, так как позволяет вам тестировать ваши строительные блоки изолированно и легко обдумывать их.(Вы можете думать о них как о электронных компонентах в цепи)

Контейнеры IoC должны дать вам возможность четко выразить состав этих строительных блоков.(схема соединений, связывающих компоненты)

Наличие такого разделения также позволяет вам задуматься о времени жизни ваших подсистем .. когда использовать фабрики, реестры, как передавать сообщения по системе, не вводя связывание ..и т. д.

Смысл МОК в том, чтобы дать вам место для явного изложения всей этой логики, а не для ее волшебного разгадывания.

Надеюсь, это поможет.

0 голосов
/ 31 января 2011

Если вы считаете, что ваш IoC / может быть более легковесным, чем у других фреймворков, и если у вас достаточно времени для его разработки, постройте свой собственный.Я лично использую IoC в моей инфраструктуре MVC просто для связи View с контроллером.Я управляю представлением и его параметрами из реестра (ассоциативного массива стандартизированной структуры). Модели обрабатываются как внешние сервисы.Я также нашел IoC и DI в первый раз на Java, поэтому я пытался взять лучшее из обоих языков (Java и PHP), когда строил свой. Конечно, он ничего не связывает ни с чем, но мне это не нужно для моего случая,так что вы не можете.

IoC важен для обеспечения гибкости с течением времени, но насколько гибкость?Вы работаете со многими внешними компонентами?Вы работаете со стандартными плагинами и объектами?PHP - это не java, у вас нет такого хорошо разработанного пакета jar-файлов и библиотек, которые можно было бы реализовать в любое время, просто загрузив его и заменив директиву в XML для указания на него, подумайте об этом.

Iобнаружил отличную реализацию IoC на исключительном программном обеспечении с открытым исходным кодом под названием Alfresco (Система управления документами).Это продукт, который объединяет шаблоны JSF, Spring, Hibernate и freemarker, но, как я уже сказал, это продукт, предназначенный для встраивания в тысячи бизнес-моделей, он больше похож на высокоразвитую платформу, которую нужно бесконечно изменять, поэтомудолжна быть очень гибкой.

Если вы разрабатываете целевое приложение, предназначенное для обслуживания одной бизнес-модели и нескольких клиентов, то погружение в расцвет IoC усложнит, а не упростит.

Эйнштейн сказал, что все должно быть просто, но не проще, чем они.

0 голосов
/ 31 января 2011

Если вы не хотите иметь перепроектированный DIC, а тот, который поставляет все, что вам нужно, очень компактно, попробуйте это: Bucket (https://github.com/troelskn/bucket). Контейнеру DI больше не нужно. Кроме того, Symfony часто используется очень опасным способом, как локатор службы (более хорошее глобальное состояние псевдонима).

0 голосов
/ 26 января 2011

Мартин Фаулер написал эту статью, которая в значительной степени является библией для инверсии управления и внедрения зависимостей.Он объясняет, как реализовать контейнер IoC, и обсуждает преимущества различных механизмов внедрения.http://martinfowler.com/articles/injection.html

Независимо от того, на каком языке вы используете «зависимости от руки», он не масштабируется.Это будет трудно поддерживать, потому что другие разработчики, вероятно, не знают, где происходит все ручное связывание, поэтому, когда они изменяют что-то, они могут не изменить правильную вещь.Напротив, размещение всего этого в одном месте значительно облегчит реализацию будущих изменений.IoC помогает минимизировать повторяющийся код и обеспечивает разделение задач и согласованную архитектуру приложения.

С другой стороны, звучит так, как будто у вас в руках довольно большое работающее приложение - и если у вас не так много времени, если оно не сломано, возможно, нет необходимости исправлять.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...