Articulo de referencia

encadenamiento de métodos

El encadenamiento de métodos es una sintaxis común para invocar múltiples llamadas a métodos en lenguajes de programación orientados a objetos . Cada método devuelve un objeto, ...

El encadenamiento de métodos es una sintaxis común para invocar múltiples llamadas a métodos en lenguajes de programación orientados a objetos . Cada método devuelve un objeto, lo que permite encadenar las llamadas en una sola instrucción sin necesidad de utilizar variables para almacenar los resultados intermedios.

Razón fundamental

Las declaraciones de variables locales son azúcar sintáctico . [ 1 ]

El encadenamiento de métodos elimina una variable adicional para cada paso intermedio. El desarrollador se libra de la carga cognitiva de nombrar la variable y recordarla.

El encadenamiento de métodos se ha descrito como un "desastre" debido al aumento en el número de métodos que se suceden uno tras otro en la misma línea a medida que se encadenan más métodos. [ 2 ]

Una sintaxis similar es la cascada de métodos , donde después de la llamada al método la expresión se evalúa al objeto actual, no al valor de retorno del método. La cascada se puede implementar mediante el encadenamiento de métodos haciendo que el método devuelva el propio objeto actual . La cascada es una técnica clave en las interfaces fluidas , y dado que el encadenamiento está ampliamente implementado en lenguajes orientados a objetos, mientras que la cascada no lo está, esta forma de "cascada mediante encadenamiento devolviendo esto " se suele denominar simplemente "encadenamiento". Tanto el encadenamiento como la cascada provienen del lenguaje Simula .

Si bien el encadenamiento es una cuestión de sintaxis, tiene consecuencias semánticas: requiere que los métodos devuelvan un objeto, y si se implementa la cascada mediante encadenamiento, este debe ser el objeto actual. Esto impide que el valor de retorno se utilice para otros fines, como devolver un valor de error .

Ejemplos

flujos de E/S

Un ejemplo común es std::istreamy std::ostream(las clases de flujo de entrada y salida) en C++ , donde, por ejemplo, <<devuelve el objeto izquierdo, lo que permite el encadenamiento. [ 3 ]

a << b << c ;// esto es equivalente a: a << b ; a << c ;

Programación funcional

La programación funcional es otro ejemplo del uso del encadenamiento de métodos, que involucra funciones de orden superior. En la programación orientada a objetos , las funciones de orden superior y la manipulación de colecciones se pueden representar mediante métodos encadenados. [ 4 ]

Un ejemplo de ello en Java utiliza los métodos integrados de java.util.stream.Stream<E>:

import java.util.Arrays ; import java.util.List ; import java.util.streams.Collectors ;Lista < Entero > números = Arrays . asList ( 10 , 25 , 30 , 45 , 60 , 75 , 90 );List < Integer > result = numbers . stream () // .stream() devuelve java.util.stream.Stream . filter ( n -> n > 30 ) . map ( n -> n * 2 ) . sorted () . collect ( Collectors . toList ());

Tenga en cuenta que en Java, filter(), map(), y sorted()devuelven una nueva copia superficial de la lista anterior. Sin embargo, para operar sobre la lista directamente, sort()se puede utilizar el método. [ 5 ]

Language Integrated Query (o LINQ) para C# hace un uso extensivo del encadenamiento de métodos. [ 6 ]

using System ; using System.Collections ;// usando encadenamiento de métodos: IEnumerble < MyObject > results = SomeCollection . Where ( c => c . SomeProperty < 10 ) . Select ( c => new { c . SomeProperty , c . OtherProperty });resultados . ForEach ( x => { Console . WriteLine ( x . ToString ()); });// usando palabras clave LINQ: IEnumerable < MyObject > results = from c in SomeCollection where c . SomeProperty < 10 select new { c . SomeProperty , c . OtherProperty };foreach ( MyObject result in results ) { Console . WriteLine ( result ); }

