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

Documentos relacionados