Ланцюжок методів - це практика об'єктних методів повернення самого об'єкта для того, щоб результат був викликаний іншим методом. Подобається це:
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: Я розумію, що це запитання можна розглядати як твердження думки, замасковане як питання. Однак це не так - я щиро хочу зрозуміти, чому ланцюжок вважається хорошою практикою, і де я помиляюся, думаючи, що це порушує притаманні об'єктно-орієнтовані позначення.
.
яка б ігнорувала будь-які значення повернення mehtod і завжди викликала будь-які ланцюгові методи, використовуючи той самий об'єкт.