Практикувам инжектиране на зависимости на конструктора в моето PHP приложение. Не исках да затрупвам кода си със създаване на обекти, така че фабриките са на помощ, или поне така си мислех.
Започнах да свързвам компоненти с фабрики, след което някои фабрики започнаха да използват други фабрики, за да получат зависимости, страхотно, пази целия код за създаване на едно място. Въпреки това, след като фабриките започнат да се използват една друга (или както в кода по-долу, себе си), се натъкнах на проблеми с кръгова зависимост, които просто не могат да бъдат разрешени. Например, моята MapperFactory използва себе си, за да инжектира картографи с други картографи (те се нуждаят един от друг, за да изградят пълна обектна графика „нетърпеливо зареждане“):
class MapperFactory
{
public function create($type)
{
switch (true) {
case 'Item':
$mapper = new ItemMapper(
$this->create('Field')
);
break;
case 'Field':
$mapper = new ItemMapper(
$this->create('Item')
);
break;
default:
throw new Exception('Unknown mapper');
}
return $mapper;
}
}
$mf = new MapperFactory();
$mf->create('Item');
Това е опростен пример, но все по-често срещан проблем с развитието на приложението. Грешка обратно от PHP (инсталиран xdebug) е:
Fatal error: Maximum function nesting level of '100' reached, aborting!
Разбирам напълно защо PHP се оплаква (въпреки че не го очаквах, TBH).
Въпросът ми е напълно ли съм пропуснал смисъла на фабриките? използвам ли правилно фабриките? Изглежда не, но освен кръговата зависимост (доста голяма, но), фабриките са елегантно решение за скриване на цялата логика на конструкцията/окабеляването далеч от основното приложение.
switch (true) ...
не е това, което искахте да напишете. Но дори и сswitch ($type)
ще получите безкраен цикъл, ако$type
еField
илиItem
. - person Yoshi   schedule 13.08.2012