DI,添加一个对象只是为了交给它是一个坏迹象吗?

时间:2016-11-06 16:29:02

标签: php

class A
{
    public function doIt($c)
    {
        if (rand(0,1) == 1) // this means, we dont know if we need to create the object or not
        {
             $b = new B($c);
        }
    }
}

class B
{
}

class C
{
}

$c = new C();
$a = new A();
$a->doIt($c);

问题是,A不需要$c或了解C。不过,我们必须通过它来处理B。这不是一个坏兆头吗?我认为是,因为AB无关。

1 个答案:

答案 0 :(得分:1)

您可以通过采用dependency injection模式来改进这一点。这样A实例不需要知道$c,甚至不需要知道如何创建B实例。

相反,您将为A实例提供注入器功能,即A需要调用的回调以获取B的实例

这样您也不会失去原始代码中的优势:B的实例仅在需要时创建。但是这个优势也扩展到C实例的创建:它只在需要时创建:

class A {
    public function doIt(Callable $factory) {
        $b = 'nothing';
        if (rand(0,1) == 1) {
             // Call the callback to get the B instance:
             $b = $factory();
        }
        // other code...
        //
        return $b;
    }
}

class B { }

class C { }

$a = new A();
$b = $a->doIt(function () {
    $c = new C();
    return new B($c);
});
var_dump($b);

注意:如果您只需要A执行此类操作,则可以考虑将doIt方法创建为static方法。然后,您不需要实际创建A的实例:

class A {
    public static function doIt(Callable $factory) {
       // ...etc
}
// ...

$b = A::doIt(function () {
    return new B(new C());
});