martes, 19 de junio de 2007

Modelo del Calendario Gregoriano

El sábado participe de una clase del Master de Ingeniería de Software de la UCA, de la matería que dirige Angel Perez Pulleti. Hablamos sobre el dominio del Tiempo, más exactamente sobre como medirlo usando el Calendario Gregoriano que es el modelo por default que usamos en las culturas "occidentales".
La verdad que fue una clase muy interesante. Los alumnos tenían que proponer un modelo a partir de un enunciado con problemas y casos específicos que le habíamos dado para luego hacer una crítica sobre los mismos y proponer alguna solución mejor.
Me di cuenta que este problema es un muy buen problema para ver todos los errores típicos que se comenten cuando se desarrolla (modela) con objetos. Por ejemplo:
1) Usar una única abstracción para representar varios entes del dominio. Ej. la clase Fecha se utiliza para representar fechas, años, meses.
2) Se utilizan abstracciones incorrectas para representar entes del dominio. Ej. los días (Lunes, Martes, etc) y meses (Enero, Febrero, etc) son Números, por lo tanto:
a) Se puede "realizar cosas" con dichos objetos que no corresponden con los entes del dominio que representan. Por ejemplo se puede multiplicar días (Lunes*Martes) ya que es equivalente a hacer 1*2 (si Lunes es 1 y Martes 2), o sumar meses (Enero+Diciembre).
b) No se puede "realizar cosas" con dichos objetos que si se puede con los entes que representan del dominio, como saber "la cantidad de días" de un mes ya que un Número no posee dicha responsabilidad. O saber si el Lunes está antes que el Domingo, puesto que esta respuesta dependen del contexto y no es "fija" como saber si el 1 está antes del 7.
3) Se ponen malos nombres a las abstracciones, por ejemplo Tiempo o Día a la clase que representa fechas. ¿Por qué Tiempo es un mal nombre?, el ejemplo que uso es el siguiente. Si les pregunto "¿Qué tiempo es?", ustedes, ¿qué responden?. Seguro que algunos dirán "¿a qué te referís? no tiene sentido esa pregunta" y otros se aventurarán a pensar "este gil hizo mal la pregunta... en realidad quizo decir qué tiempo hacía o cómo está el tiempo... y en este momento hace mucho frío". Bien, ahí esta el motivo por el cual es un mal nombre, por que es ambiguo (depende de la interpretación que le demos) y por lo tanto no representa directamente el concepto que se está tratando de sintetizar con dicha clase. El gap semántico entre lo que quiere representar y es, es grande. La pregunta correcta sería "¿Qué fecha es?". Lo mismo sucede con Día, si pregunto ¿qué día es?, algunos dirán "es Lunes", otros dirán "es el primero de enero del 2007", de vuelta una palabra ambigua. Por lo tanto es mejor usar Fecha para el último caso y DíaDeLaSemana para el primero.
4) Y por último, la más común, faltan abstracciones. No se dan cuenta que Mes (por ej. Enero) y MesDelAño (por ej. Enero del 2007) no son lo mismo o que existen DiaDelMes (por ej. 25 de Diciembre), etc.

En fin, un lindo ejercicio.

No hay comentarios.: