Sobre el modelo anémico y la POO

Ayer, unas horas después de leer el post de @kinisoftware, Modelos de dominio anémicos, POJOs y demás seres del lugar, me encontré una discusión en twitter a varias bandas(sitio que no es ni mucho menos el mejor para debates así... sigo echando de menos las conversaciones/discusiones que teníamos entre una micro-comunidad en jaiku, pero ese es otro tema) sobre el anti-patrón del modelo anémico.

Hablando del tema vi tuits de @kinisoftware, @albertovilches, @jmbeas, @genezeta, @jneira, @jlhuertas... y fijo que me pierdo a algunos más de gente que no sigo. Como es habitual, yo no me mojé demasiado :P. Por un lado soy un chaquetero, y por otro esta gente sabe mucho y me pueden dejar a la altura del betún en cualquier momento :D

Por resumir un poco esto del modelo anémico, viene a ser que el modelo está implementado con DTOs, cuya única responsabilidad es encapsular datos para transferirlos a otra parte(ej: de una base de datos a la vista de una app). Cosa que creo aún es bastante habitual en muchas aplicaciones que utilizan ORMs o similares(llámense Hibernate, ActiveRecord, GORM, Doctrine, MyBatis... o soluciones home-made)... Pues resulta que eso es un anti-patrón, más que nada porque por hacer eso probablemente estemos rompiendo el paradigma de programación orientada a objetos.

Recuerdo cuando me enseñaban POO(con Java) que una clase Rectangulo tenía un atributo base y otro altura con sus getters y setters y un método calculaArea() que devolvía su área(vale, y probablemente extendería de Poligono :P). Vamos, que se supone que un objeto combina estado y comportamiento, por eso veo por ejemplo hablando una clase de dominio Noticia que tiene un atributo propietario puede tener un método del estilo:

public boolean esPropiedadDe(Usuario usuario){
   return propietario.equals(usuario)
}

La cosa es que en los frameworks MVC ese tipo de lógica la he visto(y sí, también la he puesto! XD) en la capa del controlador, cuando se supone que es una capa que debe ser lo más tonta posible en cuanto a lógica de negocio (o ya puestos, tonta del todo :D, skinny controller-fat model), y con la moda de las capas de servicio con los Spring & co(Grails como una de esas víctimas colaterales) ha resultado que esa lógica se pone en la capa de servicio para evitar ponerla en el controlador y seguir dejando a las clases de dominio como DTOs(o modelos anémicos).

¿Eso quiere decir que siempre pongo la lógica en las clases de dominio?
No, pero procuro hacerlo siempre que puedo identificar responsabilidades en una clase del dominio. Aún así, en ocasiones me encuentro con lógica que pasa a alguna clase en la capa de servicio, principalmente porque no consigo identificar qué clase debería ser la responsable, afecte a varias clases de dominio o simplemente sean comportamientos que no tienen que ver con la lógica de negocio pura y dura. Por supuesto teniendo en cuenta que esas decisiones sean cosa mía :D

De todas formas, ya se sabe que en esto del desarrollo de software todo depende de muchos factores(principalmente de los gustos y costumbres de los desarrolladores) y nadie tiene LA respuesta. Eso es lo que hace más interesante el mundillo, ¿o no? :D

sort()
Viñeta de Geek And Poke, como no ;)

PD: Disculpad que os tengáis que imaginar parte del código y el spanglish rarillo en los ejemplos, el código de verdad hace tiempo que procuro escribirlo siempre en inglés :P

Goza!Hack - Hackmeeting 2010

Copio y pego del blog del hackmeeting

Goza!Hack Hackmeeting 2010

El pasado lunes 18 de octubre el CSO La Vieja Escuela, donde ya se llevaba tiempo planeando el Hackmeeting, encuentro anual de hackers y hacktivistas, fue desalojado de madrugada por la policía. Para sacarnos de allí, aprovecharon los refuerzos policiales llegados desde Barcelona, y la hora a la que los vecinos y vecinas del barrio descansaban después de una semana de las fiestas del Pilar.

El desalojo del pasado lunes 18 de octubre no desmotivó a nadie, sino que nos hizo más fuertes: diferentes colectivos participaron en una manifestación de rechazo, en la que nuestras redes se vieron las caras en la calle. No quieren enterarse de que forzarnos a salir de un lugar no detiene nada: las asociaciones de vecinos, la asamblea okupa y el hacktivismo siguen construyendo alternativas, y cuando necesitamos un lugar, lo encontramos. Salimos de La Vieja Escuela, y ahora nos encerramos en la carcel: hemos abierto las puertas de la Cárcel de República Independiente de Torrero.

No podíamos encontrar un lugar mejor. El barrio está cansado de contemplar este espacio inutilizado, cansado de las hipócritas promesas de ceder el lugar a usos vecinales, cansados de que sus proyectos de uso comunitario y social sean ignoradas por los que sólo prometen como mercancía electoral.

El nuevo espacio liberado está en la Plaza de la Memoria Histórica, aunque parezca que los que nombran las plazas padecen de amnesia. En este lugar cumplió condena todo el que pensaba diferente durante la última dictadura militar. No ubican al azar sus focos de represión. En 1917 levantaron sus rejas en el barrio de las minas de donde salieron las piedras para sus palacios.

Ningún dispositivo de control es eterno, y hoy estrenamos esta cárcel reapropiada para los vecinos con unas jornadas en las que seguir subvirtiendo el uso de la tecnología. La era digital no es sólo el paraíso del consumo que quieren vendernos, es también un escenario de resistencias digitales, de reapropiación y construcción colectiva de alternativas con la tecnología como aliada.

