Primer Parcial del 08/10/18
Preguntas teóricas
- ¿Qué es la complejidad esencial de un modelo? ¿Qué es lo que influye en la complejidad accidental de un modelo? ¿Por qué es importante reducir la complejidad accidental de un modelo?
- ¿Qué características esenciales tiene el desarrollo de software? ¿Qué diferencia los productos que nosotros desarrollamos respecto de los productos que se crean en las ingenierías “clásicas”?
- ¿Cuáles son las características del modelo constructivista del aprendizaje? ¿Por qué este modelo considera importante el feedback inmediato durante el proceso de aprendizaje?
- En Programación Orientada a Objetos: ¿Qué es una colaboración? ¿Qué es un mensaje? ¿Qué mensajes debe saber responder un mensaje? ¿Qué es un método? ¿Qué mensajes debe saber responder un método? Señale similitudes y diferencias entre mensaje y método.
- En Programación Orientada a Objetos: ¿Qué es un closure? Señale similitudes y diferencias entre closure y método.
Ejercicios prácticos
Ejercicio de sacar código repetido
Se cuenta con la clase EmailRenderer con un único método de instancia.
Cargar el archivo CodigoRepetido.st y CodigoRepetido-Tests.st
render: anEmail | messageContent | (anEmail beginsWith: 'Content-Type: text/plain') ifTrue: [ messageContent := anEmail withoutPrefix: 'Content-Type: text/plain'. ^messageContent ]. (anEmail beginsWith: 'Content-Type: text/html') ifTrue: [ messageContent := anEmail withoutPrefix: 'Content-Type: text/html' . ^messageContent asUnHtml ]. (anEmail beginsWith: 'Content-Type: text/csv') ifTrue: [ messageContent := anEmail withoutPrefix: 'Content-Type: text/csv' . ^messageContent replaceAll: $, with: $| . ]. self error: 'invalid content type '
El mensaje es recibido con un email como argumento, que puede ser un string, y el objeto determina cómo renderizarlo según la cabecera mime:
- Si se trata de texto se retorna el renderizado sin procesar.
- Si es un html se le quitan las etiquetas por medio del mensaje #asUnHtml
- En caso de un csv se reemplazan las comas ($,) por un pipe ($|).
- En otro caso se lanza una excepción
Se pide:
- Modificar el código utilizando la heurística ejercitada en clase para eliminar código repetido
- Entregar la solución completa en un archivo mediante fileOut con nombre CodigoNoRepetido.st. Solo debe contener la solucion sin el codigo repetido, no debe contener los tests
Notas:
- Deben pasar todos los tests entregados, y estos no pueden ser modificados.
- No se puede cambiar el nombre de la clase EmailRenderer ni el mensaje render: anEmail. Sí puede (y debe) modificarse el método con codigo repetido.
- La solución entregada debe funcionar en un imagen limpia
- Se pueden crear tantas clases, mensajes y métodos como sean necesarios
Ejercicio de reemplazar If por polimorfismo
Luego de un año y medio de trabajo estamos terminando de desarrollar un juego llamado Comecocos (que se parece mucho al Pacman). Nos faltan desarrollar algunos aspectos del comportamiento de los cuatro fantasmas, que tienen los siguientes nombres y colores: Shadow (rojo), Speedy (rosa), Bashful (cian), Pokey (naranja).
Los fantasmas persiguen al Pacman con comportamientos distintos. Unas píldoras mágicas proporcionan al Pacman, durante un tiempo limitado, la habilidad de comerse él a los fantasmas, que se ponen azules y se alejan. Si un fantasma es comido, se pone de color negro y tiene que volver a ‘casa’, donde espera hasta regenerarse y volver a su estado natural, recorriendo el laberinto.
Vamos a representar a los fantasmas como objetos de la clase Fantasma. Esta clase debe saber responder el mensaje #coloracion , de donde se obtiene de qué color está el fantasma. Se espera que los objetos que representan fantasmas sepan responder este mensaje sin utilizar ni #ifTrue:, ni #ifFalse:, ni #ifTrue: ifFalse:.
Es importante que los fantasmas nunca cambien su esencia; es decir, si bien se los puede ver de un color distinto como consecuencia del juego, si se los inspecciona como objetos deben tener siempre su color esencial.
Cargar los archivos parcial-sacar-if.st y parcial-sacar-if-tests.st