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 jedoch die Objektaufrufnotation zu brechen, die durch die Objektorientierung selbst impliziert wird - der resultierende Code stellt keine Aktionen dar, die auf das Ergebnis einer vorherigen Methode zurückzuführen sind. So wird im Allgemeinen erwartet, dass objektorientierter Code 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 des Teilnehmerobjekts lauten , obwohl das Beispiel tatsächlich den Zeitplan speichern soll Objekt von getSchedule empfangen.
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 die Methodenverkettung nicht verwendet wird, kann ich immer wissen, dass ein Methodenaufruf mit etwas arbeitet, das mit dem Ergebnis des vorherigen Aufrufs zusammenhängt. Bei der Verkettung bricht diese Annahme, und ich muss die gesamte Kette semantisch verarbeiten, um zu verstehen, was das eigentliche Objekt ist genannt ist wirklich. Beispielsweise:
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, tatsächlich Ketten zu schreiben, in denen sich der Kontext ändert (oder?), Aber selbst dann müssen Sie ständig überprüfen, ob Punktketten, die ähnlich aussehen, tatsächlich im selben Kontext bleiben oder nur am Ergebnis arbeiten .
Mir scheint, dass die oberflächliche Verkettung von Methoden zwar lesbaren Code erzeugt, die Überladung der Bedeutung der Punktnotation jedoch 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 vermisse ich? Verstehe ich die Verkettung von Methoden 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 Meinungsäußerung gelesen werden kann. Es ist jedoch nicht so - ich möchte wirklich verstehen, warum Verkettung als gute Praxis angesehen wird und wo ich falsch denke, dass sie die inhärente objektorientierte Notation bricht.
.
gäbe, die alle mehtod-Rückgabewerte ignoriert und immer verkettete Methoden mit demselben Objekt aufruft.