Los patrones de diseño mejoran las aplicaciones J2EE

Desde sus inicios, J2EE (Java 2 Platform, Enterprise Edition) ha simplificado la construcción de aplicaciones empresariales en Java. Sin embargo, a medida que J2EE se adopta más ampliamente, los desarrolladores se están dando cuenta de la necesidad de enfoques definidos que simplifiquen y estandaricen la creación de aplicaciones. Puede comenzar a lograr ese objetivo estandarizando la capa arquitectónica de su aplicación .

La capa arquitectónica generalmente encapsula las complejidades técnicas de una aplicación independientemente de la lógica empresarial, proporcionando así un acoplamiento flexible entre la funcionalidad empresarial y la infraestructura técnica subyacente. En este artículo, explico un método emergente para construir la arquitectura de aplicaciones para proyectos J2EE, uno que emplea patrones de diseño para proporcionar la estandarización y simplicidad que demanda una buena arquitectura.

Arquitectura de aplicaciones y J2EE

J2EE es una gran tecnología de infraestructura. Proporciona un estándar uniforme para las tareas de nivel inferior de la pila de tecnología, como la comunicación de bases de datos o la distribución de aplicaciones. Sin embargo, J2EE no lleva a los desarrolladores a crear aplicaciones exitosas. Los creadores de J2EE, mirando hacia abajo en la pila de tecnología, se preguntaron: "¿Cómo podemos estandarizar estas API?" Deberían haber mirado a los desarrolladores de aplicaciones y preguntar: "¿Cómo puedo darles a los desarrolladores los componentes básicos que necesitan para centrarse en su aplicación empresarial?"

Al comenzar un nuevo proyecto J2EE, algunos miembros del equipo a menudo preguntan: "Si J2EE es en sí mismo una arquitectura, ¿por qué necesitamos más?" Muchos desarrolladores mantuvieron ese concepto erróneo en los primeros días de J2EE, pero los desarrolladores de J2EE experimentados entienden que J2EE no proporciona la arquitectura de aplicación necesaria para ofrecer aplicaciones de alta calidad de manera consistente. Estos desarrolladores a menudo usan patrones de diseño para llenar ese vacío.

Patrones de diseño

En programación, los patrones de diseño le permiten aprovechar la experiencia colectiva de la comunidad de desarrolladores al compartir problemas y soluciones que benefician a todos. Un patrón de diseño debe capturar la definición y el contexto de un problema, una posible solución y las consecuencias de la solución.

Para los propósitos de la arquitectura de aplicaciones J2EE, los patrones de diseño se dividen en dos categorías: patrones generales de desarrollo de software y aquellos patrones que identifican desafíos específicos de J2EE. Los patrones de diseño específicos de J2EE identifican el conjunto mínimo de problemas conocidos que una arquitectura de aplicación sólida debería resolver. El primer grupo, el de los patrones de desarrollo de software no específicos de J2EE, resulta igualmente poderoso, no para identificar problemas, sino para guiar la construcción de la arquitectura.

Examinemos cada área con más detalle.

Patrones de diseño J2EE

Los patrones de diseño de J2EE han ido evolucionando en los últimos años a medida que la comunidad Java ha ido ganando experiencia en J2EE. Estos patrones de diseño identifican los problemas potenciales encontrados al utilizar las diversas tecnologías especificadas por J2EE y ayudan a los desarrolladores a construir los requisitos de una arquitectura de aplicación. El popular patrón de diseño del controlador frontal, por ejemplo, transforma el código de servlet no estructurado en un controlador que recuerda al desarrollo refinado de GUI (interfaz gráfica de usuario).

Los patrones de diseño de J2EE identifican los problemas de dominio con mayor probabilidad de aparecer en sus proyectos J2EE. De hecho, si los problemas fueran raros, los patrones de diseño no habrían evolucionado para resolverlos. Con eso en mente, se beneficiará al abordar cada problema de dominio en su arquitectura. Para resolverlos todos, cree una lista de verificación para validar la integridad de su arquitectura. Ese proceso contrasta con el proceso para los patrones de diseño de desarrollo de software que discuto a continuación, ya que necesita aplicar esos patrones solo cuando y si es apropiado.

Entonces, ¿dónde se encuentran los patrones de diseño J2EE? Sun Microsystems ofrece dos libros que contienen muchos patrones J2EE:

  • Designing Enterprise Applications with the Java 2 Platform (Enterprise Edition) del J2EE BluePrint Group , Nicholas Kassem et al. (Addison-Wesley, 2000; ISBN: 0201702770)
  • Patrones principales de J2EE de The Sun Professional Services Group : mejores prácticas y estrategias de diseño, Deepak Alur, John Crupi y Dan Malks (Prentice Hall, 2001; ISBN: 0130648841)

(Consulte Recursos para obtener enlaces a ambos libros).

