Método de encadenamiento: ¿por qué es una buena práctica o no?

Método de encadenamiento es la práctica de los métodos de objeto que devuelven el objeto en sí para que el resultado se llame para otro método. Me gusta esto:

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

Esto parece ser considerado una buena práctica, ya que produce código legible o una "interfaz fluida". Sin embargo, para mí, en cambio, parece romper la notación de llamada al objeto implícita en la orientación del objeto en sí, el código resultante no representa realizar acciones en elresultado de un método anterior, que es cómo se espera que generalmente funcione el código orientado a objetos:

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

Esta diferencia logra crear dos significados diferentes para la notación de punto de "llamar al objeto resultante": en el contexto del encadenamiento, el ejemplo anterior se leería como si se guardara elpartícipe objeto, aunque el ejemplo de hecho está destinado a guardar el objeto de programación recibido por getSchedule.

Entiendo que la diferencia aquí es si se debe esperar que el método llamado devuelva algo o no (en cuyo caso devolvería el objeto llamado para el encadenamiento). Pero estos dos casos no se distinguen de la notación en sí, solo de la semántica de los métodos que se llaman. Cuando no se usa el encadenamiento de métodos, siempre puedo saber que una llamada de método opera en algo relacionado con elresultado de la llamada anterior: con el encadenamiento, esta suposición se rompe, y tengo que procesar semánticamente toda la cadena para comprender cómo es realmente el objeto real al que se llama. Por ejemplo:

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

Allí, las dos últimas llamadas de método se refieren al resultado de getSocialStream, mientras que las anteriores se refieren al participante. Tal vez sea una mala práctica escribir cadenas en las que el contexto cambie (¿no es así?), Pero incluso entonces tendrá que comprobar constantemente si las cadenas de puntos que parecen similares se mantienen dentro del mismo contexto, o solo trabajan en el resultado .

Para mí, parece que si bien el encadenamiento de métodos produce un código legible, sobrecargar el significado de la notación de puntos solo produce más confusión. Como no me considero un gurú de la programación, asumo que la culpa es mía.Entonces: ¿Qué me estoy perdiendo? ¿Entiendo el encadenamiento de métodos de alguna manera mal? ¿Hay algunos casos donde el encadenamiento de métodos es especialmente bueno, o algunos donde es especialmente malo?

Nota: Entiendo que esta pregunta podría leerse como una declaración de opinión enmascarada como una pregunta. Sin embargo, no lo es; realmente quiero entender por qué el encadenamiento se considera una buena práctica y en qué me equivoco al pensar que rompe la notación inherente orientada a objetos.

Respuestas a la pregunta(16)

Su respuesta a la pregunta