【发布时间】:2019-04-30 22:40:32
【问题描述】:
从这里引用:https://en.wikipedia.org/wiki/Law_of_Demeter
更正式地说,函数的得墨忒耳定律要求一个方法 对象 O 的 m 只能调用以下类型的方法 对象:[2]
O 本身
m的参数
在 m 中创建/实例化的任何对象
O 的直接组件对象
一个全局变量,可由 O 访问,在 m的范围
特别是,对象应避免调用成员的方法 另一个方法返回的对象
详情如下:
class O
{
private $c;
public function m($obj1)
{
$this->a(); // OK
$obj1->a(); // OK
(new C())->a(); // OK
$c->a(); // OK
$a = function() { };
$a(); // OK
}
private function a() {}
}
现在第三定律是有问题的。所以我新创建了一个对象。但如果我不是:
(new C())->a();
我愿意:
$this->factory->createC()->a();
它仍然有效吗?一个普通的类被实例化了,只是不是由new 而是一个工厂。但是,嘿!法律说:
特别是,一个对象应该避免调用另一个方法返回的成员对象的方法
按照这个规则,工厂方法失败了!怎么办?真的失败了吗?
【问题讨论】:
标签: php oop factory law-of-demeter