jump to navigation

Tecnicas de Programacion – Inversion de Control mayo 21, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
19 comments

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.