Il concatenamento dei metodi è la pratica dei metodi oggetto che restituiscono l'oggetto stesso affinché il risultato venga chiamato per un altro metodo. Come questo:
participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()
Questa sembra essere considerata una buona pratica, poiché produce codice leggibile o "interfaccia fluente". Tuttavia, a me sembra invece spezzare l'oggetto che chiama la notazione implicita dall'orientamento dell'oggetto stesso - il codice risultante non rappresenta azioni che eseguono il risultato di un metodo precedente, che è come generalmente dovrebbe funzionare il codice orientato agli oggetti:
participant.getSchedule('monday').saveTo('monnday.file')
Questa differenza riesce a creare due significati diversi per la notazione a punti di "chiamare l'oggetto risultante": Nel contesto del concatenamento, l'esempio sopra si legge come salvare l' oggetto partecipante , anche se l'esempio è effettivamente destinato a salvare la pianificazione oggetto ricevuto da getSchedule.
Capisco che la differenza qui è se ci si dovrebbe aspettare che il metodo chiamato restituisca qualcosa o no (nel qual caso restituirebbe l'oggetto chiamato stesso per il concatenamento). Ma questi due casi non sono distinguibili dalla notazione stessa, ma solo dalla semantica dei metodi chiamati. Quando il concatenamento di metodo non viene utilizzato, posso sempre sapere che una chiamata di metodo opera su qualcosa correlato al risultato della chiamata precedente - con il concatenamento, questa ipotesi si interrompe e devo elaborare semanticamente l'intera catena per capire quale sia l'oggetto reale chiamato è davvero. Per esempio:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Qui le ultime due chiamate al metodo si riferiscono al risultato di getSocialStream, mentre quelle precedenti si riferiscono al partecipante. Forse è una cattiva pratica scrivere effettivamente catene in cui il contesto cambia (è?), Ma anche allora dovrai controllare costantemente se le catene di punti che sembrano simili sono effettivamente mantenute nello stesso contesto o funzionano solo sul risultato .
A me sembra che mentre il concatenamento del metodo produce superficialmente codice leggibile, sovraccaricare il significato della notazione a punti provoca solo maggiore confusione. Dato che non mi considero un guru della programmazione, presumo che la colpa sia mia. Quindi: cosa mi sto perdendo? Capisco il metodo concatenamento in qualche modo sbagliato? Ci sono alcuni casi in cui il concatenamento dei metodi è particolarmente buono o altri in cui è particolarmente negativo?
Sidenote: capisco che questa domanda potrebbe essere letta come una dichiarazione di opinione mascherata da una domanda. Tuttavia, non lo è - voglio sinceramente capire perché il concatenamento è considerato una buona pratica e dove sbaglio nel pensare che rompa la notazione intrinseca orientata agli oggetti.
.
che ignorerebbe qualsiasi valore restituito e invocherebbe sempre qualsiasi metodo incatenato usando lo stesso oggetto.