stringtranslate.com

Método en cascada

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 encadenamiento de métodos : se encuentra sólo en un puñado de lenguajes orientados a objetos, mientras que el encadenamiento es muy común. Se puede implementar una forma de cascada mediante encadenamiento, pero esto restringe la interfaz; consulte la comparación con el encadenamiento de métodos, 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:

norte = un . b (); n . C (); n . d ();  

La conexión en 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 a un método a.b(), después de ejecutar la llamada, el método en cascada evalúa esta expresión en el objeto izquierdoa (con su nuevo valor, si está mutado), mientras que el encadenamiento de métodos evalúa esta expresión en el 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 ();

La cascada se puede implementar en términos de encadenamiento haciendo que los métodos devuelvan el objeto de destino (receptor, this, self). Sin embargo, esto requiere que el método ya esté implementado de esta manera – o que el objeto original esté incluido en otro objeto que haga esto – y que el método no devuelva algún otro valor potencialmente útil (o nada si eso fuera más apropiado, como en establecedores). En interfaces fluidas, esto a menudo significa que los configuradores devuelven esto en lugar de nada.

Idiomas

Pascal

Dentro de la declaración componente de la declaración with, los componentes (campos) de la variable de registro especificada por la cláusula with pueden denotarse únicamente por su identificador de campo, es decir, sin anteponerlos con la denotación de toda la variable de registro. 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 puedan aparecer como identificadores de variable.

 con fecha, haga si mes = 12 y luego comience el mes : = 1 ; año := año + 1 fin si no mes := mes + 1                       { es equivalente a } si fecha . mes = 12 luego fecha de inicio . mes := 1 ; fecha . año : = fecha . año + 1 fecha de finalización más . mes : = fecha . mes + 1                    

Charla

Tanto las cadenas de métodos como las cascadas se introdujeron en Smalltalk ; la mayoría de los lenguajes orientados a objetos posteriores han implementado cadenas, pero pocos han implementado cascadas. En Smalltalk el operador punto y coma se puede utilizar para enviar diferentes mensajes al mismo objeto: [1]

 color principal del panel de lista  propia : Color negro ; altura: 17 ; ancho: 11       

Compárese con declaraciones separadas, terminadas con un punto, utilizando también una variable como abreviatura:

| padre | padre  : =  self  listPane  padre . Color principal  :  Color  negro . altura de los padres  :  17 . ancho principal  :  11 .

Una sutileza es que el valor de una llamada a un método ("mensaje") en una cascada sigue siendo el valor normal del mensaje, no el del receptor. Esto es un problema cuando se desea conocer el valor del receptor, por ejemplo al generar un valor complejo. Esto se puede solucionar utilizando el yourselfmétodo especial que simplemente devuelve el receptor: [2]

Objeto >> usted mismo  ^ yo

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í:

todos  : =  OrderedCollection  nuevo  agregar:  5 ;  añadir:  7 ;  tú mismo .

Visual Básico

Visual Basic usa la instrucción With para habilitar un número arbitrario de llamadas a métodos o accesos a propiedades en el mismo objeto:

Con ExpressionThatReturnsAnObject . AlgunaFunción ( 42 ) . Propiedad = valor Terminar con      

With..End WithLos bloques en Visual Basic se pueden anidar:

Con ExpressionThatReturnsAnObject . AlgunaFunción ( 42 ) . Propiedad = valor Con . Subobjeto . SubPropiedad = otroValor . OtroMé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 doble punto. A diferencia de Smalltalk, en Dart el valor de la invocación de un método en cascada es el receptor (objeto base), no el valor de la invocación del método (sin cascada) y, por lo tanto, no hay necesidad de yourself. Dart usa propiedades y, por lo tanto, en lugar de usar la sintaxis del método para captadores y definidores ( foo.getBar(); foo.setBar(b);), usa la sintaxis de valor de campo/asignación ( foo.bar; foo.bar = b;), y las cascadas funcionan con asignaciones:

a .. cadena = '¡Hola mundo!' .. hecho = verdadero ;     

es equivalente a:

a . cadena = '¡Hola mundo!' ; a . hecho = verdadero ;    

Referencias

  1. ^ Beck 1997, "Cascade", págs. 183-185.
  2. ^ Beck 1997, "Usted mismo", págs. 186-188.

enlaces externos

Dardo