Lo admito, es el primer paso, había olvidado por completo lo que significa la programación orientada a objetos. Soy uno de esos que, como bien me dijo @jacegu, cree que los POJOs son simples contenedores de datos con getters/setters. Es posible que cosas como Hibernate me hayan hecho mucho daño pero lo peor es que yo me he dejado "cautivar". Un síntoma bastante habitual para detectar esto es mirar si cada vez que creas una clase con sus atributos generas sus métodos accesores (getters) y mutadores (setters). Por lo menos "mutadores" es un buen nombre teniendo en cuenta que los atributos "cambian de estado".

¿Qué me ha hecho darme cuenta de esto? Pues como con casi todo la cosa más simple como una conversación en twitter:

No solo @ialcazar me contestó algo, sino también @jmbeas y @jacegu (os recomiendo su blog que descubrí con este artículo sobre la misma discusión). A partir de sus respuestas y enlaces que me enviaron he abierto los ojos con este tema. Realmente daría para un post muy largo (quizás igualmente interesante) si me pongo a escribir lo que he ido descubriendo pero creo útil poner los enlaces que me han servido para darme cuenta de mi error de "conceptos".

A mi me sonaba lo del "modelo anémico", en algún sitio lo había leído, ¿pero donde? y peor aún, ¿realmente que era eso?... Bien, todo mi proceso de estudio hacia la verdad empezó aquí, en este hilo empezado por @jmbeas sobre, precisamente, este tema. Y ahí estaba, entre las primeras líneas, el sitio donde ya había leído antes eso del "modelo anémico", en los artículos de Fowler (no tengo perdón de Dios).

Resulta que nuestro amigo el "modelo anémico" es un señor anti-patrón que viene a ser un conjunto de objetos, nuestro dominio de la aplicación, con poco más que atributos y sus getters/setters. Sin más lógica. Anémicos, no ricos (en lógica). Esto al final los convierte en simples estructuras de datos, ya que, declarar atributos como privados y luego, consecutivamente, implementar sus métodos de acceso es romper automáticamente el paradigma OO y su principio de la encapsulación. Toma moreno!

A través de esto he (re)descubierto el libro de Domain Driven Development de Eric Evans, el cuál, como tantos otros, está en la lista de Amazon, esperando a la primera compra del año que viene. Lo siguiente es extraído del artículo de Fowler que a su vez lo sacó del libro de Eric (vaya esto parece romper la Ley de Demeter xD):

Application Layer [his name for Service Layer]: Defines the jobs the software is supposed to do and directs the expressive domain objects to work out problems. The tasks this layer is responsible for are meaningful to the business or necessary for interaction with the application layers of other systems. This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.

Domain Layer (or Model Layer): Responsible for representing concepts of the business, information about the business situation, and business rules. State that reflects the business situation is controlled and used here, even though the technical details of storing it are delegated to the infrastructure. This layer is the heart of business software.

Además Fowler habla de la definición, a partir de todo esto, de los POJOs (Plain Old Java Objects) que vienen a ser las antiguas clases que seguían los principios de OO manteniendo, en cada clase, estados y la lógica que interactua con ellos. Con estos métodos "tell, don't ask" :)

Aparte de esta colección de enlaces que estoy repartiendo por el post está el capítulo 6 de Clean Code sobre Objetos y Estructura de Datos y alguno de Pragmatic Programmer. Son los dos primeros libros que, de no tener, ahora mismo compraría y, por mi (poca) experiencia los proporcionaba como material de lectura obligada en la universidad (quizás pueda hacer algo para eso, ya os contaré... :D).

Todos sabemos que el ecosistema de tecnologías, técnicas, paradigmas, etc, en la informática es muy grande. No podemos controlar todo pero creo debemos tener claro los conceptos base para saber si un camino está bien trazado o va por zonas de arenas movedizas. La programación OO nació con esa motivación y, en muchas ocasiones, nos hemos olvidado ante la tentación de las cosas sencillas. Soy el primero que encadena llamadas entre objetos colaboradores pero a partir de ya pondré de mi parte para erradicar esto.

Quedo pendiente para otro artículo como seguir afrontando el proyecto que estaba desarrollando en Grails aplicando estos conceptos. Al final el modelo de datos que tengo, realmente, son DTOs o, más bien, Active Records. Es decir, estructuras de datos.

PD: Un último enlace que acabo de descubrir en el blog de @jacegu sobre el Anemic Domain Model ya que le tiene "especial cariño" :D

PDPD: El artículo que ha escrito @ecomba que está relacionado con este tema. Como bien propone él no hay que usar, obligatoriamente, las "bondades" de estructuras como los Active Records, sino que también podemos modelar nuestra lógica, siempre.