domingo, 16 de febrero de 2014

Desambiguación IOC y DI

Desde hace pocos años, con la moda de las buenas prácticas en programación,  SOLID y  TDD, están muy presentes en este escenario los términos IoC y DI(Dependency Inyection o Inyeccción de dependencias) más adelante explico porque tacho este término

Después de leer muchisimos artículos en Internet sobre el tema, interpreto que hay muchísima confusión con estos dos términos; voy a dar mi opinión de porque: Resulta que dentro del contexto de los principios SOLID de la POO, está el principio D, que se llama Inversión(no inyección) de Dependencias y dice que debemos depender de abstracciones, no de concreciones.

En el contexto de una clase, se tiene por norma la siguiente regla basada en este principio:
Nunca instanciar una clase B dentro de una clase A, lo correcto es: 
o bien recibir por parámetro la clase B (o interfaz B)
, o depender de una interfaz de la clase B, pero nunca de una clase concreta

¿Y cómo aplicamos la regla basada en este principio?, pues bien hay dos opciones:

  1. Inyectar la clase por el constructor, o también una interfaz, al instanciar la clase pasarle por parámetro el objeto concreto.A esta técnica o patrón se le llama DI (Inyección de dependencias), y debido a su similitud léxica con el principio D(Inversión de dependencias) es la causa de confusión entre los términos, porque el principio es inversión, no inyección, y la técnica o patrón sí que es la inyección.
    En muchos posts sobre el tema leeremos,
    "aplicar el principio de Inyección de Dependencias"
    , pero esto no es correcto, porque el principio es la inversión, no la inyección.

  2. Crear un repositorio de factoría de objetos en el que asociar interfaces con objetos concretos (vease este post), dentro de la clase está permitido llamar al repositorio para obtener objetos, pero nunca instanciar objetos directamente.

    Este segundo patrón se puede combinar con el primero puesto que son compatibles, es decir, tener un repositorio de objetos e inyectar a la clase la interfaz. Esto es lo que hacen muchos IoC contaniers (Unity, Ninject, spring.NET, etc...)

    En este contexto opino que es correcto llamar al repositorio de objetos IoC, puesto que este es un agente que servirá para instanciar objetos, no será necesario que los instanciemos nosotros, de hecho este término se cita en algunos posts aludiendo al principio de Hollywood ("No nos llame, le llamaremos nosotros")

    Opino por tanto que sí que es correcto el uso de este término, aunque puede crear cierta confusión con respecto a lo que IoC significa, ya que IoC es un término que ya se usaba antes en informática y está vinculado al patrón Observer, es decir que cualquier evento se puede decir que está usando IoC, por ejemplo el clic de un botón..., en cualquier caso no es el objetivo de este post discutir sobre este término sino sobre el de DI.

En el contexto de combinación de los dos patrones, podemos encontrar en muchos posts 
"Aplicamos el principio Inyección de Dependencias utilizando IoC"
, púes bien opino que esto no es correcto, que se está definiendo así en muchos posts debido a la confusión del término que he descrito antes, y lo correcto sería decir
"Aplicamos el principio Inversión de Dependencias combinando Inyección de dependencias e IoC"

Bueno, al menos esta es mi opinión sobre porque el uso del principio Inversión de de dependencias se ha confundido con el patrón Inyección, no obstante se aceptan alegaciones en contra.

No hay comentarios:

Publicar un comentario