miércoles, 8 de agosto de 2007

Fin de Cuatrimestre en POO

En realidad el cuatrimestre terminó hace algunas semanas... tenía ganas de ir posteando lo que fui aprendiendo/notando de interesante durante este cuatrimestre pero no tuve tiempo, así que voy a hacer un resumen de lo que me acuerdo y me parece importante. Por ejemplo, hay ciertos errores que me cuesta mucho que los alumnos dejen de cometer, ellos son:
1) No poner el tipo de los colaboradores (parámetros) en los nombre de mensajes. Por ejemplo, crean mensajes como "alterContect: aContext withEvent: anEvent" en vez de "alter: aContect with: anEvent". Esto se debe, me da la impresión, a la experiencia que tienen en utilizar lenguajes con sintaxis tipo C donde es necesario escribirlos así puesto que los nombres de los "parámetros" están completamente desasociados del nombre del mensaje. Por ejemplo, en Java escribirían "alterContextWithEvent (aContext, anEvent)".
2) Les cuesta muchísimo no romper el encapsulamiento de los objetos. Es muy común que a un objeto le pidan un colaborador interno y luego interactúen con el en vez de delegarle esa responsabilidad al objeto que posee dicho colaborador. Por ejemplo al objeto "aGameContext" le piden su "history" y luego a dicho objeto le envían el mensaje "add: anEvent" en vez de que directamente el objeto colabore con "aGameContext" de la siguiente manera: "aGameContext addToHistory: anEvent" y sea "aGameContext" quién termine colaborando con "history". Esto se debe, en mi opinión, a que aún siguen viendo a los objetos como estructuras de datos
3) Otro problema que veo constantemente es que escriben métodos enormes por más que insistimos en no hacerlo y en utilizar el refactoring "extract method".

Sin embargo también aprendí algunas cosas interesantes este cuatrimestre. Uno que me acuerdo tiene que ver con modificar "Interval" para que trabaje con "Medidas" y no solo con números. El problema tenía que ver con que en algún lugar Interval hace "(stop - start) / by = 0" y esto no es factible resolverlo si no se implementó el "polimorphic zero". Por lo tanto la solución que propuso un grupo fue hacer "(stop - start) / by + start = start"... muy piola.

2 comentarios:

Anónimo dijo...

Una solucion mas simple, que tampoco necesita un polimorphic zero, me parece que seria usar:

((stop - start) / by) isZero.

Solo habria que implementar ese metodo en ArithmeticValue (que de hecho creo que ya existe) y en 'Medida' .. no ?

saludos
martin

Hernan Wilkinson dijo...

Si, tu solucion es correcta, pero implementarlo es parte de lo que hay que hacer para tener el polimorphic zero justamente... puesto que
0 isZero = 0 meter isZero

Gracias por el comentario!
Hernan.