Si vienen siguiendo mi blog sabrán que además de postear una vez cada mil años, escribi algunas cosas sobre la dificultad de generar una configuración de Spring usando solo Java.
La buena noticia es que a partir de Spring 3.x se puede configurar el application context casi 100% en Java (hay una pequeña parte que todavia hay que hacer con el XML). Me entere de esto leyendo el anuncio del release 3.1 en InfoQ (y para mi sorpresa esta posibilidad ya existía en el release 3.0).
Si planean usar Spring 3.x es una buena noticia por que pueden tirar ese applicationContext.xml al tacho y hacerlo directamente en Java que es más fácil de mantener y refactorizar :)
La implementación se basa mucho en annotations, pero es lo suficientemente flexible como para permitir refactorings (para ejemplos ver la sección 3.11.3 del manual de Spring 3.0). Aunque hubiese preferido que lo hagan como en Grails, donde hicieron un builder usando Groovy (que dicho sea de paso, si están en un proyecto Java/Groovy pueden usar el builder sin necesidad de depender de otras librerías de Grails).
arquitectura de software
atributos de calidad
blog
chrome
code katas
creatividad
dart
desarrollo de software
dibujo
diseño de interfaces
diseño web
educación
filosofia
firefox
gradle
groovy
gst
html5
inteligencia artificial
java
javascript
jquery
libros
macosx
microwiki
modelos de negocio
oop
presentaciones
reingeniería
simulación
smalltalk
spockframework
spring
testing
tips
ubiquity
uml
visualización de la información
web
wiki
13 diciembre 2011
09 diciembre 2011
Mapeos Objeto/Relacional
Llegué a la conclusión de que los frameworks de mapeo Objeto/Relacional no sirven.
- Ehh! ¿Por que? Si yo uso Hibernate y esta bueno!
Aca van mis razones...
De Objetos...
Aprendí con el tiempo que la principal ventaja de la programación orientada a objetos es la posibilidad de tratar con distintas implementaciones a traves de su interfaz.
Si estas pensando que me refiero al polimorfismo, tenes razón, pero di esta vuelta para evitar la tipica asociación de polimorfismo con jerarquias de clases.
Veamos un ejemplo que suele darse en los cursos introductorios: la cuenta bancaria.
Supongamos que tenemos en nuestro sistema un Cajero que puede hacer depositos en estas cuentas:
La instancia cuenta se pudo haber definido mediante una sub-clase, clase anonima, proxy dinamico o usando AspectJ y manipulación de bytecode. No importa. Mientras cumpla con la interfaz CuentaBancaria nuestro Cajero va a funcionar.
... y Relacional
Ahora supongamos que definimos una Cuenta de la siguiente manera:
CuentaBancaria cuenta = new Decorator(cuentaOriginal);
Nuestro Cajero sigue funcionando pero...
motorDeMapeoOR.guardar(cuenta);
explota.
El motor de mapeo O/R necesita saber como tratar la instancia para poder mapear su clase y sus variables de instancia a la base de datos. En otras palabras: encapsulamiento y polimorfismo las pelotas.
Quizas pienses que me fui a un ejemplo extremo y que uno nunca tiene casos como estos.
Sin embargo en todos los sistemas JEE que veo siempre hay un "modelo" que termina estando sumamente acoplado a la base de datos:
- No es conveniente jugar con las jerarquias de clases por que no se pueden mapear de una forma buena.
- No se puede refactorizar algo para cambiar su composición por que es engorroso modificar los mapeos.
- No se pueden usar objetos más "dinamicos", como objetos que tengan closures (en un lenguaje que lo permita), implemetaciones de interfaces definidas inline o simplemente un decorator como el del ejemplo.
Entonces la solución es: hacemos objetos pobres casi sin comportamiento solo para transferir datos (DTOs). Luego tenemos un modelo mas "rico" que se crea a partir de estos DTOs.
Suena simple, pero en la práctica termina siendo una engorrosa y aburridisima repetición de código que los programadores tienden a solucionar de forma sencilla: en lugar de separar estos DTOs del modelo de dominio, terminan juntandolo en un modelo de dominio que solo guarda datos y muchas "clases utilitarias". Es decir aprovechan muy poco las posibilidades de polimorfimo que brinda el lenguaje.
Pero si iba a estar todo tan acoplado y dependiente de la base de datos, ¿Para que nos preocupamos en hacer el mapeo? ¿No era mejor usar algo tipo Active Record? Al fin de cuentas son lo mismo que los DTOs pero con menos código.
Esto es lo que hace Rails y la primera vez que lo vi me parecio una cagada. Huele mal, pero los mapeos O/R no huelen mucho mejor.
...a las conclusiones
Los frameworks de mapeo O/R no cumplen con su promesa de un modelo de dominio libre de la base de datos, y me pregunto cuales son las ventajas en usarlos. Es decir si los usamos solo para facilitar la interacción con JDBC, quizás hay otras maneras que no requieran ningún tipo de mapeo y mantenimiento de "beans" intermedios.
Suscribirse a:
Entradas (Atom)

