如何使用许多构造函数实例化的类和深层次结构重构代码?

时间:2015-01-22 22:11:28

标签: php dependency-injection refactoring

我有一些我想重构的代码。它看起来像这样:

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();
    }
}

我正在考虑的是使用DI构造函数将各个类传递给Calc。也就是说,由于所有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,直到所有内容都是构造函数-Ded?有没有更好的办法?我只是单独留下代码吗?

问题:如何处理具有大量子类和深层次结构的代码(比如一个3-4级的树,每个类在构造函数中实例化大约4-5个类) )。我最初的想法是使用DI,“简化它”,但是看看重构DI所涉及的所有工作,看看我们如何在DI上进行DI,我不确定是否值得。

我正在寻找更好的方法来重构这些代码。

0 个答案:

没有答案