C++20 introduce operator|(el operador de tubería) y permite operaciones de encadenamiento al estilo LINQ con los std::rangesespacios de nombres. std::viewscontiene varias clases que se invocan a través de operator(). [ 7 ]

importar std ;using std :: vector ; using std :: ranges :: to ; using std :: views :: filter ; using std :: views :: transform ;vector < int > números = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };// Pipeline: filtra los números pares, los duplica y luego suma el vector resultante < int > resultado = números | filtro ([]( int n ) -> bool { return n % 2 == 0 ; }) | transformar ([]( int n ) -> int { return n * 2 ; }) | a < vector > ();

Patrones de diseño

El patrón Builder se basa en la construcción de un objeto mediante llamadas a métodos en lugar de hacerlo directamente en su constructor. Por ejemplo, java.lang.StringBuilderutiliza el encadenamiento de métodos para construir un java.util.StringBuilder, que finalmente se convierte de nuevo en un java.util.Stringmediante una toString()llamada. [ 8 ]

String result = new StringBuilder () . append ( "Hola, " ) . append ( "mundo!" ) . insert ( 0 , "Saludo: " ) . replace ( 10 , 18 , "hermoso " ) . toString ();

El patrón de interfaz Fluent se basa completamente en el encadenamiento de métodos para implementar la cascada de métodos. [ 9 ]

En C++, se puede lograr un encadenamiento de métodos similar al de Java y C# haciendo que los métodos devuelvan (por ejemplo, para una clase StringBuilder, append()y replace()podría tener tipo StringBuilder&y devolver *this). Sin embargo, en C++ es importante tener en cuenta el posible seccionamiento de objetos si la referencia devuelta es a una clase padre, mientras que otros lenguajes como Java, C# y Rust no están sujetos a este problema. [ 10 ] [ 11 ]

Véase también

Referencias

  1. "CMSC 631 – Análisis y comprensión de programas" (PDF) . • Azúcar sintáctico para declaraciones locales: let x = e1 in e2 es una abreviatura de (λx.e2) e1
  2. Martin, Robert Cecil (2008). Clean Code: A Handbook of Agile Software Craftsmanship . Prentice Hall . ISBN 978-0-13-235088-4.
  3. "std::basic_ostream" . cppreference.com. 4 de septiembre de 2025.
  4. Nakamaru, Tomoki; Matsunaga, Tomomasa; Yamazaki, Tetsuro; Akiyama, Soramichi; Chiba, Shigeru (2020). Un estudio empírico del encadenamiento de métodos en Java . Seúl, República de Corea: Asociación de Maquinaria de Computación. págs. 93– 102. doi : 10.1145/3379597.3387441 . ISBN  9781450375177. Consultado el 4 de septiembre de 2025 .{{cite book}}: |website=ignorado ( ayuda )
  5. "Stream (Java SE)" . docs.oracle.com . Consultado el 4 de septiembre de 2025 .
  6. "Consulta integrada en el lenguaje (LINQ) - C# Microsoft Learn" . learn.microsoft.com . Consultado el 4 de septiembre de 2025 .
  7. "Biblioteca de rangos (desde C++20) - cppreference.com" . cppreference.com . Consultado el 4 de septiembre de 2025 .
  8. "StringBuilder (Java SE)" . docs.oracle.com . Consultado el 4 de septiembre de 2025 .
  9. Martin Fowler , " FluentInterface ", 20 de diciembre de 2005
  10. R., Subburaj (2013). Programación orientada a objetos con C++ según la norma ANSI/ISO . Editorial Vikas. págs. 260-261. ISBN  978-93-259-6996-4.
  11. Grimes, Richard (24 de abril de 2017). Introducción a la programación en C++ . Birmingham: Packt Publishing Ltd. pág. 309. ISBN  978-1-78712-928-3.
  • Creación de DSL en Java utilizando el concepto de encadenamiento de métodos.
  • Encadenamiento de métodos en PHP