Methodenverkettung - warum ist es eine gute Praxis oder nicht?

Methodenverkettung ist die Praxis von Objektmethoden, die das Objekt selbst zurückgeben, damit das Ergebnis für eine andere Methode aufgerufen wird. So was:

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

Dies scheint eine gute Praxis zu sein, da es lesbaren Code oder eine "fließende Schnittstelle" erzeugt. Für mich scheint es stattdessen die Objektaufrufnotation zu durchbrechen, die durch die Objektorientierung selbst impliziert wird - der resultierende Code repräsentiert nicht das Ausführen von Aktionen für dasErgebnis Von einer früheren Methode wird erwartet, dass objektorientierter Code wie folgt funktioniert:

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

Dieser Unterschied schafft es, zwei verschiedene Bedeutungen für die Punktnotation "Aufrufen des resultierenden Objekts" zu erzeugen: Im Zusammenhang mit der Verkettung würde das obige Beispiel als Speichern desTeilnehmer object, obwohl das Beispiel eigentlich das von getSchedule empfangene Schedule-Objekt speichern soll.

Ich verstehe, dass der Unterschied hier darin besteht, ob von der aufgerufenen Methode erwartet werden sollte, dass sie etwas zurückgibt oder nicht (in diesem Fall würde sie das aufgerufene Objekt selbst zur Verkettung zurückgeben). Diese beiden Fälle unterscheiden sich jedoch nicht von der Notation selbst, sondern nur von der Semantik der aufgerufenen Methoden. Wenn keine Methodenverkettung verwendet wird, kann ich immer wissen, dass ein Methodenaufruf mit etwas in Verbindung steht mitErgebnis des vorherigen Aufrufs - mit Verkettung bricht diese Annahme, und ich muss die gesamte Kette semantisch verarbeiten, um zu verstehen, was das tatsächlich aufgerufene Objekt wirklich ist. Zum Beispiel:

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

Dort beziehen sich die letzten beiden Methodenaufrufe auf das Ergebnis von getSocialStream, während sich die vorherigen auf den Teilnehmer beziehen. Vielleicht ist es eine schlechte Praxis, Ketten dort zu schreiben, wo sich der Kontext ändert (oder?), Aber selbst dann müssen Sie ständig prüfen, ob ähnlich aussehende Punktketten tatsächlich im selben Kontext bleiben oder nur am Ergebnis arbeiten .

Mir scheint, dass, während die oberflächliche Verkettung von Methoden lesbaren Code erzeugt, eine Überladung der Bedeutung der Punktnotation nur zu mehr Verwirrung führt. Da ich mich nicht als Programmierguru betrachte, gehe ich davon aus, dass der Fehler bei mir liegt.Also: Was fehle ich? Verstehe ich Methodenketten irgendwie falsch? Gibt es Fälle, in denen die Verkettung von Methoden besonders gut oder besonders schlecht ist?

Nebenbemerkung: Ich verstehe, dass diese Frage als eine als Frage maskierte Stellungnahme gelesen werden kann. Es ist jedoch nicht so - ich möchte wirklich verstehen, warum das Verketten als gute Praxis angesehen wird und wo ich falsch liege, wenn ich denke, dass es die inhärente objektorientierte Notation durchbricht.

Antworten auf die Frage(16)

Ihre Antwort auf die Frage