Métodos y propiedades de encadenamiento en la Programación Orientada a Objetos
Anteriormente aprendimos a usar la palabra clave this para abordar propiedades y métodos dentro del alcance de la clase.
Ahora aprenderemos que, cuando los métodos de una clase devuelven la palabra clave $this , se pueden encadenar para crear mucho más código de transmisión.
El uso de métodos y propiedades de encadenamiento en la programación orientada a objetos 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.
<?php return $this->extraeDatos(); ->$this->filtrarDuplicados(); ->$this->filtrarPorCoincidencias(); ->$this->filtrarPorOrden(); ?>
Lo anterior, escrito de la forma tradicional, supone 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.
Por ejemplo, en nuestra clase de automóviles , digamos que queremos medir la cantidad de combustible que tenemos en el tanque de nuestro automóvil. La cantidad de combustible en el tanque depende de la cantidad de millas que hemos conducido en nuestro automóvil, así como de la cantidad de combustible que ponemos en el tanque.
Para lograr nuestro objetivo, vamos a poner un tanque de propiedad pública $ a nuestra clase que represente la cantidad de galones de combustible que tenemos en el tanque del automóvil.
class Coche { public $deposito; }
También debemos agregar dos métodos a nuestra clase Coche :
1. El método llenar() agrega litrosde combustible al depósito de nuestro automóvil.
2. El método conducir() calcula la cantidad de combustible que consumimos cuando recorremos cierta distancia, y luego lo resta del depósito.
En nuestro ejemplo, suponemos que el automóvil consume 1 litro de combustible cada 50 kilómetros.
class Car { public $deposito; // Añade litros de gasolina al llenar el deposito. public function llenar($float) { $this -> deposito += $float; } // Resta litros de combustible del deposito mientras conducimos el automóvil. public function conducir($float) { $kilometros = $float; $litros = $kilometros/50; $this -> deposito -= $litros; } }
Como nos gustaría que nuestro código se vea elegante, encadenaremos los métodos y propiedades. Tenga en cuenta las flechas en el código.
$deposito = $coche -> llenar(10) -> conducir(40) -> deposito;
En palabras: ¿Cuánto combustible nos queda en nuestro tanque después de poner 10 litrosy conducir 40 kilometros?
Para que podamos realizar el encadenamiento, los métodos deben devolver el objeto y, dado que estamos dentro de la clase, los métodos deben devolver la palabra clave $this .
En el siguiente código, podemos ver cómo cada método devuelve la palabra clave $this para permitir el encadenamiento.
class Coche { public $deposito; // Agregue litros de combustible al deposito cuando lo llenemos. public function llenar($float) { $this -> deposito += $float; return $this ; } // Resta litrosde combustible del deposito mientras conducimos el automóvil. public function conducir($float) { $kilometros= $float; $litros= $kilometros/50; $this -> deposito -= ($litros); return $this ; } }
Ahora, podemos crear un objeto de la clase Car con el nombre de $ bmw y averiguar la cantidad de galones de combustible que quedan en el tanque de nuestro automóvil después de haber llenado el tanque con 10 galones de combustible y haber conducido 40 millas.
// Creamos nuevo objeto $bmw = new Coche(); // Agregue 10 litrosde combustible, luego recorra 40 kilometros, // y obtener la cantidad de litros en el deposito. $deposito = $bmw -> llenar(10) -> conducir(40) -> deposito; // Muestra el resultado. echo "En el depósito quedan: " . $deposito. " litros." ;
Resultado:
La cantidad de galones que quedan en el tanque: 9.2 litros.
Vamos con otro ejemplo
Tenemos la clase Transportista, este personaje básicamente recoge y entrega paquetes, a veces pierde alguno y con cierta frecuencia olvida la localización de sus furgonetas… por lo que podemos pensar que posee cierto número de paquetes almacenado que crece y decrece continuamente.
Usare métodos encadenados para representar la siguiente secuencia de acciones:
- El Transportista ‘Desastre’ tiene 2 paquetes
- Recoge 3 paquetes
- Entrega 1 paquete
- Recoge 12 paquetes
- Olvida 1 furgoneta con 7 paquetes
- Entrega 2 paquetes
- Recoge 5 paquetes
- El transportista ‘Desastre ‘ ahora se llama ‘Transportes Olvidados en la Carretera’
Usamos métodos encadenados para que el código pueda leerse de manera similar. Internamente usare los métodos recogePaquete() y entregaPaquete(), pero para que sea legible se crean métodos que representen las acciones deseadas, así usamos los métodos: cambiarNombre(), entregaPaquete(), recogePaquete() y olvidaFurgoneta().
Así quedaría el código:
<?php $transportista = new Transportista( 'Desastre', 2 ); $transportista->recogePaquete( 3 ); ->entregaPaquete( 1 ); ->recogePaquete( 12 ) ->olvidaFurgoneta( 7 ); ->recogePaquete( 5 ); ->cambiarNombre( 'Transportes Olvidados es la Carretera' ); //Mostramos resultado echo "El transportista <b>" . $transportista ->str_nombre_transportista . "</b> tiene <b>" . $transportista ->paquetes_guardados . "</b> paquetes guardados."; ?>
El código produce la siguiente salida:
El transportista Transportes Olvidados es la Carretera tiene 14 paquetes guardados.
Conclusión
En este tutorial, aprendió que puede encadenar propiedades y métodos para proporcionar un código fluido y mejorar su legibilidad.
En el próximo tutorial , aprenderá cómo restringir el acceso a las propiedades y métodos dentro de las clases utilizando las palabras clave private y public.