Łańcuch metod - dlaczego jest to dobra praktyka?

Łańcuch metody jest praktyką metod obiektowych zwracających sam obiekt w celu wywołania wyniku dla innej metody. Lubię to:

participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()

Wydaje się, że jest to dobra praktyka, ponieważ wytwarza czytelny kod lub „płynny interfejs”. Jednak wydaje mi się, że zamiast tego łamie zapis wywołania obiektu implikowany przez samą orientację obiektu - wynikowy kod nie reprezentuje działań wykonawczych dlawynik poprzedniej metody, czyli jak zwykle oczekuje się, że kod obiektowy będzie działał:

participant.getSchedule('monday').saveTo('monnday.file')

Różnica ta pozwala na stworzenie dwóch różnych znaczeń dla notacji kropkowej „wywoływanie obiektu wynikowego”: W kontekście łączenia łańcuchowego powyższy przykład będzie odczytywany jako zapisywanieuczestnik obiekt, mimo że w rzeczywistości jest przeznaczony do zapisania obiektu harmonogramu odebranego przez getSchedule.

Rozumiem, że różnica polega na tym, czy wywoływana metoda powinna zwracać coś, czy nie (w takim przypadku zwróci wywoływany obiekt do łączenia). Ale te dwa przypadki nie odróżniają się od samego zapisu, tylko od semantyki wywoływanych metod. Gdy nie używa się łączenia metod, zawsze mogę wiedzieć, że wywołanie metody działa na czymś związanym zwynik poprzedniego wywołania - z łańcuchem to załamanie załamuje się i muszę semantycznie przetworzyć cały łańcuch, aby zrozumieć, czym naprawdę jest wywoływany obiekt. Na przykład:

participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))

Ostatnie dwa wywołania metody odnoszą się do wyniku getSocialStream, podczas gdy te poprzednie odnoszą się do uczestnika. Być może jest to zła praktyka pisania łańcuchów w miejscu, w którym zmienia się kontekst (czy to?), Ale nawet wtedy będziesz musiał stale sprawdzać, czy łańcuchy kropek, które wyglądają podobnie, są w rzeczywistości zachowane w tym samym kontekście lub działają tylko na wynik .

Wydaje mi się, że chociaż łączenie metod w sposób powierzchowny daje czytelny kod, przeciążenie znaczenia notacji kropkowej powoduje tylko większe zamieszanie. Ponieważ nie uważam się za guru programowania, zakładam, że wina jest moja.Więc: Czego mi brakuje? Czy rozumiem, że jakaś metoda łączenia łańcuchów jest błędna? Czy są przypadki, w których łączenie metod jest szczególnie dobre, a niektóre szczególnie złe?

Sidenote: Rozumiem, że to pytanie można odczytać jako oświadczenie zamaskowane jako pytanie. Nie jest to jednak - naprawdę chcę zrozumieć, dlaczego łańcuchowanie jest uważane za dobrą praktykę i gdzie mam pójść źle, myśląc, że łamie on wrodzony zapis obiektowy.

questionAnswers(16)

yourAnswerToTheQuestion