我有一些我想重构的代码。它看起来像这样:
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,我不确定是否值得。
我正在寻找更好的方法来重构这些代码。