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:
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, usaré 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