El encadenamiento de métodos es la práctica de métodos de objetos que devuelven el objeto en sí mismo para que el resultado se llame a 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 de objeto implícita en la orientación del objeto en sí misma: el código resultante no representa la realización de acciones en el resultado de un método anterior, que es cómo generalmente se espera que funcione el código orientado a objetos:
participant.getSchedule('monday').saveTo('monnday.file')
Esta diferencia se las arregla para crear dos significados diferentes para la notación de punto de "llamar al objeto resultante": en el contexto de encadenamiento, el ejemplo anterior se leería como guardar el objeto participante , a pesar de que el ejemplo tiene la intención de guardar la programación objeto 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 en sí mismo para encadenarlo). 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 método de encadenamiento, siempre puedo saber que una llamada de método opera en algo relacionado con el resultado de la llamada anterior; con el encadenamiento, esta suposición se rompe y tengo que procesar semánticamente toda la cadena para comprender cuál es el objeto real llamado realmente es. Por ejemplo:
participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Allí, las dos últimas llamadas al 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 donde el contexto cambia (¿es así?), Pero incluso entonces tendrá que verificar constantemente si las cadenas de puntos que se parecen son en realidad dentro del mismo contexto, o solo funcionan en el resultado .
Para mí, parece que si bien el método de encadenamiento superficial produce código legible, sobrecargar el significado de la notación de puntos solo genera más confusión. Como no me considero un gurú de la programación, supongo que la culpa es mía. Entonces: ¿qué me estoy perdiendo? ¿Entiendo el método de encadenamiento de alguna manera incorrecto? ¿Hay algunos casos en los que el encadenamiento de métodos es especialmente bueno o algunos en los que es especialmente malo?
Nota al margen: 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 dónde me equivoco al pensar que rompe la notación inherente orientada a objetos.
.
que ignorara cualquier valor de retorno de mehtod y siempre invocara cualquier método encadenado usando el mismo objeto.