`return $ this;` шаблон проектирования или анти-шаблон? - PullRequest
13 голосов
/ 26 мая 2011

Я много раз видел Zend Framework, используя return $this; шаблон стиль - и с моей точки зрения:

  • Pro: кажется, это довольно неплохой шаблон стиль для объединения множества действий над одним и тем же объектом и сокращения вашего кода.

  • Con: код выглядит немного странно, когда вы видите, что объект возвращает себя в методе, который делает что-то еще (например, setter для некоторого свойства)

Это действительно хорошая модель практика или, может быть, анти- модель практика?

РЕДАКТИРОВАТЬ: ну, это было слишком много с моей стороны, чтобы назвать это "шаблон", спасибо всем за указание мне в правильном направлении!

Ответы [ 5 ]

10 голосов
/ 26 мая 2011

Возвращение this позволяет вам связывать вызовы и устанавливать значения.Это очень полезно для настройки какого-либо объекта (см. Свободный интерфейс ).Вы можете очень легко выразить, что вы хотите (и вы можете использовать различные типы возврата для достижения того, что вы хотите).

7 голосов
/ 13 декабря 2012

Если вы имеете в виду «хорошая практика или плохая практика», вот мое мнение:

С положительной стороны, вы получите синтаксический сахар.

С другой стороны, вы отказываетесь от значимых возвращаемых значений в пользу возможности объединения. Что на самом деле неосуществимо, потому что в конечном итоге вам понадобятся методы, которые возвращают что-то отличное от базового объекта, так что в итоге вы получите несколько методов, которые могут быть цепочечными, а некоторые - нет (пользователям ваших классов будет весело угадывать, какие который.)

Или вы идете полным ходом и делаете все из них цепочечными, несмотря ни на что, но затем вы попадаете в нелепые ситуации, такие как возвращение поддельного «пустого» объекта ради сохранения цепочки, какой объект нужно проверить какое-то неясное свойство, чтобы определить, является ли оно «реальным» или просто звеном в цепочке.

Классическим примером является jQuery, который демонстрирует все признаки: базовый объект пытается быть единственной базовой единицей данных в коде (все возвращает объект jQuery); тестирование поддельных объектов (if (obj.length)); плюс внутреннее противоречие, в котором все еще нужно нарушать цепочечность для таких методов, как getAttribute(), которые возвращают строку.

ИМХО, это ужасный беспорядок, чтобы что-то делать только ради этого синтаксического сахара.

7 голосов
/ 26 мая 2011

Я обнаружил, что цепочка методов полезна в тех случаях, когда это имеет смысл; язык, специфичный для домена, например:

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

Дело в том, что эти методы все равно будут возвращать void, и поэтому return $this просто функционирует как сокращенная версия написания:

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

Мы по-прежнему будем вызывать метод toSQL() или execute(), чтобы использовать данные, которыми мы заполнили наш объект.

По моему мнению, это , а не анти-паттерн и может функционировать как законный, разумный метод заселения объектов в правильных условиях.

3 голосов
/ 26 мая 2011

Это не только PHP / Zend Framework делает это, так как есть много других языков программирования, которые используют свободный интерфейс. Я, конечно, думаю, что это пригодится, и что использование свободного интерфейса - хороший способ кодирования. Хотя иногда коды выглядят странно, это не значит, что это неправильно, и я не думаю, что вы можете поставить это под con, если честно.

В конце концов, программист видит только то, что он возвращает тот же объект, а не то, как он выглядит внутри кода класса интерфейса. Я думаю, что самый большой профессионал в беглом интерфейсе - читаемость кода. Если вы хотите услышать мошенничество, то отладка свободной цепочки - одна.

2 голосов
/ 26 мая 2011

Это называется Fluent Interface, я не думаю, что это шаблон, но лучше способ реализовать функцию для уменьшения количества кода и улучшения читабельности.

Я позволю вам прочитать страницу Википедии: http://en.wikipedia.org/wiki/Fluent_interface

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...