El Hackmeeting ha comenzado hoy, como habíamos prometido.
En estos momentos nos encontramos rehabilitando el espacio a marchas forzadas, es abrumador el trabajo que se está realizando.

No te quedes con la curiosidad, no dejes que te lo cuenten: Ven y arrima el hombro. Ven y contágiate, ven y pregunta.

Las charlas comenzarán en la tarde del viernes 22.

Bienvenidos al goza!hack.
Bienvenidos a la Cárcel de Torrero.

Zaragoza resiste,
República Insurgente de Torrero
21 de octubre de 2010.

Espero escaparme algún rato para pasar por el Goza!Hack este fin de semana, además hay varios nodos(actividades) que me parecen muy interesantes.

DNDzgz Lite, porque yo también lo necesito

Como supongo que sabréis la mayoría de los que seguís este humilde(y muchas veces olvidado :P) blog, hace unos meses participando en el AbreDatos formé parte del equipo de DNDzgz una aplicación web para móviles de última generación, en principio para cualquier terminal cuyo navegador web soporte geolocalización.

Algo de tiempo después gimenete, junto a Sergio, lanzaron la versión nativa para iPhone de DNDzgz. Adelanto aque hora están trabajando en una nueva versión, y por lo que he visto hasta ahora... a mi me dan ganas de comprarme un iPhone para aprovecharla! :D

Hace poco más de una semana, se anunció la aplicación ViveZaragoza para Android. Una aplicación desarrollada por la gente de warp para el Ayuntamiento de Zaragoza, con las funcionalidades de consulta de Bus y Bizi, además de poder consultar el programa de actos de las fiestas del pilar(recién acabadas) con sus respectivas localizaciones.

Y como algunos ya saben, soy poseedor de un "flamante" Nokia 5130 XpressMusic(también conocido como un "nokia guarro" ;)), y desde primeros de Octubre me he vuelto a mudar ooootra vez a Zaragoza(veremos por cuanto tiempo :P).

La cuestión es que, esta semana pasada llevaba esperando a un autobús durante bastante rato, lo suficiente como para proponerme que iba a ser la última semana que no sabía cuanto me tocaba esperar. Lo bueno ha sido que este fin de semana no he recibido visitas "pilaristas" y he podido dedicar un par de ratos a tirar un poco de código, lo que me ha permitido lanzar DNDzgz Lite. Ahora con el Opera Mini de mi "nokia guarro", ya puedo saber cuánto tarda el autobús usando el número de poste y cuantas bicicletas hay en una parada de bizi consultando por su número.

Tengo la sensación de que lo vamos a utilizar muy poquitos, pero al menos a mi me es útil y por fin voy a aprovechar parte de mi trabajo en el AbreDatos :P

PD: Por si hay algún despistado, para acceder a la versión lite directamente http://www.dndzgz.com/lite(que con terminales "viejos" no creo que tengamos tarifas planas y hay que ahorrar ancho de banda :P)

Empezar con MongoDB

En estos momentos me encuentro enfrentándome a un problema en el que tengo que persistir una cantidad de datos realmente grande, con diferentes fuentes de esos datos, en cada fuente los datos pueden ser "de su padre y de su madre", el sistema debe escalar lo más fácilmente posible y se deben poder hacer búsquedas por diferentes criterios.

Una vez puestos en contexto a grandes rasgos, os diré que vi que posiblemente la mejor opción para resolver el problema era utilizar una base de datos orientada a documento, un tipo de base de datos de las llamadas NoSQL.

Tras andar estudiando CouchDB y MongoDB, me decanté por la segunda. ¿Por qué?: La principal razón porque MongoDB, además de MapReduce, permite lanzar consultas dinámicas al estilo relacional. En la misma web de MongoDB hay una comparativa muy interesante de diferencias y similitudes con CouchDB.

En fin, que he ido recopilando algunas lecturas que me han resultado interesantes para romper el hielo(eso sí, principalmente para trabajar con Java):

Tengo que decir también que hay un par de plugins para Grails, pero por ahora he pasado de ellos. No he visto que aporten mucho más que un mapeo objeto-documento para las clases de dominio, y eso haría que perdiese esa flexibilidad que necesito.

En fin, trataré ir contando algo de como van mis progresos :)

Saraos para programadores

Para darle un poco de vidilla al blog, que con tanto lío lo tengo un poco olvidado, algunos eventos que pueden ser interesantes para desarrolladores y a los que si puedo intentaré asistir:

El 23 de Septiembre, Google DevFest 2010 en Madrid, la agenda no tiene mala pinta, aunque evidentemente la temática es exclusivamente sobre productos y frameworks de google.

Los días 4 y 5 de Noviembre, la Conferencia Rails 2010 también en Madrid. Todavía están con el call for papers y hace bastante que no trabajo con Rails "de verdad", pero como el último año no pude ir y que lo están intentando internacionalizar, me pica mucho la curiosidad ver como queda :)

En Barcelona los días 12 y 13 de Noviembre, Agile Open Spain 2010. Un open space organizado por la comunidad Agile-Spain... no tenía claro cuál era el formato ideal de propuesta para un open space, pero @jjballano me lo ha resuelto rápido. Es un formato de evento diferente de los que he ido hasta ahora, veremos que tal.

Actualización:

artberri avisa que el 29 y 30 de Octubre es la PHPConference en Barcelona, también están con el call for papers.

Kinisoftware también avisa que el 2 de Octubre hay un coderetreat en Madrid.

¿Más eventos interesantes para desarrolladores?

PD: Un día de estos espero publicar alguna cosilla con más fundamento :P