Преимущества и недостатки цепных методов?

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

Будучи в первую очередь разработчиком Java, я всегда задавался вопросом, почему эта практика больше не использовалась в этом языке. Например, интерфейс Collection не был разработан таким образом (для добавления / удаления методов), и мне это показалось довольно печальным.

Есть ли у этой практики реальные минусы или это просто то, что раньше не имело достаточной "сексуальной привлекательности"?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
413
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Мне тоже очень нравится этот подход. Единственный недостаток, о котором я могу думать, это то, что иногда кажется немного неудобным «возвращать это» в конце каждого метода. Для JQuery, например, немного неудобно разрешать плагины, потому что вы должны сказать: «Убедитесь, что вы не забыли свои возвраты !!» но нет хорошего способа поймать это во время компиляции.

было бы хорошо, если бы в java была прагма, которая гласила: «вернуть это, если не было указано другое возвращаемое значение»? Или, что более вероятно, предупреждение компилятора.

David Medinets 29.09.2008 17:25

Единственный минус в том, что вы теряете возвращаемый тип, поэтому цепочка хороша для операций, которые что-то делают, но не подходят для операций, которые вычисляют вещи.

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

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

С другой стороны, Java строго объектно-ориентированный, функция не может существовать вне класса. Использование наследования, композиции и интерфейсов - более естественный способ для этого языка.

И? Какая связь между концепцией объектно-ориентированной / функциональной концепции и способом написания вызова метода? Действительно ли парадигма влияет на использование a.b (). C (), а не x = a.b (); x.c ()? Я так не думаю.

gizmo 29.09.2008 17:00

ой, извините, неправильный пример. Я хотел написать a.b (); a.c () конечно.

gizmo 29.09.2008 17:01

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

PhiLho 30.09.2008 16:16

IMO болезненно отлаживать, поскольку у вас нет промежуточных переменных для проверки.

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

gizmo 29.09.2008 16:58

Цепные методы - еще один отличный инструмент в нашем наборе инструментов для дизайна. Только убедитесь, что вы не натолкнетесь на банальную фразу «У меня есть молоток, поэтому каждая проблема - гвоздь».

Не все проблемы дизайна решаются цепными методами. Иногда это действительно помогает упростить использование интерфейса (например, проблема сбора, о которой вы упомянули). Иногда это не так. Хитрость заключается в том, чтобы выяснить, какой случай применим.

Ответ принят как подходящий

Мартин Фаулер обсуждает эту тему как «свободные интерфейсы» на http://www.martinfowler.com/bliki/FluentInterface.html. Одна из основных проблем заключается в том, что плавные интерфейсы предназначены для людей, поэтому такие фреймворки, как Spring, не могут их понять. Упрощенно использование свободного интерфейса обеспечивает ремонтопригодность в одном смысле (удобочитаемость), но теряет ремонтопригодность в другом (гибкость).

Есть общая проблема с цепными методами и наследованием. Предположим, у вас есть класс C, чьи методы F1 (), F2 () и т. д. Возвращают C. Когда вы наследуете класс D от C, вы хотите, чтобы методы F1, F2 и т. д. Теперь возвращали D, чтобы цепочечные методы D могли быть вызванным в любом месте цепочки.

В C++ это обычно решается с помощью CRTP: en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern

Jasper Bekkers 16.04.2009 19:01

Правда, к сожалению, универсальные шаблоны .NET не позволяют использовать параметры шаблона в спецификации базового класса для универсального класса. У Эрика Липперта в своем блоге (blogs.msdn.com/ericlipper) есть хорошее объяснение, почему это ограничение неизбежно в реализации дженериков .NET.

LBushkin 16.04.2009 19:30

Если C# когда-либо будет поддерживать ковариантные возвращаемые типы, это может стать меньшей проблемой. Тем временем вы можете использовать ключевое слово new, чтобы скрыть базовые методы и заменить их версиями, использующими соответствующий тип возвращаемого значения. Я бы предложил в этих случаях вызвать базовый класс, чтобы избежать дублирования кода.

LBushkin 16.04.2009 19:32

Другие вопросы по теме