Start / Inicio Girasol Editor [English] Girasol Editor [Español] Girasol Editor Edición Cristiana Launch Pasionaria Bible Launch Orquidea Literato Applet Bible
Blog de pruebas

Anakin has a plan


xfvxdfsdxf
Anakin has a planA brilliant plan
Leer Más / Read More
 

Algunos estilos

Algunos estilos

Estos son algunos estilos.

Texto Normal
Texto Intenso
Texto con Énfasis
Texto Insertado
Texto Borrado
Definición
Cita

Texto de Ejemplo
Texto con Código
Variable
Texto Teclado
Texto de Máquina de Escribir

Leer Más / Read More
 

Consideraciones de Diseño en Java

Consideraciones de Diseño en Java

Consideraciones de Diseño en Java

 

Resumen Ejecutivo

Este documento habla de algunas prácticas y consideraciones que deben llevarse acabo a fin de generar un producto de aplicación Java robusto, con un bajo acoplamiento, una alta cohesión etc. Todos elementos deseables en una solución de software.
logo_scurvejavaA fin de relatar las prácticas encontradas se dividirá la aplicación en capas. Las tiers nos permiten modularizar las aplicaciones reduciendo la complejidad de las mismas. Para este documento disertaremos sobre las tiers de Presentación, Negocio además de un poco sobre la integración entre ambas.

 

El Framework de Sun

