【问题标题】:`return $this;` design pattern or anti-pattern?`return $this;` 设计模式还是反模式?
【发布时间】:2011-05-26 12:51:03
【问题描述】:

我见过很多次 Zend Framework 使用 return $this; pattern 风格 - 从我的角度来看:

  • Pro:似乎它的 pattern 风格相当不错,用于在同一个对象上链接许多操作并使您的代码更短。

  • Con:当您看到该对象在方法中返回自身时,代码看起来有点奇怪,该方法执行其他操作(例如,某些属性的 setter)

pattern 练习真的很好,还是反pattern 练习?

编辑:好吧,从我这边称其为“模式”有点过分,感谢大家为我指明正确的方向!

【问题讨论】:

  • 参见 Martin Fowler 在fluent interfaces 上的文章。我从未将其视为反模式。它适用于很多事情。 jQuery 是另一个突出的流畅界面。
  • 它只是一种编码风格和一种语法糖,而不是一种模式。

标签: php oop design-patterns anti-patterns


【解决方案1】:

返回this 允许您链接调用和设置值。它对于配置某些对象非常有用(参见Fluent interface)。你可以很容易地表达你想要的(你可以使用不同的返回类型来实现你想要的)。

【讨论】:

    【解决方案2】:

    我发现方法链在有意义的情况下很有用;特定领域的语言,例如:

    $query->select('*')->from('users')->where(array('user_id' => 1, 'verified' => 1));
    

    问题是,这些方法无论如何都只会返回void,因此return $this 仅用作写作的速记版本:

    $query->select('*'); $query->from('users'); $query->where(...);
    

    我们仍将调用toSQL()execute() 方法来利用我们填充对象的数据。

    在我看来,它不是一种反模式,并且可以在适当的情况下作为一种合法、合理的对象填充方法。

    【讨论】:

      【解决方案3】:

      如果您的意思是“好的做法或坏的做法”,我的看法是:

      从好的方面来说,你会得到一些语法糖。

      不利的一面是,您放弃了有意义的返回值以支持可链接性。这实际上并不可行,因为最终您将不得不拥有返回基本对象以外的其他内容的方法,因此您最终会得到一些可链接的方法和一些不可链接的方法(您的类的用户会很开心地猜测哪些是可链接的)其中。)

      或者你全力以赴,无论如何都要让它们都可链接,但你会发现自己处于荒谬的境地,例如为了保留链而返回一个假的“空”对象,需要测试哪个对象一些不起眼的属性来确定它是“真实的”还是只是链条中的一个环节。

      典型的例子是 jQuery,它展现了所有的症状:基础对象试图成为整个代码中唯一的基本数据单元(一切都返回一个 jQuery 对象);假对象测试(if (obj.length));再加上它仍然需要打破像 getAttribute() 这样返回字符串的方法的可链接性的自相矛盾。

      恕我直言,仅仅为了那一点语法糖而把事情搞得一团糟。

      【讨论】:

      • 旁注:这种方法在使用 jQuery 时会导致不自然的不良做法。例如。您在#foo 下查找带有.bar 的元素,但没有找到,或者甚至没有找到#foo。大多数时候这意味着你有一个大问题,他们很可能应该在那里。您不在乎它们是否存在的情况要少得多。然而 jQuery 鼓励你忽略 #foo 或 .bar 缺失的事实,并让你愉快地链接那些不会完成任何事情的方法,而不会发出警告。这让事情发生了翻天覆地的变化,它需要一个更小的用例并使其成为常态。
      • 我认为你的位置。也许您可以通过将可链接的方法与具有不同类的不可链接的方法分开来获得两全其美的效果,正如我在这里尝试演示的那样:blog.programster.org/fluent-interface
      【解决方案4】:

      这被称为 Fluent Interface,我认为这不是一种模式,而是一种更好的方式来实现功能以减少代码量并提高可读性。

      我让你阅读维基百科页面:http://en.wikipedia.org/wiki/Fluent_interface

      【讨论】:

        【解决方案5】:

        不仅仅是 PHP/Zend 框架这样做,还有许多其他编程语言使用流利的界面。我当然认为它很方便,并且使用流畅的界面是一种很好的编码方式。尽管有时代码看起来很奇怪,但这并不意味着它是错误的,老实说,我认为您不能将其置于 con 之下。

        最后,程序员只看到他得到了相同的对象,而不是它在流式接口类的代码中的样子。我认为流畅界面最大的优点是代码的可读性。如果你想听到一个骗局,那么调试一个流畅的链就是其中之一。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-04
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 2018-03-24
          • 1970-01-01
          • 2016-08-25
          • 1970-01-01
          相关资源
          最近更新 更多