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
Для отправки комментария вам необходимо авторизоваться.