martes, marzo 19, 2013

Inversion of Control (IoC)

Durante mis años de experiencia, programando en Java, cuando apareció Spring tomé conciencia de un concepto llamado "Inversion of Control (IoC)" que en español sería algo como "Control Invertido" o "Inversión del Control". ¿Y a qué se refiere?

Bueno, la idea es bastante simple, cotidiana y de sentido común, el problema es cómo explicarlo. Todo parte por entender a qué se refiere con "Control", y esto hace referencia a cómo nosotros ejecutamos las órdenes para hacer algo (una aplicación). Por ejemplo, un mini-programa que pregunta algo por pantalla, el usuario responde y luego imprimimos en pantalla la respuesta. Aquí el "control" lo tenemos nosotros, es decir, nosotros (mediante la programación estructurada) vamos indicando cuándo hacer alguna cosa (preguntar, imprimir, etc). La inversión ocurre, cuando delegamos el control en alguien más. En el caso anterior, nosotros le decimos a la aplicación o al JVM cuándo hacer determinada cosa, al revés sería que la aplicación o el JVM determinara cuándo hacer cada cosa de nuestro código, pero para ese sencillo ejemplo, no existe ejemplo inverso, entonces debe haber algo más.

Aquí es, entonces, donde tienen sentido los frameworks como Spring (aplica también para los servidores de aplicaciones). Un framework es una aplicación, a fin de cuentas, que cuando se utiliza se ejecuta. Cuando creamos, una aplicación Web con Java, básicamente usamos Servlets. Los Servlets son instancias de clases ya existentes (o se extienden) que son "ejecutados" por el contenedor de servlets (por ejemplo, Tomcat). De esta manera, nosotros no "creamos" la aplicación Tomcat, sólo le pasamos los componentes y cómo funcionan, y es Tomcat el que tiene el "control" de ejecutarlos de acuerdo a una petición (request) HTTP.

Lo mismo pasa con Spring, que es un framework con un montón de funcionalidades y utilidades que se "monta" como parte de la aplicación que deseamos crear, pero le delegamos a Spring el control de ejecución de nuestros componentes. Así, en términos simples, la inversión de control significa que Spring instancia y ejecuta nuestros componentes. Spring tiene el control, no nosotros. ¿Qué aburrido no? (aburrido en el sentido de lo simple que era entender el concepto).

Otra cosa, diferente, es "Dependency Injection", que tiene que ver con la forma en cómo los componentes son creados y relacionados con otros. Y la relación con "IoC" es que, en el caso de Spring, nosotros le delegamos a Spring la forma cómo hace el enganche entre los componentes. No programamos esa parte, en el sentido de que nosotros no tenemos que crear clases con patrón Factory que instancian clases y luego invocan al método "set" de dichas clases para "inyectarles" otra clase, nada de eso, eso lo hace Spring. Nosotros le decimos sólo que tal clase usa otra clase de un determinado tipo y ya.

Fuente: http://martinfowler.com/articles/injection.html

1 comentario:

Carlos Del Aguila Rios dijo...

Una explicación simple pero muy clara de lo que es Inversión de Control (IoC). Muchas gracias.