ddd PATTERNS JAVA PLATFORM @AlfredoCasado
¿De que vamos ha hablar? Presentación del modelo Ejemplo de implementación spring-hibernate anemico Ejemplo de implementación spring-hibernate DDD
MODELO: CARTERAS DE INVERSIÓN Accion Unidades Cotización Entidad Total IBM 100 14 bankinter 1400 Yahoo 10 12 bank of America 120 TOTAL: 1520
implementación Tecnologías utilizadas java 1.6 maven 2 spring 3.0 hibernate 3.5 / API JPA 2.0 JUnit 4.10
Modelo anémico
detalles de persistencia en el modelo Anotaciones confusas ¡no es una entidad! detalles de persistencia en el modelo
nos saltamos la ley de demeter Acoplamiento nos saltamos la ley de demeter
Reparto de responsabilidades No seguimos el patrón experto (GRASP) No seguimos single responsability (SOLID)
ENTIDADES SIN COLABORADORES El ORM instancia mis objetos de dominio. ¿Como le inyecto el actualizador de cotizaciones?
falsa separación entre capas ¿persistence? ¿esto no era el modelo? “AOP magic” (con cgi-lib o DynamicProxy)
falsa separación entre capas
Posible solución
estructuras de datos Son “sólo” estructuras de datos. JPA impide poner “public”.
Las entidades tienen colaboradores volvemos a controlar el proceso de instanciación RepositorioEF
Separación más efectiva de responsabilidades Cartera Inversión Acción EntidadFinanciera
Mantener el ritmo de desarrollo Anémico DDD Productividad Tiempo
Hay otras opciones Inyectar colaboradores “a mano” via setters Inyectar con filtros en la construcción de objetos de hibernate Inyectar utilizando AOP con spring No usar hibernate, no usar spring Google guice es una alternativa seria a spring. JDBC, ibatis o queryDSL son alternativas serias a hibernate.
Conclusiones Poner los frameworks a nuestro servicio en lugar de estar nosotros al suyo Nos obsesionamos con frameworks técnicos y se nos olvida lo básico (OO, patrones, GRASP, SOLID) Usamos frameworks que facilitan lo más sencillo (hacer un CRUD) a costa de dificultar lo realmente complejo: construir un buen dominio. El desarrollo de software no es construir la versión 1.0 , normalmente consiste en pasar de la N a la N+1.