Lai*_*jus 13 php oop design-patterns anti-patterns
我已经多次看到使用return $this;
模式样式的Zend Framework - 从我的观点来看:
Pro:对于在同一个对象上链接许多操作并使代码更短,似乎是非常糟糕的模式样式.
Con:当你看到该对象在方法中返回自己时,代码看起来有点奇怪,这会做其他事情(例如某些属性的setter)
它是真正好的模式实践还是反模式实践?
编辑:好吧,从我这边说它有点太多了"模式",感谢大家指点我正确的方向!
我发现方法链在有意义的情况下很有用; 特定于域的语言,例如:
$query->select('*')->from('users')->where(array('user_id' => 1, 'verified' => 1));
Run Code Online (Sandbox Code Playgroud)
问题是,这些方法只会返回void
,所以它return $this
只是作为写作的简写版本:
$query->select('*'); $query->from('users'); $query->where(...);
Run Code Online (Sandbox Code Playgroud)
我们仍然会调用toSQL()
或者execute()
方法来使用我们填充对象的数据.
在我看来,它不是一种反模式,可以在适当的情况下作为一种合法的,合理的对象种群方法.
如果你的意思是"良好做法或不良做法",这是我的看法:
从好的方面来说,你会得到一些语法糖.
在不利方面,您放弃有意义的返回值以支持可链接性.这是不可行的,因为最终你必须拥有返回基本对象以外的东西的方法,所以最终会得到一些可链接的方法和一些不可链接的方法(类的用户可以有趣地猜测哪些是哪一个.)
或者你全力以赴,无论如何都可以将它们全部链接起来,但是你会发现自己处于荒谬的境地,例如为了保留链条而返回一个虚假的"空"对象,这个对象需要进行一些模糊属性的测试确定它是"真实的"还是链中的链接.
经典的例子是jQuery,它展示了所有的症状:基础对象试图成为整个代码中唯一的基本数据单元(一切都返回一个jQuery对象); 假对象测试(if (obj.length)
); 再加上自相矛盾,它仍然需要打破getAttribute()
返回字符串等方法的可链接性.
恕我直言,只是为了那些语法糖而制造东西是一件非常糟糕的事情.