¿Cuál es el nombre del idioma usando el método de encadenamiento para construir un objeto?

21

Con frecuencia uso un patrón donde uso el método de encadenamiento para configurar un objeto, similar a un patrón Buildero Prototype, pero no creo nuevos objetos con cada llamada al método, sino que modifico el objeto original.

Ejemplo:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

Solo me pregunto si hay un nombre para este patrón y si se considera un antipatrón, porque aunque puede leer con más fluidez, puede conducir a largas cadenas de métodos.

Garrett Hall
fuente
3
Una interfaz fluida es una cuestión de estilo. Si está escribiendo una API, proporcione formas alternativas.
Oded
1
Para más discusión, eche un vistazo a esta pregunta: programmers.stackexchange.com/questions/69519/…
Eric King
@Oded ¿Es posible usar una API de este tipo sin encadenar simplemente haciendo que cada llamada sea una declaración separada, o tenía otra idea para una alternativa?
Garrett Hall
@GarrettHall - Por supuesto que es posible, pero luego terminas llamando cosas como menu.withStyle("")sin contexto. Necesita dos API en tal caso.
Oded
2
@GarrettHall El punto de la 'interfaz fluida' es la cadena de métodos, que debe leerse como una oración. En este sentido, la cadena de método larga no se considera mala. Pero, y aquí estoy de acuerdo con Oded, sería mejor proporcionar también la misma funcionalidad en una sintaxis más convencional. De esa manera, el desarrollador puede elegir qué método usar.
Eric King

Respuestas:

37

Interfaz fluida

Siempre he escuchado que este método se llama una " interfaz fluida ", como lo acuñaron Eric Evans (de la fama de diseño impulsado por el dominio ) y Martin Fowler (de la fama del Manifiesto Ágil ).

Los principales inconvenientes son la legibilidad (que algunas personas aman y otras odian), y el hecho de que puede ser más difícil de depurar en algunos casos porque toda la cadena de acciones puede considerarse una sola declaración al pasar por ella.

Ciertamente no lo considero un antipatrón, aunque solo he usado la técnica unas pocas veces.

Eric King
fuente
44
Tenga en cuenta que los proponentes son bastante insistentes en que una interfaz fluida implica mucho más que solo el encadenamiento de métodos, aunque a menudo no está claro qué más se entiende por ese término.
Kilian Foth
¿Es común que toda la cadena se considere una sola declaración? Eso me parece un problema de depurador mal diseñado.
blueberryfields
No me he encontrado con un depurador que trate las cadenas como una sola declaración, pero aún puede ser un problema si solo está interesado en uno de los métodos hacia el final de la cadena, en una cadena en particular.
vaughandroid
1
Trabajo en C #, y el depurador .NET me permite ingresar a los métodos individuales perfectamente. Otros idiomas, no estoy tan seguro.
Eric King
1
@KilianFoth Como se señaló en los comentarios de la pregunta, los métodos encadenados en una interfaz fluida deberían ser legibles casi como una oración. A veces, esto significa que los métodos individuales deben tener nombres diferentes de los que se consideran buenas prácticas
Izkata
5

El método de encadenamiento como ese generalmente se llama una interfaz fluida cuando hay algún tipo de flujo o capacidad de detección en la cadena. Alternativamente, puede pensar en una API como jQuery que se basa en gran medida en el encadenamiento de métodos como no 'fluido' porque no hay el mismo énfasis en la capacidad de descubrimiento: es más por conveniencia.

Para su ejemplo (usando withx, withy) puede considerar esto como una variante del patrón Builder porque tiene una clase especializada que, dado algún estado (llamadas a métodos) sabe cómo devolver un objeto configurado correctamente.

Esto no es un antipatrón si se usa adecuadamente.

pfries
fuente
¿Qué es la capacidad de descubrimiento? ¿La capacidad de encontrar los métodos que necesita a través del autocompletado de la API?
Josiah Yoder
No estoy familiarizado con jQuery. ¿Cómo se encadenan sus métodos solo por conveniencia, no por descubrimiento? ¿Porque hay tantas formas de encadenarlo es abrumador incluso con autocompletar?
Josiah Yoder
3

si se considera un antipatrón,

Definitivamente no es un antipatrón. jQuery es probablemente la implementación más utilizada de esto.

porque aunque puede leer con mayor fluidez, puede conducir a largas cadenas de métodos

Sí puede, pero ¿cuál es la alternativa? Puede terminar con una oración casi en inglés, con la API que lo guía a lo que está disponible y es apropiado.

NimChimpsky
fuente
..y obtienes lo que quieres en 1 línea, en lugar de 8 - 10. Lo cual es bueno si solo estás escribiendo un trazador de líneas en una terminal. Es más fácil recordar 1 comando que 10. Debido a que es fluido y los métodos tienen nombres descriptivos, también es más fácil de leer. Lamentablemente, mucho de esto en Python2 ya no se puede hacer en Python3 / Python4.
mckenzm
-3

Se llama patrón de "choque de trenes".

(Es un antipatrón y está en contra de Clean Code)

El patrón de "choque de trenes" viola la Ley de Deméter .

Bagazo
fuente
3
Esto no es lo mismo que el método de encadenamiento en el artículo al que se vincula, donde está el ejemplo a.getB().getC().doSomething(). Ese ejemplo es malo porque "Su método puede invocar métodos en sus propios campos directamente (pero no en los campos de los campos)". Aquí, solo se está creando un objeto, y "puedes jugar con los juguetes que has hecho tú mismo".
Nic