Цепочка методов - это практика, когда методы объекта возвращают сам объект, чтобы результат был вызван для другой метод. Нравится:
participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()
Это кажется хорошей практикой, поскольку она дает читаемый код или «свободный интерфейс». Однако мне кажется, что вместо этого он нарушает нотацию вызова объекта, подразумеваемую самой объектной ориентацией - результирующий код не представляет выполнение действий по отношению к результату предыдущего метода, каковым является объектно-ориентированный код. обычно ожидается, что он будет работать:
participant.getSchedule('monday').saveTo('monnday.file')
Это различие создает два разных значения для точечной нотации «вызова результирующего объекта»: в контексте цепочки приведенный выше пример будет читаться как сохранение объекта участник, даже если пример фактически предназначен для сохранения объекта расписания, полученного getSchedule.
Я понимаю, что разница здесь в том, следует ли ожидать, что вызываемый метод что-то вернет или нет (в этом случае он вернет сам вызываемый объект для связывания). Но эти два случая неотличимы от самой нотации, только от семантики вызываемых методов. Когда цепочка методов не используется, я всегда могу знать, что вызов метода работает с чем-то связанным с результатом предыдущего вызова - с цепочкой это предположение нарушается, и мне приходится семантически обрабатывать всю цепочку чтобы понять, что на самом деле представляет собой вызываемый объект. Например:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Здесь два последних вызова метода относятся к результату getSocialStream, а предыдущие - к участнику. Возможно, это плохая практика - на самом деле писать цепочки, в которых меняется контекст (не так ли?), Но даже тогда вам придется постоянно проверять, действительно ли точечные цепочки, которые выглядят похожими, находятся в одном контексте или работают только с результатом. .
Мне кажется, что, хотя на первый взгляд цепочка методов создает читаемый код, перегрузка значения точечной нотации приводит только к еще большей путанице. Поскольку я не считаю себя гуру программирования, я предполагаю, что это моя вина. Итак: что мне не хватает? Я как-то неправильно понимаю цепочку методов? Есть ли случаи, когда цепочка методов особенно хороша, а в каких - особенно плохо?
Примечание: я понимаю, что этот вопрос может быть истолкован как изложение мнения, замаскированного под вопрос. Однако это не так - я искренне хочу понять, почему цепочка считается хорошей практикой и где я ошибаюсь, полагая, что она нарушает присущую объектно-ориентированной нотации.
.
, которая игнорирует любые возвращаемые mehtod значения и всегда вызывает любые связанные методы, использующие один и тот же объект. - person Ilari Kajaste   schedule 07.07.2011participant.AddSchedule(events[1])
- участник, которому только что были добавлены события [1] в свое расписание. - person Adrian McCarthy   schedule 15.11.2017