jump to navigation

Tecnicas de Programacion – Inversion de Control mayo 21, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
trackback

Articulo interesante que me encuentro en Amol’s Learning Journal

Inversion of control, tambien conocido como dependency Injection, se refiere a la forma en que un objeto usa otro objeto.
Por ejemplo, Supon que tenemos la siguiente clase A, que usa a la clase B,
tradicionalmente creas y usas una instancia de la clase B dentro de la
clase A, de acuerdo al siguiente ejemplo:

Class A
{
private B b;
public A() {
b = new B();
}
public void doSomething(){
b.someMethod();
}
}

Esto presenta el siguientes problema:

Un cambio en la implementacion del constructor de la clase B,
implicara cambiar la implementacion de la clase A. Imagina por ejemplo
que ahora como parametro al constructor de la clase B, le pasas un
String:

public B(String str);

necesariamente has de adaptar la clase A, donde se utiliza ese constructor.

Y tambien imagina que lo unico que quieres hacer es cambiar la implementacion del servicio. Por ejemplo tienes una clase C, que implementa el mismo metodo de la clase B (doSomething) pero de otra manera, el cambiar de esa implementacion de servicio a la otra, deberia poder ser inmediata sin necesidad de tener que tocar el codigo de la clase A.

La solucion a estos problemas: La inversion de Control.
Veamoslo con un ejemplo:

Definimos la clase A:

public class A
{
private C c;
public A(C objetoc)
{
this.c = objetoc;
}
public void hago_algo()
{
c.hacer_algo();
}
}

Como observas, pasamos el objeto en el constructor, no lo instanciamos dentro del constructor como haciamos antes con el operador “new”.

Para la clase C, definimos la interface:

public interface C {
public void hacer_algo();
}

y dos clases que implementan el metodo de manera diferente:

public class C_Implementacion1 implements C
{
public void hacer_algo()
{
// hacer algo version 1
System.out.println("Implementacion 1 de algo");
}
}

public class C_Implementacion2 implements C
{
public void hacer_algo()
{
// hacer algo version 2
System.out.println("Implementacion 2 de algo, algo diferente a lo que haga en 1");
}
}

Como ves, ahora es posible cambiar el constructor de las clases C, o el metodo que usamos en la clase A, sin necesidad de modificar el codigo
existente de A.

public static void main(String[] args) {
C metodo1 = new C_Implementacion1();
A a = new A(metodo1);
C metodo2 = new C_Implementacion2();
a = new A(metodo2);
}

Las ventajas son evidentes.

Comentarios»

1. ferchik - enero 18, 2008

Acabo de leer tu post. Lo encontré excelente por lo simple.
Gracias.
Ferchik

2. Inconexo - febrero 5, 2008

¿Eso es la inversión de control? ¿En lugar de crear los objetos en el constructor, pasarlos como argumentos, para aprovechar el polimorfismo? Pues lo llevo haciendo toda la vida.

Gracias por tu entrada, la más clara que he encontrado al respecto.

3. David - marzo 21, 2008

Entendí. muchas gracias!

4. juan - septiembre 5, 2008

Con diferencia, LA MAS CLARA explicación que he encontrado.

Muchsa gracias.

5. WarHar - noviembre 4, 2008

Vale superpiwi, es muy dificil que exista una explicación mas sencilla sobre el tema, incluso tal vez mi abuelita lo entenderia y eso que ella no sabe nada de ordenadores jajaja.

Muchas gracias.

6. i5arck - noviembre 25, 2008

Hola, perdon el atrevimiento pero tengo que decir que tu post esta mal, IoC y DI son completamente diferentes, DI se enfoca en inyectar dependecias via set o constructor e IoC se enfoca en quien tiene el control del flujo de la programacion….
Espero no haber ofendido, gracias.

7. Gerardo Contijoch - diciembre 7, 2008

Estoy de acuerdo con lo que dice i5arck en parte. IoC y DI no son lo mismo, pero tampoco son cosas completamente diferentes. DI es sólo una de las tantas formas de IoC. Recientemente escribí un post sobre el tema donde explico un poco esto que estoy diciendo (o por lo menos como yo lo entiendo):
http://gerardocontijoch.wordpress.com/2008/12/06/inversin-de-control-e-inyeccin-de-dependencias/

Saludos!

8. Emanuel - julio 27, 2009
9. Antonino - agosto 13, 2009

Ahora si entiendo esto de la inversion de control ! jaja
Gracias!!

10. urmom - diciembre 26, 2009

mmm, esto no es inversón de control😛
y que pasa si la firma del metodo c.do_something() cambia a c.do_something(String a)???
no solo tienes que modificar la clase A, si no que todas las interfaces con que te llenaste..menor trabajo o mayor???

11. mymom - diciembre 26, 2009

Bueno, en estricto rigor sí es IOC (o dep. injection), lo que pasa es que este lio es un fiazco

12. rupertus - febrero 18, 2010

Pues NO es inversion of control, que pasa si c.hacer_algo necesita un parámetro ???

O cambiamos todo o hacemos un par de desprolijidades para pasar ese parametro con un metodo nuevo !!!

13. gorums - junio 1, 2011

El problema que plantea urmom, se resuelve a traves de lo que se denomina IoC container, que no es mas que ir resolviendo dependencias recursivamente.

14. Marcelo - junio 8, 2011

Hola, muy bueno el post.. por la simpleza.

Gracias.

15. angerrising - enero 19, 2012

la mejor explicacion que puede haber

saludos.

16. NoDejoNombre - abril 3, 2012

IoC es lo mismo que DI por lo menos para Spring sino mirar el capitulo de spring 4.1 de la documentación de Spring 3.1

4.1 Introduction to the Spring IoC container and beans

This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) 1principle.
IoC is also known as dependency injection (DI).

17. Alex - julio 24, 2012

Excelente gracias por tu aporte.

18. skuarch - septiembre 17, 2012

se entiende muy bien por que esta sencillo a qui dejo mi blog por si alguien lo quiere ver http://skuarch.blogspot.com


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: