FINAL PARADIGMAS DE PROGRAMACIÓN 23/02/2013
Ejercicio 1 En una wiki, los usuarios pueden subir distintos tipos de contenidos, como ser texto e imágenes. En caso de ser demasiado pesados, antes de subir los contenidos la wiki realiza ciertas acciones sobre ellos, como por ejemplo, comprimir las imágenes o indexar el texto (usando complejos algoritmos que no nos interesan). Un programador desarrolló la siguiente solución: #Wiki vi: contenidos >>subirContenido: unContenido (self demasiadoPesado: unContenido) ifTrue: [ unContenido esImagen ifTrue: [ unContenido comprimir ] ifFalse: [ unContenido indexar ]. ] contenidos add: unContenido
>> demasiadoPesado: unContenido unContenido esImagen ifTrue: [ ^unContenido tardaEnSubir ] ifFalse: [ unContenido esTexto ifTrue: [ ^ unContenido tardaEnSubir > 10000 ] ]
#Contenido “Clase vacía”
#Texto (hereda de Contenido)
#Imagen (hereda de Contenido)
vi: descripcion
vi: cantidadPixeks
>>tardaEnSubir ^descripcion size * 10
>>tardaEnSubir ^cantidadPixels >indexar “acá va un complejo algoritmo de indexación”
>>comprimir “acá va un complejo algoritmo de compresión”
>>esImagen ^false
>>esImagen ^true
>>esTexto ^true
>>esTexto ^false
Y justificó lo siguiente: a. "En la solución se hace un buen uso del polimorfismo, dado que a una wiki no le importa el tipo de b. c. d. e.
contenido que tiene que agregar, siempre que el contenido sepa decirme si es imagen” "Para que los contenidos sean polimórficos, todas las clases de contenidos deben heredar de una clase común: Contenido.” “Acá hay otro buen ejemplo de polimorfismo: tanto la imagen como el texto entienden tardaEnSubir” “Como no tiene métodos, podemos decir que Contenido es una clase abstracta" “Más allá de que no sepamos cómo están implementados los métodos indexar y comprimir, estos tienen con seguridad efecto colateral”
1. Indicar si concuerda con cada una de las afirmaciones anteriores y justificar su postura. 2. ¿Qué pasaría si se agregara un nuevo contenido que no es ni imagen ni texto (tanto #esTexto como #esImagen retornan false)? 1
FINAL PARADIGMAS DE PROGRAMACIÓN 23/02/2013
3. A partir de los puntos anteriores desarrollar una nueva solución que corrija los errores mencionados, más aquellos adicionales que se encuentren. 4. ¿Qué dificultades encontraría si quisiera implementar la misma solución en el paradigma funcional? Justificar conceptualmente
Ejercicio 2 Dos reconocidos programadores hicieron cada uno un sistema de clasificación de varitas mágicas. Aquí se encuentra una porción del código que escribieron: Uno lo hizo en Haskell:
Otro lo hizo en Prolog:
queTiene “harry” = (“acebo”,28,”plumaFenix”) queTiene “ron” = (“sauce”,35,”peloUnicornio”) queTiene “bellatrix” = (“nogal”,32,”nervioDragon”) queTiene “tom” = (“tejo”,33,”plumaFenix”)
tiene(harry, varita(acebo,28,plumaFenix)). tiene(ron, varita(sauce,35,peloUnicornio)). tiene(bellatrix, varita(nogal,32,nervioDragon)). tiene(tom, varita(tejo,33,plumaFenix)).
1. Indicar, para cada una de las siguientes consultas, cual es la respuesta del intérprete, y justificando en todos los casos el ó los conceptos que aparezcan. Si la consulta lanza un error, indicar claramente de qué tipo de error se trata. a. Haskell: queTiene 45 b. Prolog: tiene(45,Que). c. Haskell: queTiene “hermione” d. Haskell: queTiene 2. Escribir (en Prolog) una consulta que me permita saber si existe alguien con una varita de 35 cm. ¿Es igualmente simple hacer esta consulta en Haskell? ¿Porqué? 3. Harry consigue la varita de Saúco y ahora tiene 2 varitas. Modelar dicha situación en ambos lenguajes, y señalar cómo los conceptos de función y relación son aprovechados o limitan las soluciones. 4. Dada una lista de varitas, se desea saber la madera de cada una de ellas (su primera componente). a. Desarrollar esta funcionalidad en ambos lenguajes. ¿Qué concepto aparece en ambos casos y cómo nos ayuda? ¿Qué ocurriría si no contáramos con ese concepto? b. Para la solución Haskell dar, además, el tipo más general para la función principal que resuelve el problema c. Suponga que la lista de varitas es muy grande, potencialmente infinita. ¿Cómo se comportaría cada una de las dos soluciones bajo este supuesto? Dar al menos un ejemplo de consulta y respuesta donde la evaluación termina y otro ejemplo donde no, para cada solución, si es posible.
2