IIC2233-2016-1 / syllabus

Página principal del curso
32 stars 34 forks source link

Forma 3 del Control 1. Preguntas 2 y 3. #147

Closed gebalassa closed 8 years ago

gebalassa commented 8 years ago

2. ¿Cuál es la diferencia entre Duck Typing y Poliformismo? _"El Poliformismo es la habilidad de varios tipos de tener una interfaz en común, la cuál debe ser declarada de forma explícita. Esto se puede lograr a través de herencia, o interfaces (que no existen en python). En python usamos polimorfismo cuando utilizamos herencia. Aquí podemos hacer que las subclases sobreescriban los métodos de la clase base o que los utilicen y expandan sus funcionalidades. Podríamos tener una clase Animal y una clase Pato que hereda de Animal. La clase base tiene un método hablar() que Pato sobreescribe, el método ganarenergía() que es el mismo de Animal y el método volar() que el padre no tenía. Que un lenguaje admita Duck Typing significa que el código puede manejar y aceptar cualquier objeto que implemente un método con una firma en particular. La filosofía es "Si se ve como pato, entonces puede actuar como pato". Por ejemplo, en el siguiente código vemos que se puede ejecutar el método hablar() de cualquiera de las clases, ya que este tiene la misma firma (igual nombre y parámetros). python lista = [Animal(), Pato(), Libro(), Arbol()] for item in lista: item.hablar() Con ambos se puede lograr tener una interfaz para poder tratar con los objetos de forma homogénea, la diferencia radica en que la interfaz del poliformismo está basada en los tipos y es explícita (heredo los métodos y atributos de una clase), mientras que en duck typing esta interfaz se logra a través de un contrato en común (implemento el método con la misma firma)."

No entiendo a qué se refiere por "tipos" ni cómo mediante la herencia se está creando una "interfaz en común declarada de forma explícita", que lo haga distinto al sistema de Duck Typing (funcionalmente). Desconozco lenguajes como C++ o Java, pero no entiendo por qué alguien preferiría que no se pudiese hacer persona.hablar() y loro.hablar() al mismo tiempo, considerando natural que si ambas clases (la clase Persona y la clase Loro) tienen el método "hablar()" definido en forma distinta, se consideren de forma aparte dependiendo de la clase a la que se esté llamando. Por "Duck Typing" yo tenía entendido la capacidad de una función Pythoneana de recibir distintos tipos de argumentos, y en base al tipo de argumento recibido, hacer cierta cosa. No sé que tipo de concepto sería ese, entonces.


3. Escriba un comando que cree el archivot "Hola Mundo.txt" con el string "Hola Mundo" escrito dentro del archivo

sh echo "Hola Mundo" > Hola\ Mundo.txt

Esta respuesta me dio risa xD. De partida, la pregunta deja a libre albedrío si se está refiriendo a Python, CMD, la consola de Linux, etc. Segundo, la respuesta presume que uno utiliza Linux, y no explica si haber realizado la respuesta en Python o en CMD resulta válido. Tercero, el uso de la consola (CMD o la de Linux) para crear archivos no es parte ni del curso Introductorio, y con lo visto hasta ahora, tampoco de éste. Cuarto, este control se suponía focalizado en "Estructuras de Datos", por lo que las preguntas de línea de comando CMD no van al caso. Deseaba saber que se iba a hacer respecto a estos múltiples problemas y, por lo menos, tener el análogo en CMD de la respuesta entregada.

Gracias de antemano, G.B.

ivaniadg commented 8 years ago

Con tipos se refiere a que la interfaz se logra a través de los tipos de objetos (a.k.a. las clases). Por ejemplo si tengo la clase Figura de la que heredan Triangulo, Cuadrado y Circulo, sabemos de forma explícita (debido a la herencia) que podemos tratarlas de una manera particular. En duck typing, el tipo (clase) del objeto no indica que existen uno o más métodos que nos permitirían manejar al objeto de la clase 1 de forma parecida al objeto de la clase 2. La única forma de saber esto es viendo la firma del método: nombre y número de parámetros, en el caso de python. En otros lenguajes la firma incluye además el tipo de retorno y el tipo de los parámetros.

gebalassa commented 8 years ago

Actualicé la pregunta. Gracias igual por responder.

ivaniadg commented 8 years ago

Con respecto a la pregunta 3

  1. No deja a libre albedrío. Cuando se habla de comandos (sin especificar lenguaje) se refiere a la consola en cualquier sistema operativo. Haz una búsqueda en google y te podrás fijar en eso. Escribir en Python es escribir código (no comandos).
  2. Dentro de las lecturas obligatorias que se les dieron el día 12 de marzo está el curso de Codeacademy. El curso es muy corto y consiste básicamente en probar las cosas que se preguntaron en el control.
gebalassa commented 8 years ago

Oka, muchas gracias.

El 27 de marzo de 2016, 20:52, indonoso notifications@github.com escribió:

Con respecto a la pregunta 3

  1. No deja a libre albedrío. Cuando se habla de comandos (sin especificar lenguaje) se refiere a la consola en cualquier sistema operativo. Haz una búsqueda en google y te podrás fijar en eso. Escribir en Python es escribir código (no comandos).
  2. Dentro de las lecturas obligatorias que se les dieron el día 12 de marzo está el curso de Codeacademy https://www.codecademy.com/learn/learn-the-command-line. El curso es muy cortoy consiste básicamente en probar las cosas que se preguntaron en el control.

