Шаблоны Ruby on Rails — декоратор против ведущего

В последнее время в сообществе Ruby on Rails ведутся всевозможные разговоры об декораторах и презентерах.

В чем принципиальная разница между ними? Если да, то каковы подсказки, которые говорят мне, какой из них использовать над другим? Или, возможно, использовать их вместе?


person keruilin    schedule 22.10.2011    source источник


Ответы (2)


Декоратор больше похож на «давайте добавим некоторую функциональность к этому объекту». Ведущий больше похож на «давайте построим мост между моделью/бэкендом и представлением». Шаблон Presenter имеет несколько интерпретаций.

Декораторы являются универсальными/универсальными. Ведущие имеют более узкий круг обязанностей/использований. Декораторы используются в разных областях, а презентаторы почти всегда связаны с функциями, подобными представлениям.

person Dave Newton    schedule 22.10.2011
comment
Спасибо. Похоже, что эта жемчужина Дрейпера — это гибрид ведущего и декоратора. - person keruilin; 22.10.2011
comment
@keruilin Следует иметь в виду одну вещь: декораторы действительно должны иметь возможность украшать другие декораторы (а также украшать объект-компонент), потому что одна из их целей - обойти ограничения наследования. (Дрейпер не этого делает). В этом смысле шаблон декоратора очень похож на составной шаблон, за исключением того, что он обрабатывается снаружи внутрь, а не изнутри наружу (если это имеет смысл). - person smudge; 20.12.2011
comment
Я рассматриваю декоратор как шаблон общего назначения, а презентатор — как конкретное приложение декоратора, связанное со слоем представления. - person Kris; 13.07.2012
comment
@Smudge, декораторы драпировки могут украшать другие украшения, по крайней мере, как если бы базовые модели имеют отношения STI. - person keruilin; 03.09.2012
comment
Кажется, что теперь Draper идентифицирует себя как оболочку уровня представления, так что это уже не декоратор, а на самом деле презентатор. Из их GH: Draper добавляет в ваше приложение Rails объектно-ориентированный уровень логики представления. - person Jared; 03.09.2019
comment
@Jared пожимает плечами Хотя я не представлял Дрейпера ни в частности, сколько я себя помню, это словоблудие было в ридми. Презентаторы — это декораторы, которые живут близко к уровню представления — это все еще декоратор. То, как используется декоратор, как я примерно сказал в ответе, является деталью реализации. На самом деле это не меняет ни один из шаблонов — и Дрейпер может использоваться как любой из них. - person Dave Newton; 03.09.2019
comment
@DaveNewton, моя вина, просматривая их историю README, говорит, что они всегда были такими. Должно быть, когда-то давно он был представлен мне как декоратор логического уровня, и им могли пользоваться ведущие. - person Jared; 03.09.2019
comment
@Jared пожимает плечами Вы можете - это просто декоратор; неважно, что вы украшаете. Я использовал Draper в качестве обоих. На самом деле в этом нет ничего интересного. - person Dave Newton; 03.09.2019
comment
@DaveNewton да, я много лет использую Draper, всегда в качестве логического декоратора. Меня просто удивляет, что они почти настаивают на том, чтобы использовать его только для просмотров, поскольку это помогает избежать многих ошибок из-за неправильных представлений. Никогда не ошибался с этим, хотя у меня были некоторые причуды с Дрейпером. - person Jared; 03.09.2019
comment
@ Джаред, наверное, я читаю это по-другому. ИМО это (хм) представлено таким образом, потому что именно так его будет использовать большинство людей, хотя бы потому, что границы использования объекта, по крайней мере, в ориентированных на действие фреймворках, почти всегда представляют собой некоторую форму представления, будь то в HTML, JSON, SOAP, что угодно — и именно здесь вам часто понадобятся функции, специфичные для периферийных устройств. Если он проходит через несколько уровней приложения, декоратор кажется менее полезным, но YMMV. - person Dave Newton; 03.09.2019

Я предлагаю вам проверить это - Exhibit vs Presenter.

Декоратор — это шаблон проектирования, который используется для расширения функциональности определенного объекта путем его обертывания, не затрагивая другие экземпляры этого объекта. В общем, шаблон декоратора является примером принципа открытия/закрытия (класс закрыты для модификаций, но доступны для расширений).

И экспонент, и презентер являются разновидностью декоратора.

person dpaluy    schedule 26.04.2013
comment
+1 за ссылку на это сообщение в блоге Майка Пака. Отличный пост, который объясняет различия между шаблонами. - person ki4jnq; 28.02.2016
comment
+1 за упоминание шаблона Exhibit. В итоге я получил книгу Авди Гримма, которая объясняет это. Хотя это не было правильным решением для моей проблемы, это все еще удивительная модель. Отличная пища для размышлений. - person Yonk; 11.11.2016