En la programación orientada a objetos , la cascada de métodos es una sintaxis que permite llamar a varios métodos en el mismo objeto. Esto se aplica particularmente en interfaces fluidas .
Por ejemplo, en Dart , la cascada:
a .. b () .. c ();
es equivalente a las llamadas individuales:
a . b (); a . c ();
El método en cascada es mucho menos común que el método encadenado ; solo se encuentra en un puñado de lenguajes orientados a objetos, mientras que el encadenamiento es muy común. Se puede implementar una forma de cascada usando encadenamiento, pero esto restringe la interfaz; consulte la comparación con el método de encadenamiento , a continuación.
Solicitud
La cascada es un azúcar sintáctico que elimina la necesidad de enumerar el objeto repetidamente. Esto se usa particularmente en interfaces fluidas , que presentan muchas llamadas a métodos en un solo objeto.
Esto es particularmente útil si el objeto es el valor de una expresión larga, ya que elimina la necesidad de enumerar la expresión repetidamente o usar una variable temporal. Por ejemplo, en lugar de enumerar una expresión repetidamente:
a . b (). c (); a . b (). d ();
o usando una variable temporal:
b = a . b (); b . c (); b . d ();
la cascada permite que la expresión se escriba una vez y se use repetidamente:
a . b () .. c () .. d ();
Comparación con el encadenamiento de métodos
Dada una llamada al método a.b()
, después de ejecutar la llamada, el método en cascada evalúa esta expresión al objeto izquierdoa
(con su nuevo valor, si está mutado), mientras que el método encadenado evalúa esta expresión al objeto derecho .
- Encadenamiento
La siguiente cadena (en C ++):
a . b (). c ();
es equivalente a la forma simple:
b = a . b (); b . c ();
- En cascada
La siguiente cascada (en Dart):
a .. b () .. c ();
es equivalente a la forma simple:
a . b (); a . c ();
En cascada puede ser implementada en términos de encadenamiento por tener los métodos devolver el objeto de destino (receptor, this
, self
). Sin embargo, esto requiere que el método ya se haya implementado de esta manera, o que el objeto original esté envuelto en otro objeto que haga esto, y que el método no devuelva algún otro valor potencialmente útil (o nada si eso sería más apropiado, como en setters). En interfaces fluidas, esto a menudo significa que los establecedores devuelven esto en lugar de nada.
Idiomas
Pascal
Dentro de la declaración de componentes de la declaración with, los componentes (campos) de la variable de registro especificada por la cláusula with pueden indicarse únicamente por su identificador de campo, es decir, sin antecederlos con la denotación de la variable de registro completa. La cláusula with abre efectivamente el alcance que contiene los identificadores de campo de la variable de registro especificada, de modo que los identificadores de campo pueden aparecer como identificadores de variable.
con fecha hacer si mes = 12 entonces comenzar mes : = 1 ; año : = año + 1 fin de otro mes : = mes + 1{ es equivalente a } si fecha . mes = 12 luego comienza la fecha . mes : = 1 ; fecha . año : = fecha . año + 1 final otra fecha . mes : = fecha . mes + 1
Charla
Las cadenas de métodos y las cascadas se introdujeron en Smalltalk ; la mayoría de los lenguajes posteriores orientados a objetos han implementado cadenas, pero pocos han implementado cascadas. En Smalltalk, el operador de punto y coma se puede utilizar para enviar diferentes mensajes al mismo objeto: [1]
self listPane color principal : Color negro ; altura: 17 ; ancho: 11
Compare con declaraciones separadas, terminadas con un punto, también usando una variable como abreviatura:
| padre | parent : = self listPane parent . color principal : Color negro . altura de los padres : 17 . ancho de los padres : 11 .
Una sutileza es que el valor de una llamada a un método ("mensaje") en una cascada sigue siendo el valor ordinario del mensaje, no el receptor. Esto es un problema cuando se quiere el valor del receptor, por ejemplo, cuando se crea un valor complejo. Esto se puede solucionar utilizando el yourself
método especial que simplemente devuelve el receptor: [2]
Objeto >> mismo ^ auto
Por ejemplo, el método "agregar un objeto a una colección" ( Collection>>add: anObject
) devuelve el objeto que se agregó, no la colección. Por lo tanto, para usar esto en una cascada en una declaración de asignación, la cascada debe terminar con yourself
, de lo contrario, el valor será solo el último elemento agregado, no la colección en sí:
all : = OrderedCollection nuevo agregar: 5 ; agregar: 7 ; usted mismo .
Visual Basic
Visual Basic usa la With
instrucción para habilitar un número arbitrario de llamadas a métodos o accesos a propiedades en el mismo objeto:
Con ExpressionThatReturnsAnObject . SomeFunction ( 42 ) . Propiedad = valor Terminar con
With..End With
Los bloques en Visual Basic se pueden anidar:
Con ExpressionThatReturnsAnObject . SomeFunction ( 42 ) . Propiedad = valor Con . SubObjeto . Subpropiedad = otroValor . Otro método ( 42 ) Terminar con Terminar con
Dardo
Entre los lenguajes más nuevos, Dart implementa cascadas, utilizando una ..
"operación de invocación de método en cascada" de dos puntos . A diferencia de Smalltalk, en Dart el valor de una invocación de método en cascada es el receptor (objeto base), no el valor de la invocación del método (no en cascada) y, por lo tanto, no es necesario yourself
. Dart usa propiedades y, por lo tanto, en lugar de usar la sintaxis del método para getters y setters ( foo.getBar(); foo.setBar(b);
), usa sintaxis de asignación / valor de campo ( foo.bar; foo.bar = b;
) y las cascadas funcionan con asignaciones:
a .. string = '¡Hola mundo!' .. hecho = verdadero ;
es equivalente a:
a . string = '¡Hola mundo!' ; a . hecho = verdadero ;
Referencias
- Beck, Kent (1997). Patrones de mejores prácticas de Smalltalk . Prentice Hall. ISBN 978-0134769042.
enlaces externos
- Dardo
- " Method Cascades in Dart ", Gilad Bracha, 17 de febrero de 2012
- Milestone 1 Language Changes , " Cascades ", Bob Nystrom, julio de 2012 (actualizado en marzo de 2013)