我经常看到Zend Framework使用return $this;
的链式调用风格 - 从我的角度来看:
优点:这种风格似乎是不错的,可以在同一个对象上链接多个操作并使代码更简洁。
缺点:当你看到对象返回自身的方法执行其他操作时(例如某个属性的setter方法),代码看起来有些奇怪。
这是真正的良好实践还是反模式?
编辑: 我过于夸大其辞地将其称为 "模式",谢谢大家指正!
我经常看到Zend Framework使用return $this;
的链式调用风格 - 从我的角度来看:
优点:这种风格似乎是不错的,可以在同一个对象上链接多个操作并使代码更简洁。
缺点:当你看到对象返回自身的方法执行其他操作时(例如某个属性的setter方法),代码看起来有些奇怪。
这是真正的良好实践还是反模式?
编辑: 我过于夸大其辞地将其称为 "模式",谢谢大家指正!
我发现方法链在某些情况下非常有用,比如在特定领域的语言中:
$query->select('*')->from('users')->where(array('user_id' => 1, 'verified' => 1));
void
,因此return $this
仅仅是写成这样的简写形式:$query->select('*'); $query->from('users'); $query->where(...);
我们仍将调用 toSQL()
或 execute()
方法来利用我们填充对象的数据。
在我看来,这不是一种反模式,并且在正确的情况下可以作为一种合法、明智的对象填充方法。
if (obj.length)
);另外还有一个自相矛盾的问题,即它仍然需要打破可链接性,比如对于返回字符串的getAttribute()
等方法。最终,程序员只看到他得到了相同的对象,而不是流畅接口类代码内部的样子。我认为流畅接口最大的优点是代码可读性。如果您想听到一个缺点,那就是调试流畅链可能比较困难。