Definición
El Framework de Sun Microsystems provee una vista tridimensional la cual permite expresar la arquitectura de un sistema en términos de:

  • Tiers
  • Layers
  • Cualidades Sistemáticas
  •  

    ¿Que es un Tier?

    División lógica de las piezas de software que conforman un sistema, acorde a su rol y responsabilidad. Las tiers que Sun maneja en su marco de desarrollo son las siguientes:

    Cliente.-Máquina cliente o sistema que provee servicios de interacción con un humano para captura y despliegue de información.

    Presentación.- Provee servicios para crear dinámicamente las diferentes vistas que conforman la interfaz de usuario y envia mensajes al tier de negocios

    Negocios.- Provee las reglas que soportan las operaciones regulares de un negocio y ejecutan transacciones.

    Integración.- Servicios que permiten a un aplicativo abstraerse y de conectarse con recursos externos.

    Recursos.- Provee los servicios de almacenamiento de datos en un repositorio permanente (sistemas legados, bases de datos, directorios en línea, servidores mail y máquinas entre otros).

     

    ¿Qué es un Layer?

    Son una abstracción en las piezas de un software, donde un nivel se comunica solo con el nivel inmediatamente inferior y provee servicios al nivel superior, abstrayendo los detalles de implementación. Las layers sobrepasan el alcance de este documento y solo diré son divididas como: aplicación, plataforma virtual, plataforma superior, plataforma inferior, transporte.

    La Capa de Presentación

     

    Consideraciones sobre el estado de la sesión.

     

    Mantener la sesión en el cliente

    El guardar la sesión en el cliente significa serializar el estado y adjuntarlo a la respuesta HTML que es enviada al cliente.
    Los beneficios de persistir la sesión en el cliente son los siguientes:

  • Es sencillo implementarlo.
  • Es útil para pequeñas cantidades de información.
  • Elimina el problema de replicar el estado en un ambiente distribuido.
  • Las consideraciones respecto a esta aproximación

  • Solo pueden guardarse cadenas en los clientes.
  • Los grafos deben ser reconstruidos en cada petición.
  • Se puede averiguar fácilmente la información del estado a menos que esta sea encriptada.
  • Las aproximaciones para lograr esto abarcan los campos ocultos, las cookies, y la reescritura de las URIs. Sus consideraciones particulares se listan a continuación:

     
    Campos Ocultos

     Implementar campos ocultos en el código HTML tiene la ventaja de ser una aproximación de fácil implementación, además las restricciones de seguridad de algunos exploradores no afectan el estado en los clientes.

     
    Cookies

    La implementación de cookies para guardar el estado en el cliente tiene la ventaja de persistir durante tiempos mayores a la sesión configurada en el servidor. Las limitaciones de esta aproximación incluyen que el tamaño de las cookies es fijo; es decir no se permiten archivos demasiado grandes. Si quieres tener una cookie portable entre diferentes navegadores no puede ser mayor a 4 kilobytes. Además si estos archivos son grandes consumen ancho de banda teniendo que recorrer la red 2 veces cada vez que son utilizados. La otra limitación se encuentra en la seguridad del navegador, el Proxy o firewall que pueden no permitir el paso de cookies.

     
    URIs

    La reescritura de URIs tiene la ventaja de permitir el salvar el estado de la sesión en la sección de favoritos del navegador de Internet. El mayor inconveniente que presenta frente a las otras aproximaciones es la limitación de reescritura de direcciones que tienen algunos exploradores de en cuanto al número de caracteres que aceptan. El límite para Internet Explorer 6 es de 2,083 caracteres (Fuente: http://support.microsoft.com/default.aspx?scid=KB;en-us;q208427 , Otro: http://www.aspfaq.com/show.asp?id=2222 ).

     

    Mantener la sesión en la capa de presentación

    Cuando una sesión se mantiene en el servidor es localizada mediante un ID de sesión y típicamente se conserva hasta que ocurre alguno de los siguientes casos:

  • En tiempo de sesión predefinido es sobrepasado.
  • La sesión se cierra manualmente.
  • El estado es quitado de la sesión.
  • Entre las ventajas de guardar la sesión en la capa de presentación se encuentran:

  • Es posible guardar cualquier cantidad de información
  • No es necesario reconstruir los grafos
  • No se tienen problemas de seguridad
  • Las consideraciones que implica esta aproximación incluyen

  • Se tiene que buscar una manera de hacer este estado visible para cualquier servidor que atienda la petición en un cluster.
  • Estas consideraciones nos llevan a la pregunta de donde vamos a almacenar dicha información.

     
    Memoria

    El número de usuarios puede afectar la memoria del servidor, hay que tomar en cuenta que si se ocupan 500ks de memoria para un usuario serán 500 megas para 100 usuarios y 5gb para 1000 usuarios.

     
    Enterprise Java Beans

    La plataforma J2EE provee de una solución estandarizada que son los Session Beans para el caso particular sobre el estado de una sesión se utilizan los Stateful Session Beans. Un Bean diseñado específicamente para mantener el estado del cliente en un proceso. El uso de EJBs tiene las siguientes consideraciones.

  • Encapsulamiento de lógica de negocios.
  • Requerimiento de manejo de transacciones.
  • El Bean no es persistente.
  • Porque no utilizar Stateless Session Beans?

  • Estan diseñados para servicios que se pueden ejecutar en un solo llamado.
  • El EJB no mantiene estado de los clientes.
  • Los Beans Stateless no deben utilizarse en la capa de presentación.
  • Esto se discute mas ampliamente en una parte posterior del documento.

     

     

    Consideraciones para el control de acceso a la aplicación

    Existen muchos motivos para la restricción  y control del acceso de un cliente a ciertos recursos. Uno de ellos es cuando no se quiere que un cliente ingrese a una vista particular, caso que se da por ejemplo cuando el cliente no se ha registrado en un sitio que lo exige o cuando de acuerdo a su rol no debe tener acceso a dicha vista.

     

    Proteger un recurso

    En algunos casos un recurso se encuentra restringido para ciertos usuarios. Existen varias técnicas para lograr este objetivo se puede restringir el acceso a partir de lógica dentro de la vista, canalizar el acceso a través de un controlador que decide si se puede tener o no, o incluso existen aproximaciones híbridas.

     
    Proteger un recurso desde la vista

    El proteger un recurso desde la vista generalmente implica el tener lógica de control en los documentos de vista. Se puede o no hacer referencia a los roles de los diferentes usuarios. Generalmente implica el uso de una etiqueta de control con la lógica embebida para hacer las validaciones correspondientes. Normalmente el uso de esta técnica controla el despliegue de vínculos.
    Algunos beneficios respecto a esta aproximación son las siguientes:

  • Es simple implementarlo
  • Permite proteger un recurso o una fracción de este.
  • Facilita la usabilidad al mostrar solo las opciones disponibles.
  • Entre las consideraciones de esta aproximación se encuentran:

  • Resulta inconveniente cuando se tienen que proteger muchos recursos.
  • Afecta la mantenibilidad al tener diseminado código de control en muchas páginas.
  • Es necesario proteger cada recurso por separado.
  • No es posible proteger un recurso no programático de una petición directa desde un navegador (imágenes, pdf, etc).
  • Para lograr esto regularmente utilizamos en patrón de vista compuesta, documentado en el siguiente vínculo: http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html .

     
    Proteger un recurso a través de un controlador

    El uso de controladores implica un cambio en el paradigma de diseño. Esta aproximación concentra la lógica de control en un solo repositorio centralizado. Consiste en utilizar una o mas clases controlador como punto de acceso a la aplicación. Entre los beneficios de utilizar un controlador esta un incremento en la modularidad, reusabilidad, mantenibilidad y trazabilidad de la aplicación. El patrón que define como implementar un controlador se encuentra en el siguiente vínculo: http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html .
    Esto implica a su vez tener capas de indirección para separar la lógica de negocio de la lógica de presentación. El tener objetos de la capa de presentación en la capa de negocio acrecienta el acoplamiento y por lo tanto esta contraindicado.

     
    Proteger un recurso a través de un contenedor

    Se puede configurar un contenedor para que solo permita tener acceso a un recurso a través de otros recursos internos como puede ser un controlador utilizando un despachador de peticiones. La especificación de Servlet nos dice que los parámetros de seguridad son definidos en un archivo descriptor denominado web.xml. La seguridad de un contenedor esta definida en el documento de especificación de servlet en el capítulo SRV.12. http://java.sun.com/products/servlet/reference/api/index.html

    Una forma alternativa de proteger un recurso es colocarlo en el directorio WEB-INF del contenedor o cualquiera de sus subdirectorios. Estos archivos solo podrán ser accedidos a través de un controlador y un objeto RequestDispatcher.

     

    Envió Duplicado de Formas

    Usuarios trabajando en un ambiente donde se utiliza un navegador pueden inadvertidamente utilizar el botón de “Atrás” posiblemente invocando una transacción duplicada. Similarmente el uso del botón de “Alto” puede dejar el navegador sin pintar lo cual provocaría el uso del botón “Refrescar” logrando el mismo efecto.
    Para evitar esto se utiliza una Ficha Sincronizadora. El procedimiento es el siguiente:

    1. Inicializar una ficha en la información de sesión del cliente.
    2. Incluir la ficha en la información de la forma.
    3. Se recibe la forma.
    4. Se compara la ficha contra la que se encuentra en la sesión.
    5. Si la ficha es igual se continúa.
    6. Si la ficha ha cambiado se redirige a una página de error.
    7. Se aumenta la ficha en uno.

     

    Validación

    Suele ser deseable el realizar validaciones tanto en el cliente como en el servidor. La validación del lado del cliente suele ser menor (por ejemplo: que la forma se encuentre llena)  mientras que del lado del servidor debe ser más exhaustiva.

     
    Validación en el Cliente

    Típicamente incluye el uso de scripts de código que pueden estar en JavaScript. Uno de sus principales beneficios es el de disminuir la carga de transacciones del servidor al evitar el envió de información errónea y el regreso de páginas de error. El inconveniente de esta tecnología es que dichos scripts pueden ser desactivados como parte de la configuración de seguridad del cliente. Es una mala práctica solo tener validación del lado del servidor.

     
    Validación en el Servidor

    La validación de la información en el servidor tiene mayores alcances que la validación en el cliente; pues para el servidor la información tiene significado. Además de validaciones de negocio podemos encontrar validaciones que se pueden tipificar en tipos abstractos. De tal manera que el código de validación puede centrarse en la forma o centrarse en el tipo abstracto. Las validaciones centradas en la forma son fáciles de implementar y requieren poco tiempo para llevarse acabo, la desventaja es que se tienen muchos lugares donde el código es validado y esto suele ser poco mantenible, flexible y rehusable. La validación centrada en los tipos abstractos abstrae las validaciones fuera del estado del modelo en un marco genérico, esto tiene la ventaja de reducir el acoplamiento. La desventaja de esta aproximación se encuentra en la reducción de la eficiencia y velocidad.

     
    Clases Helper

    Las clases Helper son beans utilizados para mapear las propiedades de una forma de HTML. Utilizan un mecanismo muy simple los campos de la forma será copiados al atributo del helper cuyo nombre coincida con estos. Este mecanismo simplifica mucho el manejo de formas HTML en Java.
    El inconveniente viene cuando no se conocen del todo las especificaciones de estos Beans. Cuando se tiene un campo que no contiene datos este no es enviado en el request; por lo tanto no es actualizado en la clase Helper. Como normalmente no se conoce esto se presupone que si un usuario borra la información de un campo el sistema lo llenará con un NULL o una cadena vacía, cuando en realidad el atributo no sufre ningún cambio. Esto lleva consigo una inconsistencia en la información de la clase que pudo ser evitada. Llevando esta situación a otros controles tenemos por ejemplo los check box donde la información no será enviada a menos que se encuentre marcado este. Significa que si se le quita la marca a un check box el Helper no tendrá conciencia de esto. Por lo tanto se creará una inconsistencia en nuestro código. La solución mas simple para evitar esto es resetear las propiedades de la clase antes de setear el código. El como implementar correctamente una clase Helper se encuentra en el siguiente vínculo:
    http://java.sun.com/blueprints/corej2eepatterns/Patterns/ViewHelper.html . Para un ejemplo de implementación esta el siguiente vínculo: http://java.sun.com/products/commerce/tutorial/add_address/helper_class.html .

     

     

    La Capa de Negocio

     

    Los EJBs de sesión

     

    Los EJBs de sesión con y sin estado.

    Los Beans de sesión pueden o no retener el estado de la conversación con el cliente. Las ventajas de utilizar beans con retención de estado (Statefull) son:

  • Permanece la información siempre que la sesión del cliente se encuentre activa.
  • Son reutilizados una vez que termina la sesión del cliente que utilizó dicha instancia.
  • Las ventajas de utilizar beans sin retención de estado (Stateless) son:

  • El contenedor puede mantener un pool de beans y reutilizarlos libremente después de cada uso.
  • Pueden ser compartidos por diferentes clientes.
  • Consumen  menos recursos que los EJB Statefull.
  • El patrón del Business Delegate
    ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html ) depende de los EJBs de sesión mediante la fachada provista por el patrón Session Facade ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/SessionFacade.html ).

     

    Guardar el estado del cliente en la capa de negocio

    En una parte primera del documento se exploró como almacenar el estado de la sesión en el cliente y en la capa de presentación, se habló también un poco de cuando utilizar los EJBs para almacenar dicho estado. Generalmente se considera que cuando se va a acceder al sistema por diferentes vías, es decir se van a tener diferentes tipos de clientes accesando la capa de negocio es util mantener la sesión en EJBs.

     

     

    Los EJBs de Entidad – Entity Beans

    Los Beans de Entidad estan diseñados para ser objetos de negocio. Son objetos distribuidos y según la especificación EJB tienen las siguientes características:

  • Proveen de una vista en objetos de la información persistente.
  • Son transaccionales.
  • Son multiusuario.
  • Sobreviven en caso de que el contenedor se caiga. Inclusive los clientes de los EJBs de Entidad  no se enteran de la caída del servicio salvo en casos muy atípicos.
  •  

    Las llaves primarias

    Los descriptores de los Entity Beans definen un tipo de llave primaria generalmente constituida por un valor primitivo. De no ser así, debe declararse un clase adicional que funja como llave primaria del Bean. La flexibilidad que nos da esta clase es que la llave primaria del EJB puede ser una llave compuesta o constituida por un objeto. Los atributos en la clase llave deben ser públicos así mismo los atributos que componen la llave deben ser públicos en el Bean de Entidad.
    Implementar los métodos de HashCode y Equals en la clase primaria le permite al contenedor establecer las diferencias entre dos beans. La manipulación en el contenedor suele hacerse a través de Collections por lo tanto un código de dispersión erroneo puede conducir rápidamente a problemas de rendimiento.

     

    Las transacciones en los Beans de Entidad

    Los Beans de Entidad realizan sus transacciones de manera atómica; es decir que una llamada a un método setXXX() implicaría escribir en el sistema de persistencia, siempre que no se abra una transacción para hacer esto. Es decir que si anidamos el uso de varios setXXX() podemos tener varias transacciones anidadas; pero si envolvemos esto en un objeto UserTransaction solo se llevará acabo una transacción.
    Utilizar el atributo Required en una transacción para un bean de entidad puede causar problemas de rendimiento. Un programador inexperto puede hacer llamadas a los métodos getXXX individuales lo cual implica una nueva transacción por llamado, utilizar el atributo Mandatory es recomendable dado que este lanza una excepción siempre que se intente llamar un EJB sin una transacción. Otra recomendación sería no exponer todos los atributos mediante métodos setXXX y getXXX para evitarlo es recomendable utilizar el patrón Value Object ( http://java.sun.com/j2ee/patterns/ValueObject.html ).

     

    Lógica de Negocio en los Beans de Entidad

    Una de las cosas que es preferible evitar cuando se trata de Entity Beans son las relaciones Entidad contra Entidad, pues estas nos llevan a problemas de rendimiento. En general los EJBs de entidad deben tener solo información auto contenida; es decir deben procesar solo la información que puedan manipular. Un error común sería crear un entity bean de manera que refeja la estructura relacional de nuestra base de datos. Si se requiere la interacción entre dos beans de entidad se debe aplicar el patrón Composite Entity ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeEntity.html ).
    Si el flujo de trabajo entre múltiples EJBs de entidad es identificado este puede ser consolidado utilizado el patrón de Session Facade ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/SessionFacade.html ).
    Por último si se quiere persistir estos beans siempre es mejor implementar el acceso a datos afuera de los mismos para ello es útil el patrón Data Access Object ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html ).

     

    La búsqueda de los Beans

    El código de búsqueda es mejor tenerlo encapsulado mediante el patrón de Service Locator ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html ) suele suceder que este código se embebe en los clientes generando una baja trazabilidad y mantenibilidad de la aplicación. Esta separación se asegura al utilizar el patrón de Business Delegates ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/BusinessDelegate.html ) para toda referencia a la lógica de negocio.
    A su vez al utilizar un método finder  para devolver una lista amplia de EJBs puede impactar el rendimiento al ser esta lista una serie de referencias remotas a los objetos. A fin de evitar esto es posible utilizar el patrón Value List Handler ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html ).
    http://www.informit.com/articles/article.asp?p=100598&rl=1

     

     

    Glosario

     
    Sesión de usuario

    El término sesión de usuario describe una conversación que incluye múltiples solicitudes entre el cliente y servidor.

     
    URI - Uniform Resource Identifier

    Las URIs son conocidos por muchos nombres direcciones WWW, Identificadores Universales de Documentos (UDIs), y finalmente una combinación de URL (Uniform Resource Locators) Localizadores  Uniformes de Recursos y URN (Uniform Resource Locators Names) Localizadores Uniformes de Nombres. En cuanto a lo que concierne al HTTP los URIs son simplemente cadenas que identifican por nombre, localización o cualquier otra característica un recurso.

     
    EJB – Enterprise Java Bean

    Las Características de los EJBs son:
    Típicamente operan sobre logica de negocio o información de negocio.
    Las instancias de los EJB son creadas y administradas por un contenedor en tiempo de ejecución.
    Un EJB puede ser tropicalizado al momento de ser desplegado al editar sus propiedades de ambiente.
    Los servicios de información, transacción y seguridad no se encuentran embebidos en estas clases.
    El acceso a la clase es mediante el contenedor.
    Deben poderse incluir en un archivo de aplicación (EAR) sin necesidad de cambios en el código.

     
    Session Bean – EJB de Sesión

    Es una clase de EJB de sesión es creada por un cliente y suele existir únicamente durante lo largo de la sesión de este. Algunas características de estas clases son:
    Estan dedicados a un solo cliente o usuario.
    No sobreviven si el contenedor se cae.
    No son objetos persistentes.
    Pueden estar concientes de que una transacción se esta realizando.
    Pueden modelar conversaciones reteniendo o no el estado del cliente.


     

    Bibliografía

    Lineamientos de Arquitectura y Diseño de Aplicaciones Java 2 Enterprise Edition ( http://www.lucasian.com/documents.htm )

    Sun Microsystems, Java Servlet Specification Version 2.4 ( http://java.sun.com/products/servlet/reference/api/index.html )

    Designing Enterprise Applications with the J2EE Platform, Second Edition . Rich Green. Sun Microsystems 2002.

    http://www.w3.org/ HTML Specification

    http://63.240.93.131/articles/article.asp?p=26149 , J2EE Presentation Tier Design Considerations and Bad Practices

    http://www.refactoring.com/catalog/index.html Refactoring Home Page.

    http://www.it.uu.se/edu/course/homepage/pvarkjava/vt05/OH/lesson16-vt05.pdf J2EE patterns.

    http://java.sun.com/products/commerce/tutorial/add_address/helper_class.html Writing a Helper Class. Aquí encontramos un ejemplo de como implementer Clases Helper.

    http://java.sun.com/products/ejb/docs.html La especificación de los EJBs

    http://www.jguru.com/faq/view.jsp?EID=854006 JGurú Faqs.

    http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=11&t=010015 Java Rach Forums

    http://weblogic.sys-con.com/read/42660.htm Avoiding Performance Pitfalls with Entity EJBs

    http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/transaction_management/enterprise_beans/index.html 8.7.2 Container-Managed Transaction Demarcation

    http://java.sun.com/developer/technicalArticles/releases/j2se15langfeat/index.html Typesafe Enum

    Leer Más / Read More
     

    Algunos estilos

    Algunos estilos

    Texto Normal
    Texto Intenso
    Texto con Énfasis
    Texto Insertado
    Texto Borrado
    Definición
    Cita

    Texto de Ejemplo
    Texto con Código
    Variable
    Texto Teclado
    Texto de Máquina de Escribir

    Leer Más / Read More