Tworzenie łańcuchów metod to praktyka 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ż tworzy czytelny kod lub „płynny interfejs”. Jednak wydaje mi się, że zamiast tego wydaje mi się, że łamie notację wywoływania obiektów wynikającą z samej orientacji obiektu - wynikowy kod nie reprezentuje wykonywania działań w wyniku poprzedniej metody, co jest ogólnie oczekiwanym sposobem działania kodu obiektowego:
participant.getSchedule('monday').saveTo('monnday.file')
Ta różnica tworzy dwa różne znaczenia dla notacji z kropką „wywoływania wynikowego obiektu”: W kontekście łączenia w łańcuch powyższy przykład byłby odczytywany jako zapisanie obiektu uczestnika , nawet jeśli w rzeczywistości ma on na celu zapisanie harmonogramu obiekt otrzymany przez getSchedule.
Rozumiem, że różnica polega na tym, czy wywoływana metoda powinna coś zwrócić, czy nie (w takim przypadku zwróci ona sam wywołany obiekt w celu utworzenia łańcucha). Ale tych dwóch przypadków nie da się odróżnić od samej notacji, tylko od semantyki wywoływanych metod. Gdy nie używa się łączenia metod w łańcuch, zawsze mogę wiedzieć, że wywołanie metody operuje na czymś związanym z wynikiem poprzedniego wywołania - w przypadku łączenia w łańcuch to założenie zrywa się i muszę semantycznie przetworzyć cały łańcuch, aby zrozumieć, czym właściwie jest obiekt nazywa się naprawdę. Na przykład:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Tam ostatnie dwa wywołania metod odnoszą się do wyniku getSocialStream, podczas gdy poprzednie odnoszą się do uczestnika. Może to zła praktyka pisanie łańcuchów, w których zmienia się kontekst (prawda?), Ale nawet wtedy będziesz musiał ciągle sprawdzać, czy łańcuchy kropek, które wyglądają podobnie, są w rzeczywistości trzymane w tym samym kontekście, czy tylko działają .
Wydaje mi się, że podczas gdy tworzenie łańcuchów metod powierzchownie daje czytelny kod, przeładowanie znaczenia notacji z kropką powoduje tylko większe zamieszanie. Ponieważ nie uważam się za guru programowania, zakładam, że to moja wina. Więc: Czego mi brakuje? Czy rozumiem, że metoda łączenia jest w jakiś sposób niewłaściwa? Czy są przypadki, w których łączenie metod jest szczególnie dobre, czy takie, w których jest szczególnie złe?
Uwaga: Rozumiem, że to pytanie można odczytać jako wypowiedź zamaskowaną jako pytanie. Jednak tak nie jest - naprawdę chcę zrozumieć, dlaczego tworzenie łańcuchów jest uważane za dobrą praktykę i gdzie popełniam błąd, myśląc, że łamie nieodłączną notację obiektową.
.
, która ignorowałaby wszelkie wartości zwracane przez mehtod i zawsze wywoływała łańcuchowe metody używające tego samego obiektu.