`return $this;` шаблон дизайна или анти-шаблон?

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

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

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

Является ли это действительно хорошей практикой pattern или, возможно, практикой anti- ?

ИЗМЕНИТЬ: хорошо было слишком много от моей стороны, чтобы назвать его "шаблоном", спасибо всем, что указали мне в правильном направлении!

Ответ 1

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

Ответ 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(), которые возвращают строку.

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

Ответ 4

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

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

Ответ 5

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

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