Arquitectura de Software 10 Jul 2006 11:59 am
Reusabilidad III: Frameworks
Podríamos traducirlo por marco o entorno de trabajo, pero como con tantos conceptos dentro de la computación que han surgido del mundo anglo-sajón, creo que en este caso y dada la extensión de uso del término en inglés lo dejamos como está y listo.

Las características deseables para un producto software son variadas y muy necesarias. Un software debe ser extensible, modular, robusto y eficiente. Conseguir estas características es complejo, y los frameworks aportan la tecnología que trata de abordar esta complejidad incrementando los niveles de reusabilidad del código.
Un framework es una colección de componentes software que colaboran entre sí para proporcionar una arquitectura reusable para una determinada familia de aplicaciones.
Los componentes de un framework son clases (gestores de mensajes, manejadores de eventos, mapas de conexiones,…), jerarquías de clases, categorías de clases (familias de mecanismos de control) y objetos.Un componente es una unidad de encapsulación de servicios con uno o más interfaces a través de los cuales se proporciona acceso a los servicios que ofrece. También podemos definir un framework como un diseño reusable, de una parte o de un todo de un sistema, representado por un conjunto de clases abstractas y la forma en que interaccionan sus instancias.
Se trata de integrar componentes que son independientes de la aplicación con los que son específicos de forma sencilla para que puedan colaborar entre ellos. La configuración de los componentes de un framework puede ser dinámica (en instalación o ejecución) o estática (en tiempo de compilación).
Normalmente los framework se apoyan y hacen un uso intensivo de los patrones de diseño.
Un framework tipo Modelo/Vista/Controlador se puede descomponer en tres patrones de diseño principales y varios secundarios.
Observer : Para asegurar que la presentación de la vista del modelo está actualizada.
Composite: Para anidar vistas.
Strategy : Para provocar que las vistas deleguen la responsabilidad de tratar los eventos de usuario a sus controladores.
Un framework orientado a aplicaciones distribuidas en red tiene tres características principales:
-
Inversión de Control.
Cambia el modo de programación. No somos nosotros como desarrolladores de un aplicación basada en un framework los que programamos la lógica de control del software. El framework proporciona mecanismos que llamarán a los métodos específicos que programemos para nuestra aplicación.
La inversión se realiza a través de funciones de devolución de llamada (callbacks) a los métodos gancho (hook methods) cuando ocurre un evento como la llegada de datos a una conexión de red. Cuando llega el evento el framework llama al método gancho virtual de un componente registrado previamente que realiza el procesamiento específico de la aplicación.
Los métodos gancho virtuales separan y abstraen el software específico del software reusable que proporciona el framework, y esto nos permite extender y personalizar las aplicaciones de forma más fácil y sencilla.
-
Proporciona un conjunto integrado de estructuras y funcionalidad para determinado dominio.
Soluciones comunes, recurrentes, probadas y elegantes.
-
Es una aplicación semi-completa.
El programador la personaliza para crear la aplicación buscada extendiendo los componentes reusables del framework.
El objetivo perseguido es aumentar la cantidad de código reutilizado frente al nuevo.
-
El uso de frameworks presenta algunos problemas:
- Difíciles de aprender.
- Son muy potentes pero también son complejos. Requieren de más y mejor documentación que otros sistemas.
- Difíciles de desarrollar: Requieren profundos conocimiento de ingeniería y programación, dominio de patrones de diseño y de técnicas Orientadas a Objeto. Mejores programadores que la media.
- Restringido por lenguaje: Están implementados en un lenguaje y en general quedan restringidos a productos desarrollados en el mismo lenguaje. CORBA trata de resolver este problema entre otros.
Algunos ejemplos de frameworks son MacApp, X-Windows, Java Swing, MFC, Struts y ACE.