Más allá de los recursos de Sun, otras publicaciones ofrecen información de patrones de diseño J2EE, incluidas varias revistas de la industria Java o sitios web (como JavaWorld ), así como numerosos libros. (Ver Recursos para los enlaces a algunos de estos sitios, entre ellos JavaWorld' s Design Patterns página de índice de temas.)

Patrones de diseño de desarrollo de software

También tenga en cuenta los patrones de diseño de desarrollo de software, divididos en patrones de diseño generales orientados a objetos (OO) y patrones de diseño específicos de Java. El patrón Factory, por ejemplo, representa un poderoso patrón de diseño OO para encapsular la creación de objetos para permitir la reutilización y cumplir con los requisitos cambiantes de un sistema. Por su parte, los patrones de diseño del lenguaje Java tienen en cuenta las características específicas del lenguaje Java. Algunos son exclusivos de Java y suelen ser informales (por ejemplo, excepciones y primitivas), mientras que otros son patrones OO refinados para aplicarlos a Java. El famoso libro Gang of Four, Design Patterns de Eric Gamma et al., Detalla numerosos patrones generales de desarrollo de software útiles para todos los programadores.

No descarte estos patrones simplemente porque no son específicos de J2EE. Por el contrario, tales patrones pueden resultar tan poderosos, si no más, que los patrones de diseño J2EE, porque:

  • Si bien los patrones de diseño de J2EE son nuevos y evolucionan (porque J2EE es nuevo y evoluciona), los otros patrones se benefician de la edad, ya que la industria ha tenido más tiempo para revisarlos y refinarlos.
  • A menudo sirven como base de la que se derivan los patrones de diseño J2EE.
  • Construyen la base sobre la que se implementan las soluciones específicas de J2EE. La construcción correcta de esta base afecta ampliamente la solidez y extensibilidad de toda la arquitectura. Si no se construye correctamente, la base minimizaría la utilidad de la arquitectura independientemente de cuántos problemas J2EE resuelva.

No haga una lista de verificación que cubra los patrones de desarrollo de software que requiere su arquitectura, como lo haría con los patrones J2EE. En su lugar, utilice dichos patrones cuando sea apropiado en función de los desafíos específicos de su proyecto. Muchos desarrolladores creen erróneamente que sus productos mejorarán si usan más patrones, ¡o si los usan todos! Ese, sin embargo, no es el caso. Use discreción y delicadeza al decidir qué patrones emplear y cómo usarlos juntos.

Patrones de diseño: ¿Dónde está el código?

Tenga en cuenta que los patrones de diseño no vienen con la implementación exacta o el código fuente que utilizará. Las ofertas de patrones de diseño van desde descripciones textuales escasas hasta documentación rica y posiblemente algún código de muestra. El desafío consiste en aplicar las poderosas ideas de los patrones. Estas ideas deben aplicarse al entorno en el que se utilizarán; el entorno define la correcta implementación.

Como analogía, considere un patrón de diseño para construir los cimientos de una casa. El patrón de diseño identifica el problema, el contexto y la posible solución para la construcción de los cimientos, información inmensamente valiosa para el trabajador de la construcción en el campo. Sin embargo, el trabajador aún debe construir los cimientos. ¿No se beneficiaría más ese trabajador de la construcción si se le dieran los cimientos (similar al desarrollador de software que recibe la implementación)? Tal vez esta base sería solo una losa de concreto sobre la que se podría construir la casa. El problema: Los cimientos deben integrarse con la casa misma y el terreno donde residirá la casa. ¿Cómo puede una base preconstruida acomodar todos los posibles planos de la casa (rectángulo, cuadrado y otras formas extrañas) y todos los paisajes posibles (en la cima de una colina,en medio de un bosque, etc.)?

De vuelta en el mundo del software, la viabilidad de utilizar patrones de diseño prediseñados depende de dos factores:

  • La implementación, no los patrones de diseño individuales, representa una solución. La solución podría incorporar múltiples patrones de diseño y, al hacerlo, sabría cómo se combinan los patrones de diseño individuales.
  • La solución debe ser adaptable, lo que responde a la pregunta final a partir de la analogía de la cimentación preconstruida: la cimentación debe poder adaptarse al terreno y a las plantas. Como puede imaginar, se necesitaría un artesano extremadamente hábil para construir la base adaptable en lugar de la base estándar.

Patrones de diseño comunes

La siguiente tabla enumera algunos patrones de diseño comunes de fuentes J2EE y patrones OO más amplios.

Patrones de diseño comunes
Patrones de diseño J2EE Patrones de desarrollo de software
Fachada de la sesión único
Ensamblador de objetos de valor Puente
Patrón de localizador de servicios Prototipo
Delegado comercial Fábrica abstracta
Entidad compuesta Peso mosca
Controlador de lista de valores Mediador
Localizador de servicios Estrategia
Entidad compuesta Decorador
Objeto de valor Estado
Servicio al trabajador Iterador
Objeto de acceso a datos Cadena de responsabilidad
Filtro de interceptación Controlador de vista de modelo II
Ver ayudante Recuerdo
Vista compuesta Constructor
Vista de despachador Método de fábrica

Veamos dos ejemplos de patrones de diseño J2EE: los patrones Session Facade y Value Object. Ambos demuestran cómo los patrones de diseño J2EE se enfocan en problemas particulares del entorno J2EE, en contraposición a los patrones de diseño de desarrollo de software que generalmente se aplican a cualquier esfuerzo de desarrollo de aplicaciones.

Ejemplo: el patrón Session Facade J2EE

El patrón Session Facade evolucionó a partir de experiencias con Enterprise JavaBeans (EJB). Los sistemas basados ​​en los EJB de entidad recién introducidos (que se comunican con una base de datos) se estaban ralentizando. Las pruebas de rendimiento revelaron problemas derivados de múltiples llamadas de red realizadas al comunicarse con los EJB de la entidad, lo que agregó una sobrecarga para establecer la conexión de red, serializar los datos para enviar y recibir, y otros efectos.

En respuesta, el patrón Session Facade mejoró el rendimiento al centralizar esos múltiples accesos de red en una sola llamada. Session Facade emplea una sesión EJB sin estado para mediar entre la llamada del cliente y la interacción EJB de la entidad requerida. Existen más patrones para mejorar el rendimiento del acceso a la base de datos, incluidos los patrones Fast Lane Reader y Data Access Object.

Ejemplo: el patrón J2EE del objeto de valor

El patrón Value Object J2EE también tiene como objetivo mejorar el rendimiento de los sistemas que utilizan EJB en la red. Esas llamadas de red que inducen gastos generales del ejemplo anterior recuperan campos de datos individuales. Por ejemplo, usted puede tener un PersonEJB entidad con métodos tales como getFirstName(), getMiddleName(), y getLastName(). Con el patrón de diseño de Objeto de valor, puede reducir esas múltiples llamadas de red a una sola llamada con un método en la entidad EJB, como getPersonValueObject(), que devuelve los datos todos a la vez. Ese objeto de valor contiene los datos que representa la entidad EJB y se puede acceder a ellos según sea necesario sin incurrir en la sobrecarga de llamadas de red.

Ejemplo: el patrón Flyweight OO

Para ver un ejemplo de un patrón de diseño OO de aplicación amplia, considere el patrón Flyweight, que mejora el rendimiento de la aplicación mediante la reutilización de objetos. El software OO produce gastos generales (ciclos de CPU desperdiciados, recolección de basura y asignación de memoria) cuando crea y destruye objetos. Si el sistema pudiera reutilizar esos objetos, podría evitar esa sobrecarga. Sin embargo, los objetos a menudo no son reutilizables porque contienen información (llamada estado ) específica del usuario actual del objeto. El patrón Flyweight proporciona enfoques para mover ese estado a otro lugar para que el resto del objeto se pueda reutilizar.

Ponlos todos juntos: ejemplo de persistencia

Ahora que conoce los conceptos básicos, puede comenzar a aplicar patrones de diseño en sus prácticas de desarrollo. Pero, ¿cómo se utilizan los patrones? Empiece por identificar un dominio o un problema técnico que requiera una solución. La persistencia, que resuelve el antiguo desajuste entre el objeto y la base de datos relacional, representa un buen ejemplo para la mayoría de las aplicaciones empresariales. Veamos los pasos necesarios para diseñar y construir la capa de persistencia de una arquitectura de aplicación.

Siguiendo el enfoque de diseño y arquitectura OO tradicional, cree casos de uso que describan sus necesidades de persistencia. Los posibles casos de uso incluyen:

  1. La persistencia del objeto debe ser transparente desde el punto de vista de los desarrolladores.
  2. Los mecanismos de persistencia (entidades EJB, objetos de acceso a datos, etc.) deben ser configurables a nivel de arquitectura.
  3. Nuestra arquitectura debe utilizar tecnologías J2EE pero encapsular las dependencias J2EE. Deberíamos poder cambiar los proveedores del servidor de aplicaciones J2EE, las versiones J2EE o reemplazar J2EE por completo sin requerir una revisión completa de la aplicación.
  4. La capa de persistencia resultante debe poder reutilizarse en todos los proyectos. Esto debería ser parte de nuestra arquitectura de aplicaciones en curso.

Una vez que haya identificado el problema, puede decidir qué patrones se aplican. Recuerde que para los patrones J2EE, debe determinar qué patrones se aplican en el área del problema y abordarlos. Para la persistencia, los patrones de diseño J2EE relevantes son (consulte los libros de patrones de diseño J2EE de Sun en Recursos):

  • Objeto de valor
  • Lector de carril rápido
  • Objeto de acceso a datos
  • Fachada de la sesión
  • Entidad compuesta
  • Controlador de lista de valores

Dado que empleará EJB, incluya los patrones Business Delegate y Service Locator para abordar el acceso a EJB.

Además, la resolución del segundo y tercer caso de uso requiere patrones de diseño de desarrollo de software tradicionales. ¿Cómo encapsula las dependencias y tiene mecanismos de persistencia configurables? Algunos patrones de desarrollo de software aplicables incluyen:

  • Fábrica
  • Mediador
  • Estrategia