对于数据库中的一堆记录中的每一个,我都实例化一个类。在那个班里,我叫另一个班。
示例
$records = array(...);
foreach ($records as $record) {
$a = new A();
$data = $a->doSomething($record);
}
class A {
protected $b;
public function __construct()
{
$this->b = new B();
}
public function doSomething($param)
{
return $this->b->doSomething($param);
}
}
上面的代码是我目前的工作方式。然而,我想知道下面的代码是否会更好:
$records = array(...);
$b = new B();
foreach ($records as $record) {
$a = new A($b);
$data = $a->doSomething($record);
}
class A {
protected $b;
public function __construct($b)
{
$this->b = $b;
}
public function doSomething($param)
{
return $this->b->doSomething($param);
}
}
我想知道的是,这是否有效,其中哪个选项更好,是否还有其他更好的解决方案。
免责声明:不是PHP开发人员,但我对OOP的理解足以用。。。
选项2更好。
这实际上不是效率的问题,而是一种称为依赖注入的最佳实践的问题。
对于选项2,A
声明它需要一个$b
来创建自己。这使您能够在实例化A
的任何位置将$b
的实例替换为您想要的任何实例,而且它还使每段代码的需求更加清晰,从而使代码更易于维护。这很好,因为A
不在乎B
是否工作,以便A
工作。它只是处理注入的类。。其可以是也可以不是作为黑盒的CCD_ 8-。它是松散耦合的,仅依赖于B
的接口,而不是实现。
使用选项1,可以在类中实例化B
。这很好。。。直到你想测试你的代码。或者在运行时更改B
。然后它变得非常脆。因为每次您想要更改A
时,现在都必须更改B
。这意味着A
现在与B
紧密耦合,这本质上意味着,A
的工作还取决于B
的工作——这不是很容易维护,因为您的应用程序本质上变成了一个纸牌屋。
TLDR-始终选择选项2。这不是效率问题,而是可维护性问题。