You are on page 1of 4

3.

3 - POO: Inyeccin de dependencias


Los juegos de estrategia y de rol me ayudaron a entender
la programacin orientada a objetos y ciertos patrones de diseo.
En Warcraft cada unidad (ej: un arquero) es un objeto que
interacta con otras unidades (objetos), el mapa en s es un objeto
que encapsula todos los objetos anteriores.
Una barraca es tambin un objeto que implementa el patrn
Factory porque produce otros objetos (soldados). Un hroe
podra implementar el patrn singleton dado que es nico en
cada partida.
As que para aprender fcilmente qu es la inyeccin de
dependencias imaginemos que estamos construyendo el backend
de un juego:
Cdigo :
<?php
class Bow {
// Code here
}
class Elf extends Unit {
protected $bow
public function __construct()
{
$this->bow = new Bow;
}
public function shoot($target)
{
return $this->bow->shoot($target);
}
}
class Orc extends Unit {
//Code here
}
$elf = new Elf;
$elf->setName('Legolas');
$orc = new Orc;

$elf->shoot($orc);

Cada elfo es un objeto que tiene una dependencia en otro objeto


(en este caso un arco), adems, a medida que el elfo aumente de
nivel necesitar de otros arcos ms potentes.
Con nuestro cdigo actual cmo podemos hacer eso? Respuesta:
no podemos. Nuestro heroe est atado a usar un slo tipo de
arco y a medida que sus enemigos se vuelvan ms fuertes y
numerosos no podr contra ellos y morir, y ser tu culpa.

Inyeccin de dependencias al rescate


Refactoricemos:
Cdigo :
<?php
interface BowInterface {
public function shoot($target);
}
class Bow implements BowInterface {
public function shoot($target)
{
// I don't know how to shoot arrows with PHP yet
}
}
class Elf extends Unit {
protected $bow
/**
* Dependency injection using the class constructor
*/
public function __construct(BowInterface $bow = null)
{
if (is_null($bow))
{
$this->bow = new Bow;
}
else
{
$this->bow = $bow;
}
}

/**
* Dependency injection using a setter method
*/
public function setBow(BowInterface $bow)
{
$this->bow = $bow;
}
public function shoot($target)
{
return $this->bow->shoot($target);
}
}

Ahora la clase Elf recibe el arco como parmetro a travs del


constructor de la clase, es decir que cuando creemos un elfo
podemos inyectar un arco diferente:
Cdigo :
$elf = new Elf(new LongBow);

Tambin podemos cambiar de arco en cualquier momento usando


el mtodo setter, otra forma de inyectar una dependencia:
Cdigo :
$elf->setBow(new LongBow);

Uso de interfaces
Una interfaz nos permite crear implementaciones de forma segura.
En nuestro ejemplo siempre que LongBow o cualquier arco que
creemos implemente la interfaz "BowInterface" podr ser usada
por el objeto Elf sin problemas:
Cdigo :
class LongBow implements BowInterface {
public function shoot($target)
{
// A long bow should have more range and be more powerful

En una interfaz slo definimos los headers de cada mtodo que


sea necesario implementar, ejemplo: public function
shoot($target) las clases que implementen una interfaz deben
definir cada uno de esos mtodo con su correspondiente
implementacin de cdigo.

Conclusin
La inyeccin de dependencias es el fondo un concepto sencillo que
har tus objetos mucho ms flexibles y menos dependientes unos
de otros.
En un prximo tutorial veremos este concepto con el
framework Laravel