Цепочка методов - это практика использования методов объекта, возвращающих сам объект для вызова результата для другого метода. Как это:
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, тогда как предыдущие вызовы относятся к участнику. Может быть, это плохая практика - писать цепочки с изменяющимся контекстом (не так ли?), Но даже тогда вам придется постоянно проверять, действительно ли точечные цепочки, которые выглядят одинаково, соответствуют одному и тому же контексту или работают только с результатом. .
Мне кажется, что, хотя поверхностное сцепление методов действительно производит читабельный код, перегрузка значения точечной нотации только приводит к еще большей путанице. Поскольку я не считаю себя гуру программирования, я полагаю, что вина моя. Итак: Чего мне не хватает? Я понимаю метод цепочки как-то неправильно? Есть ли случаи, когда цепочка методов особенно хороша, или где особенно плохо?
Sidenote: Я понимаю, что этот вопрос можно прочитать как высказывание мнения, замаскированное под вопрос. Однако это не так - я искренне хочу понять, почему создание цепочек считается хорошей практикой, и где я ошибаюсь, думая, что это нарушает присущую объектно-ориентированную нотацию.