Dependency Injection en PHP


Lección 21 / 24

Dependency Injection en PHP

Php Desarrollador Php Curso php

Hemos visto, en las guías anteriores, las ventajas de la programación orientada a objetos; sin embargo, no todo lo que reluce es oro, y cabe señalar que la Programación Orientada a Objetos también tiene problemas a los que te enfrentarás. Cuando trabajamos dentro de lenguajes de programación que usan OOP, de hecho, uno de los mayores problemas a enfrentar es el de las dependencias.
Afortunadamente existen medios que nos pueden ayudar en este sentido: el más famoso es un patrón de diseño conocido como Dependency Injection.

¿Qué son las dependencias?

Sin embargo, antes de entrar en la Dependency Injection, es importante comprender qué es una dependencia.
Una dependencia puede definirse en programación informática como un vínculo existente entre varios componentes de una aplicación para el que el funcionamiento de una parte "depende" precisamente de la naturaleza y presencia de las otras partes.

Cojamos el ejemplo de un ordenador: sabemos que no puede funcionar sin una placa base. Esto quiere decir que la clase "Computer" (dependiente) no puede funcionar sin la clase "MotherBoard" (dependencia) y que, por tanto, no podremos utilizar la primera sin involucrar necesariamente a la segunda.
Un ejemplo de este tipo puede transmitir fácilmente uno de los aspectos críticos de la presencia de dependencias: nuestro proyecto será mucho menos flexible, lo que impactará negativamente en la reutilización de una clase y, por lo tanto, en la velocidad de desarrollo, la calidad y la legibilidad del código.


¿Qué es la Dependency Injection?

Una vez que hemos establecido qué son las dependencias, podemos empezar a hablar del concepto de Dependency Injection.
Tratemos de traducir el ejemplo anterior del ordenador en código:

class Computer {

    public $motherBoard;

    public function __construct($type){
        $this->motherBoard = new MotherBoard($type);
    }
}

$computer = new Computer('ATX');

De esta manera, crear una instancia de Computadora es muy simple y rápido, pero muestra el lado en términos de personalización.

En relación con lo dicho anteriormente, es evidente que este tipo de enfoques, que a primera vista pueden parecer correctos, inevitablemente acarrea problemas. De hecho, hacerlo crea claramente la dependencia dentro del constructor. De esta forma, la clase Computer está fuertemente acoplada a su dependencia, la clase MotherBoard.
Esto significa que un cambio en el constructor MotherBoard (quizás la adición de otras propiedades) tendrá un efecto en cascada en todas las instancias de la clase Computer.
Además, los argumentos pasados ​​al generador del ordenador no tienen nada que ver con su alcance, ya que solo los utiliza la placa base. De hecho, como regla, una clase debe ser responsable de una sola cosa.
Intentemos, ahora, ajustar el tiro:

class Computer {

    public $motherBoard;

    public function __construct($motherBoard){
        $this->motherBoard = $motherBoard;
    }
}

$motherBoard = new MotherBoard('ATX');

$computer = new Computer($motherBoard);

Hemos dado un gran paso adelante, aplicando la que es la forma más común de Dependency Injection, inyectando dependencias directamente al constructor de la clase (Constructor Injection).
Esto nos da la libertad de modificar MotherBoard sin tocar la clase Computer en lo más mínimo.
También podemos hacer que sea "más seguro" crear una instancia de la clase Computer utilizando lo que se denomina type hinting, es decir, especificando que un objeto de la clase MotherBoard debe pasar necesariamente como argumento de construcción de la instancia Computer.

class Computer {

    public $motherBoard;

    public function __construct(MotherBoard $motherBoard){
        $this->motherBoard = $motherBoard;
    }
}

$motherBoard = new MotherBoard('ATX');

$computer = new Computer($motherBoard);

De esta manera tenemos un código mucho más fácil de leer y entender, ya que a través de la sugerencia de tipo, si se inyecta una dependencia inadecuada, podríamos notarlo inmediatamente (se desencadenaría un error de inmediato).

En conclusión, aunque se presenta principalmente como un aspecto problemático, en realidad, en proyectos a largo plazo, con continuas evoluciones, Dependency Injection da lo mejor de sí y es por eso que es un patrón de diseño fuertemente en tendencia en estos días.
Ciertamente, aplicar Dependency Injection tiene costos a veces difíciles de ver, como los de planificar la aplicación, pero sin duda vale la pena.
Con clases estrechamente acopladas (el primer ejemplo de nuestro ordenador), el proyecto se vuelve extremadamente complejo para evolucionar y probar, con una simple modificación en una clase que corre el riesgo de afectar a todas las demás.

Resumiendo, Dependency Injection es una herramienta notable en el mundo de los desarrolladores de php, pero recomendamos usarla de manera inteligente.

© 2022 Aulab. Todos los derechos reservados • P.IVA: IT07647440721 • Política de privacidad