IronWoods.es

Desarrollo web

Blog / PHP / POO / Métodos encadenados

El uso de métodos encadenados permite mejorar la legibilidad del código, ya que realiza de forma encadenada la llamada de una serie de métodos, de forma que puede 'casi leerse' la secuencia que recorre el programa.

Esta técnica, es muy usada desde hace algún tiempo en librerías JS, como jQuery. En PHP podemos encontrarla en frameworks como Laravel.


Un ejemplo:

//Obtener el nombre de la ruta actual

$nombre_ruta_actual = Route::current()->getName();

Como puede verse se llama a dos métodos de forma encadenada, el primero nos devuelve un objeto de tipo 'ruta' y el segundo nos devolverá el contenido de la propiedad donde se almacena su nombre.

Esta técnica, si nombramos de forma adecuada nuestros métodos, hace más legible la serie de acciones que se van a ejecutar.


Otro ejemplo:

return $this->extraetUrls()

->$this->filtrarDuplicadas()

->$this->filtrarPorCoincidencias()

->$this->filtrarPorOrden();

Lo anterior, escrito de la forma tradicional, supondría guardar el resultado de llamar al primer método en una variable que pasaríamos y devolveríamos sucesivamente a cada uno de los métodos de filtrado que se aplican posteriormente, devolviéndola al finalizar en proceso. Puede apreciarse que al usar esta técnica no estamos pasando nada a los métodos sucesivos, por lo que se deduce que están accediendo y seteando una propiedad de la clase, esto podría hacerse de otro modo, pero es más limpio así, ya que se realiza un encadenado que mejora la legibilidad del código.

¿Cómo crear métodos encadenados?

Para usar esta técnica, basta con retornar una referencia al propio objeto en cada uno de los métodos que queremos encadenar después de que hayan realizado las acciones necesarias:

return $this;

Ejemplo Ardirata

Voy a poner un ejemplo sencillo. Tenemos la clase Ardirata, este animal básicamente busca y almacena bellotas, a veces come alguna y con cierta frecuencia olvida la localización de un escondite... por lo que podemos pensar que posee cierto número de bellotas almacenado que crece y decrece continuamente.

Usare métodos encadenados para representar la siguiente secuencia de acciones:

  • La ardirata 'Scratch' tiene 2 bellotas
  • Encuentra 3 bellotas
  • Come 1 bellota
  • Encuentra 12 bellotas
  • Pierde 1 almacén con 7 bellotas
  • Se come 2 bellotas
  • Encuentra 5 bellotas
  • La ardirata 'Scratch' ahora se llama 'Rey de la Montaña de Bellotas'

Usamos métodos encadenados para que el código pueda leerse de manera similar. Internamente usare los métodos sumaBellotas() y restaBellotas(), pero para que sea legible se crean métodos que representen las acciones deseadas, así usamos los métodos: cambiarNombre(), comerBellotas(), encontrarBellotas() y perderBellotas().

Así quedaría el código:

$ardirata = new Ardirata( 'Scratch', 2 );

$ardirata->encontrarBellotas( 3 )

->comerBellotas( 1 )

->encontrarBellotas( 12 )

->perderBellotas( 7 )

->encontrarBellotas( 5 )

->cambiarNombre( 'Rey de la Montaña de Bellotas' );


// Mostramos resultado

echo "La ardirata <b>" . $ardirata->str_nombre_ardilla . "</b> tiene <b>" . $ardirata ->bellotas_almacenadas . "</b> bellotas almacenadas.";


El código anterior produce la siguiente salida:

La ardirata Rey de la Montaña de Bellotas tiene 14 bellotas almacenadas.


Código de la clase Ardirata y test en Github


18-10-2017