2.3.1 Value Object
Transcripción
2.3.1 Value Object
2.3.1 Value Object Value Object (1) n Intención n n También conocido como n n n Agrupar un conjunto de atributos procedentes de uno o varios objetos del dominio Recientemente se le ha cambiado el nombre a Transfer Object Data Transfer Object, Replicate Object Motivación n En MiniBank necesitamos acceder a los datos de las cuentas y operaciones bancarias AccountVO (from vo) - accountIdentifier : Long - userIdentifier : Long <<Interface>> - balance : double SQLAccountDAO + AccountVO(accountIdentifier : Long, userIdentifier : Long, balance : double) + getAccountIdentifier() : Long + getUserIdentifier() : Long + getBalance() : double + setBalance(newBalance : double) : void + toString() : String Value Object (2) n Aplicabilidad n n Cuando necesitemos representar un conjunto de atributos procedentes de uno o varios objetos del dominio Estructura <<interface>> java.io.Serializable VO <<interface>> DAO - atributos + métodos get/set Value Object (3) n Participantes n VO (AccountVO) n n DAO (SQLAccountVO) n n n Tiene acceso a los valores que se copian en el VO Los Session Facade (Business Delegate) también trabajan con VOs Colaboraciones n n Ofrece métodos get/set para acceder a sus atributos Un DAO devuelve VOs en sus métodos findXXX, y los recibe en sus métodos create y update Consecuencias n Beneficios n n n En el contexto de EJB, eficiencia En el contexto de JDBC, poder representar un conjunto de atributos procedentes de uno o varios objetos del dominio Riesgos n Un VO puede contener información obsoleta si se pretende usar en una actualización posterior en otra transacción => “EJB Design Patterns” discute el patrón “Version Number” Value Object (4) n Implementación n Domain Value Object n n n Un Value Object es un Domain Value Object cuando su atributos corresponden a los de un objeto del dominio Ejs.: AccountVO y AccountOperationVO en MiniBank Problemas: n Fuerte acoplamiento entre las clases cliente de los Session Facades (Business Delegates) y el modelo de objetos del dominio n Diferentes interfaces de usuario (IUs) pueden requerir sólo un subconjunto de los atributos de un VO o un conjunto de atributos de distintos VOs n n Ej-1: CarVO con 100 atributos y tenemos un IU en el que sólo queremos mostrar los relativos al motor (10 atributos) Ej-2: Un IU que sólo quiere mostrar los atributos relativos al motor de un determinado coche y los de su fabricante (ManufacturerVO) Value Object (5) n Custom Value Object n Solución al ej-1: <<interface>> CarDAO SessionFacade + findCarEngine(carId) : CarEngineVO CarVO + find(con, carId) : CarVO CarEngineVO n Solución al ej-2: SessionFacade + findCarEngineAndManufacturer(carId) : CarEngineAndManufacturerVO <<interface>> CarDAO + find(con, carId) : CarVO <<interface>> ManufacturerDAO CarEngineAndManufacturerVO CarVO + find(con, manId) : ManufacturerVO ManufacturerVO Value Object (6) n Custom Value Object (cont) n n CarEngineVO y CarEngineAndManufacturerVO son Custom Value Objects (son específicos a casos de uso) Sólo tienen los atributos necesarios n n CarEngineAndManufacturerVO debería implementarse (en este caso) como un objeto compuesto de un CarEngineVO y un ManufacturerVO Se usan en las fachadas del modelo, pero no en los DAOs n n n Las fachadas del modelo no son reusables entre aplicaciones, dado que implementan casos de uso específicos a la aplicación Los Custom Value Objects se diseñan para dar soporte a casos de uso específicos Los DAOs sólo trabajan con Domain Value Objects, y en consecuencia son reusables entre aplicaciones (ej.: una tienda de comercio electrónico y su aplicación de administración comparten gran parte de los DAOs) Value Object (7) n Custom Value Object (cont) n Otro ejemplo: OrderVO es Custom Value Object SessionFacade + + + + + findOrder(orderId) : OrderVO findOrderDetails(orderId) : OrderDetailsVO findLineItems(orderId) : Collection updateLineItem(lineItemVO):void etc. OrderVO - details : OrderDetailsVO - lineItems : Collection OrderDetailsDAO LineItemDAO 1 0..n OrderDetailsVO - orderIdentifier : Long loginName : String date : Calendar shippingAddress : String LineItemVO - lineItemIdentifier : Long orderIdentifier : Long productIdentifier : Long quantity : int status : String Value Object (8) n Data Transfer HashMap n n n En una aplicación de tamaño medio puede que se necesiten un número desmesurado de Value Objects => Problema de mantenimiento Solución => usar mapas (ej.: HashMap) para almacenar un conjunto de pares <nombre-atributo, valor> en vez de las clases usadas hasta ahora Ej.: Map carEngine = sessionFacade.findCarEngine(carId); int horsePower = ((Integer) carEngine.get(“car.engine.horsepower”)).intValue(); String type = (String) carEngine.get(“car.engine.type”); n Problemas n n Se necesitan establecer convenciones de nombrado para los atributos No es una solución fuertemente tipada Value Object (9) n ¿ Qué variante usar ? n Para aplicaciones pequeñas puede ser suficiente con Domain Value Objects n n Aplicaciones de tamaño medio pueden requerir el uso de Custom Value Objects (además de Domain Value Objects) n n Normalmente tienen atributos privados y métodos públicos getXXX y setXXX (para los atributos modificables) Lógicamente, sólo tiene sentido definir Domain Value Objects para aquellas IUs (casos de uso) que requieren atributos de varios objetos del dominio, o existe una diferencia importante entre los atributos que quiere visualizar la IU y los que tiene el objeto del dominio correspondiente Para IUs de actualización de datos normalmente sólo se usan Domain Value Objects n Las IUs de actualización no suelen permitir actualizar datos de más de un objeto del dominio Value Object (10) n ¿ Qué variante usar ? (cont) n n n n Para IUs que sólo muestran datos, pueden necesitarse Domain Value Objects En consecuencia, un Custom Value Object sólo debería tener métodos getXXX En aplicaciones muy grandes, la única alternativa puede ser usar HashMaps Enfoque que se suele seguir n n n Cuando se empieza un proyecto suele estar claro el modelo de objetos del dominio, pero no los datos exactos que van a mostrar las IUs => se empieza trabajando sólo con Domain Value Objects A medida que avanza el proyecto (y se conocen más detalles sobre las IUs) => se refactorizan los métodos que sea preciso en los Session Facade para que devuelvan Custom Value Objects En casos extremos => HashMaps Value Object (y 11) n Código de ejemplo n n Véase es.udc.fbellas.j2ee.minibank.model.account.v o.AcountVO y es.udc.fbellas.j2ee.minibank.model.accountop eration.vo.AcountOperationVO en MiniBank Patrones relacionados n n Page-by-Page Iterator Session Facade