Estructura de paquetes. Organizando los elementos del sistema.

En el número anterior expusimos la forma de abordar la complejidad de un sistema J2EE a través de su organización en capas conceptuales. En esta ocasión aplicaremos este método para organizar los elementos de un sistema. Es decir, definiremos una jerarquía de paquetes para contener las clases que componen el sistema. Aunado a la aplicación de las capas conceptuales, y con el objeto de diseñar un Sistema J2EE de la vida real, aplicaremos el patrón MVC (ver Fundamentos, pg. 42) a esta arquitectura que será diseñada. ¿Qué beneficios ofrece esto? Reducir la duplicidad del código, facilidad de mantenimiento y una arquitectura robusta, la cual puede ser empleada como plantilla en el diseño de un Sistema J2EE.

Diseño de la Arquitectura
Una vez que hemos entendido la importancia del Patrón MVC en sistemas que poseen varios tipos de clientes, ha llegado el momento de mostrar en dónde encaja el método de organización en capas conceptuales. La organización consiste en la estructura de paquetes en que globalmente será dividido un sistema. Para esto nos apoyaremos en un sistema cuya arquitectura de referencia será basada en los Patrones MVC y Fachada (un patrón donde se provee una interfaz sencilla hacia objetos o subsistemas complejos). La figura 1 muestra la arquitectura de este sistema. En la imagen se puede observar que se cuenta con un solo cliente, el cual es una aplicación JFC/Swing, y además de que el sistema, desde la perspectiva del cliente, sólo está dividido en tres partes: Vista, Controlador y Modelo.

Figura 1. Una arquitectura basada en los Patrones MVC y Fachada.

Si analizamos con detalle la arquitectura encontraremos varios puntos interesantes. El objeto Modelo, desde la perspectiva del Controlador, funciona como un Proxy de toda la Lógica de Negocios tanto local como remota (EJB’s). Gracias a esto, al Controlador le resulta transparente el hecho de que está obteniendo datos de una fuente local (un archivo a través del ModeloLocal) o remota (Servidor de Aplicaciones a través del ModeloRemoto); desde su perspectiva, debe de relacionarse exclusivamente con un solo objeto, el Modelo.

Ahora definiremos la estructura de paquetes que será organizada a través de las capas conceptuales. Primero definiremos el espacio de nombres, éste viene dado por el nombre de dominio en Internet de la organización, pero en orden invertido. Por ejemplo, mx.edu.loyola sería el espacio de nombres para el dominio loyola.edu.mx. Después hay que agregar el acrónimo del Sistema a nuestro espacio de nombres. Por ejemplo, SIL es el acrónimo de un proyecto que lleva por nombre “Sistema Integral Loyola”. Posteriormente se define un paquete para cada una de las cinco capas conceptuales. La plantilla se muestra en el Listado 1.

Listado 1. Esquema de paquetes genérico.

El Listado 2 muestra cómo sería la estructura de paquetes para el ‘SIL’, el Sistema de ejemplo:

Listado 2. La estructura de paquetes en un Sistema Real.

Los paquetes para clientes y la Lógica de Negocios
Los clientes cuya arquitectura está basada en el Patrón MVC sólo emplearán las tres primeras capas (presentación, aplicación y servicios) para almacenar las clases de los objetos Controlador, Vista y Modelo. Las otras dos capas son exclusivas para la programación del lado del servidor, sin embargo, la capa de servicios es compartida tanto por el cliente como por el servidor. El siguiente paso es agregar en cada una de estas tres capas un paquete para cada tipo de cliente. Por ejemplo, el Listado 3 muestra al SIL con dos tipos de cliente: uno de tipo inalámbrico basado en MIDP (Mobile Information Device Profile) y una aplicación JFC/Swing.

Listado 3. La estructura para dos tipos de cliente.

Como la Lógica de Negocios está programada a través de EJBs, se declara el paquete ‘ejbcontainer’ en cada una de las tres últimas capas. En la de servicios se almacenarán nuestras fachadas; en la de dominio, el modelo conceptual; y en la de persistencia, todas aquellas clases que colaboran en el almacenamiento de nuestro modelo conceptual.

Listado 4. El paquete para los EJB’s.

Los Paquetes para los Módulos del Sistema
Un sistema suele dividirse en módulos cohesivos que encapsulan una funcionalidad muy específica e independiente de otros módulos. El siguiente paso es agregar los paquetes para los módulos en cada uno los paquetes de tipo de cliente y en el de los EJBs. Por ejemplo, el SIL puede estar dividido en dos módulos: cobranza y control escolar. El Listado 5 muestra como deben estar organizados estos paquetes.

Listado 5. Los Módulos en cada uno de los clientes y en el paquete de los EJB’s.

Lo que resta es definir dónde se deben almacenar cada uno de los objetos que componen nuestro sistema en base al Patrón MVC. Las clases que componen las vistas son almacenadas en la capa de presentación; el controlador en la de aplicación; y el modelo en la de servicios. El Listado 6 muestra las clases que formarían parte de un módulo y de un cliente. La figura 2 muestra cómo se comportaría este módulo en tiempo de ejecución.

6. Algunas de las clases que conforman un solo Módulo: cobranza.

Conclusión
Hemos mostrado la forma en que las capas conceptuales nos pueden auxiliar en la organización de un sistema cuya arquitectura referencial está basada en los patrones MVC y Fachada. Todo esto nos ofrece beneficios tales como: mejorar la organización del código, desacoplar el modelo de negocios con el de presentación, un fácil mantenimiento, reutilización de código y facilidad al momento de agregar un nuevo tipo de cliente.

Lo que aquí se ha expuesto es una plantilla de referencia que puede servirnos como guía al momento de crear un nuevo Sistema J2EE. Esperamos que les pueda ser de utilidad.