IoC в php

Читал-читал про инверсию управления (Inversion of Control), всякие Pico и Phemto.

Долго не мог понять, зачем может понадобиться что-то вроде этого

    interface Number {
        function getValue();
    }
 
    class One implements Number {
        function getValue() { return 1; }
    }
 
    class Two implements Number {
        function getValue() { return 2; }
    }
 
    class Adder implements Number {
        public $result;
 
        function __construct(One $a_one, Two $a_two) {
            $this->result = $a_one->getValue() + $a_two->getValue();
        }
 
        function getValue() {
            return $this->result;
        }
    }

// использование
   $injector = new Phemto();
   $injector->register('One');
   $injector->register('Two');
   $injector->register('Adder');
   $result = $injector->instantiate('Adder');
   $this->assertEqual($result->result, 3);

Потом случайно услышал одного умного человека, который сказал, что тоже не понимает, зачем нужен IoC Container в динамических языках. И тут-то я наконец осознал, что действительно есть языки со статической типизацией (тыщу лет такими уже не пользуюсь), и весь этот мегапаттерн — это на самом деле мегакостыль, чтобы пользоваться преимуществами динамического языка. Так что если кто-то мне скажет про то, как IoC исключительно полезен в том же PHP или Python, я или засмеюсь, или очень внимательно послушаю, что же я такого в этом мире не понимаю. Другое дело — Dependency Injection (Constructor Injection или Setter Injection, когда-нибудь напишу отдельный про это, а пока умная мысль, которую подслушал: «Setter Injection в принципе лучше использовать только при циклических зависимостях объектов»).

Ссылки по теме:
http://martinfowler.com/bliki/InversionOfControl.html
http://martinfowler.com/articles/injection.html
http://wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code
http://code.google.com/p/ovo-container/
http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection

LEAVE A COMMENT