Hola a todo el mundo,
Me encanta esta discusion, es el tema recursivo que tengo en la cabeza
desde que me dio por leer Domain Driven Design y asistir a alguna
charla de CQRS.
1) Yo no creo que el modelo anemico este tan mal. Hasta ahora ha
funcionado aplicandolo bien. El problema es que es mas dificil juntar
los conceptos bajo los mismos paquetes. Yo siempre he usado una capa
presentacion, servicios, dominio y dao. La logica de negocio siempre
la he puesto en servicios y dominio.
Problemas de este modelo:
- Los objetos "dominio" no lo son realmente, son DTOs y la verdadera
logica va en la capa "servicios".
- Cuesta mas trabajo dividir lo que es logica de negocio de lo que es
logica de la presentacion. Mucha gente termina metiendo logica de
presentacion en la capa servicios (ejemplo, decisiones para meter
informacion en HttpSession).
- Mas dificil de testear o "diseñar mediante ejemplos" que es como me
gusta llamarlo. Se hacen tests por clase en lugar de tests por
historia/escenario y se acaba abusando de los mocks, lo que incrementa
la dependencia test/implementacion.
De todas formas, sabiendo distinguir conceptos y aunque es mas
engorroso, funcionar, funciona.
2) No se exactamente a que os referis con eso de "CRUD puro". Creo que
en toda mi carrera siempre he visto applicaciones que dependen de
algun tipo de "repositorio" (base de datos, web service, solr...). Lo
que si creo que merece la pena distinguir es entre "lecturas" y
"escrituras" que es lo que sugiere CQRS.
En una aplicacion web normalmente hay muchisimas mas peticiones de
lectura que escritura. De ahi que mucha gente se incline a usar alguna
herramienta como Solr. Si divides la aplicacion en dos partes, lectura
y escritura, la parte de lectura es realmente sencilla de hacer.
Normalmente no suele haber logica y, si eres valiente, en casi todos
los casos podrias incluso llamar los DAOs desde la capa presentacion
(supongo que eso es lo que llamais CRUD impuro, o sea Read). La
escritura es mas problematica (y supongo que eso es lo que llamais
CRUD puro). Esta parte siempre tiene consecuencias sobre la lectura,
problemas de informacion obsoleta (cuando un usuario lee algo que
inmediatamente ha sido modificado), concurrencia, y es donde las
reglas de negocio suelen vivir.
Tengo la intencion de empezar a usar DDD en mi proximo proyecto
definitivamente. La idea es tener tres capas: Aplicacion, Dominio e
Infraestructura. Toda la logica va en Dominio y se desarrolla a partir
de "ejemplos" (tests). Infraestructura implementa las interfaces de
repositorio que el Dominio necesite. Y Aplicacion presenta la
informacion modelada en el Dominio.
Alex
On Sep 24, 7:15 pm, Rafael Gutiérrez <
abadon.gutier...@gmail.com>
wrote:
> Si es un buen ejemplo.
>
> Creo que parte del problema ha sido el "estandar" JavaBeans (que
> yo diría que es mas un hack) de tener getters y setters en nuestros Pojos
> para el caso de Java y que de repente nos obliga a tener algo como lo
> siguiente en el codigo:
>
> public void setEstatus(Long idEstatus) {
> this.idEstatus = idEstatus;
>
> }
>
> public void activar() {
> this.setEstatus(1L);
>
> }
>
> public void desactivar() {
> this.setEstatus(0L);
>
> }
>
> Y cuando un usuario de este pojo ve estos tres métodos pues se le hace mucho
> mas facil usar el "setEstatus".
>
> Saludos
>
> Rafa Gutierrez
>
> 2010/9/24 Alfredo Casado <
casado.alfr...@gmail.com>
> >> *
> >> *
> >> *alumno.getAsignaturas().add(asignaturaDeLaQueSeMatricula)*
>
> >> Y aquí es donde realmente comienza el problema:
>
> >> - Estás acoplando el controlador a la implementación interna del
> >> alumno, y a la representación de sus asignaturas.
> >> - Estás violando el principio *tell, don't ask.*
> >> - No estás respetando el patrón GRASP* "Experto en información"*
> >> - Estás violando la ley de Demeter.
> >> - ...
>
> >> Yo añadiría un método al alumno que fuera *matricularseDe* y lo que eso