Ejercicio 1 Y justificó lo siguiente:

23 feb. 2013 - En una wiki, los usuarios pueden subir distintos tipos de contenidos, como ser ... ser demasiado pesados,
118KB Größe 9 Downloads 133 Ansichten
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