У меня есть некоторый код, который я хотел бы изменить. Это выглядит так:
class Calc
{
function __construct($product = null)
{
// original code
$this->spec = new Spec();
$this->price = new Price();
$this->motor = new Motor();
$this->drive = new Drive();
$this->turbine = new Turbine();
$this->pump = new Pump();
// new code:
if ($product == "S")
$this->option = new OptionsS();
else
$this->option = new Options();
}
}
Я собираюсь передать отдельные классы в Calc с помощью DI через конструктор. А именно, так как все new
классы обязательны я рассматриваю что-то вроде этого:
$array = array(
'spec' => new Spec(),
'price' = new Price(),
...
'option' = (new OptionFactory($product))->returnOption()),
);
$calc = new (Calc($array));//then
class Calc
{
function __construct($array)
{
// original code
$this->spec = $array['spec'];
$this->price = $array['price'];
...
$this->option = $array['option'];
}
}
Я думаю, что это сработает. Предостережение в том, что есть еще один класс, который нуждается в Calc
, А именно:
class ProductA extends Product
{
function __construct() {
$this->calc = new Calc();
$this->tech = new Tech();
$this->plot = new Plot();
$this->outline = new Outline();
...
$this->input = new Input();
}
}
который поставит меня с DI на паттерн DI. Должен ли я просто применять DI рекурсивно, пока все не станет конструктором? Есть ли способ лучше? Я просто оставляю код в покое?
Вопрос: Как работать с кодом, который имеет много дочерних классов и глубокую иерархию (скажем, дерево классов с глубиной 3-4 и каждый класс имеет около 4-5 классов, созданных внутри конструктора). Моя первоначальная мысль — использовать DI, чтобы «упростить его», но, глядя на всю работу, связанную с рефакторингом для DI, и видя, как у нас есть DI на DI, я не уверен, будет ли оно того стоить.
Я ищу лучшие способы рефакторинга такого кода.
Задача ещё не решена.
Других решений пока нет …