Как выполнить рефакторинг кода с помощью множества классов, созданных с помощью конструктора, и глубокой иерархии?

У меня есть некоторый код, который я хотел бы изменить. Это выглядит так:

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, я не уверен, будет ли оно того стоить.

Я ищу лучшие способы рефакторинга такого кода.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]