— You are receiving this because you authored the thread. Reply to this email directly or view it on GitHub https://github.com/IIC2233-2016-1/syllabus/issues/147#issuecomment-202170056

bmarinb commented 8 years ago

De todas formas en el tutorial de codeacademy no se usa el comando echo, se usa touch

santiagocruzb commented 8 years ago

[pregunta 3] @indonoso el curso esta orientado a objetos. Si quieren seguir haciendo ese tipo de pregunta, están en todo su derecho a hacerlas. Pero con mucho respeto, considero que este tipo de preguntas no suman para el curso. Estos comandos no son necesarios durante el curso, y tengo la sensación que en esta respuesta, la nota no fue buena. El ramo ya toma una cantidad de tiempo bastante superior a otros cursos, como para estar aprendiendo sobre consolas. Por último, podrían hacer un control especifico de las lecturas y sería mucho más productivo que estar metiendo en cada control una pregunta de algo que no se ocupa día a día. Saludos.

jecastro1 commented 8 years ago

@bmarinb touch sirve para crear archivos vacíos, no con contenidos.

De hecho el mismo comando de la solución, con otros parámetros aparece en el tutorial, 3.2.

@santiagocruzb Las condiciones del curso fueron claras. Se informó en la primera clase que las lecturas serían sobre contenidos paralelos del curso, y que podrían ser evaluadas en cualquier control o prueba, y así seguirá siendo. La consola acompaña a cualquier programador que sea digno durante toda su vida, y es necesario saber usarla y acostumbrarse a ella.

MainScientist commented 8 years ago

Para extender un poco la respuesta de @indonoso con respecto al polimorfismo

El ducktyping se da mayoritariamente en lenguajes no tipados, es decir, lenguajes donde el interprete no sabe a priori de que tipo son las variables que estas manejando, aunque también puedes encontrar ducktypeng en lenguajes tipados C++ y D. Esto permite hacer cosas como esta:

lista = [Animal(), Pato(), Libro(), Arbol()]
for item in lista:
    item.hablar()

En este caso item podria ser de cualquier clase e incluso podria no tener el método hablar(), pero como el interprete no lo sabe simplemente asume que "Si se ve como pato, entonces puede actuar como pato" (cuando no pueda actuar como un pato el codigo va a fallar). No le importa saber que la variable item sea realmente un pato.

En la mayoría de los lenguajes tipados esto no se puede hacer debido a que debes decirle al intérprete de qué clases son tus variables. Para el intérprete las variables ya no se ven como patos, sino que las variables son o no son patos. Si es un pato, puede usar el metodo hablar(), si no es un pato, entonces no puede.

Entonces ¿Cómo puedo modelar comportamientos similares en los lenguajes tipados? En los lenguajes tipados (y en los no tipados tambien) puedes usar Polimorfismo. El polimorfismo (en este contexto) es la capacidad de una clase hija, de actuar como si fuese de la clase padre. Es decir, si tienes una clase PiezaDeAjedrez con el metodo move()y tienes Reina, Rey Peon y Caballo, sabes que tanto Reina, Rey, Peon y Caballo tienen el método move debido a que lo heredaron de PiezaDeAjedrez y, por lo tanto, puedes decirle al interprete de tu lenguaje tipado favorito: "Esta variable va a ser de tipo PiezaDeAjedrez". Podria ser un rey, un peon, etc, el interprete no sabe qué tipo exacto es, pero sabe que va a heredar de PiezaDeAjedrez y por lo tanto va a tener poder usar el método move(). Un objeto de clase Rey puede actuar como un objeto de clase PiezaDeAjedrez.

Ejemplo concreto:


// Creas una nueva lista que contiene objetos de la clase PiezaDeAjedrez.
ArrayList<PiezaDeAjedrez> list = new ArrayList<>(); 

/* Ahora agregamos piezas a la lista. Puedes ver que agregamos piezas de 
* diferentes clases, pero que todas heredan de PiezaDeAjedrez, por lo tanto el
* interprete no tiene problemas.
*/
list.add(new Rey());
list.add(new Reina());
list.add(new Peon());
list.add(new Caballo());

/* Ahora iteras sobre los items de la lista, como vez aquí le dices al intérprete que pieza va a
* ser de tipo PiezaDeAjedrez, podría ser un Rey, una Reina, pero como el intérprete no lo
* sabe, no puedes usar ningún método que sea exclusivo de Rey o Reina, solo puedes
* usar métodos de la clase PiezaDeAjedrez.
*/
for (PiezaDeAjedrez pieza : list){
    pieza.move();
}

Obviamente python también puede hacer exactamente lo mismo, pero no te exige hacerlo mediante herencia (no te exige que Rey, Reina, Peon, etc.. hereden la misma clase). Esto puede ser "bueno" si lo ves por el lado de que es cómodo, pero al no ser exigente permite darte libertades que podrían caer en una mala modelación, por lo tanto debes ser extremadamente cauteloso al usar ducktyping e intentar hacerlo lo menos posible.

fgvenegas commented 8 years ago

@santiagocruzb Tal vez ahora te parezca que no es util saber de la consola, pero mas adelante comprenderas que es indispensables saber manejarla para todo tipo de usos. Todo lo que se les enseña en el ramo es por algo, desde el mismo uso de Github, creeme que despues agradeceras esto porque es la instancia que tienes para tener alguien a quien plantearle tus dudas y que pueda responderte. Hay muchas cosas que de verdad te serviran para la vida.