lunes, 28 de abril de 2008

Consultas para el TP-Objetos 1C-2008

Aquí pueden dejar sus consultas para el Trabajo Práctico del paradigmas de Objetos del 1er cuatrimestre del 2008. Las consultas mediante este medio serán respondidas y podrán ser vistas por todos los alumnos.

12 comentarios:

Nacho dijo...

Nacho: queria saber si para el primer ejercicio del TP los metodos de colocar filas o columnas podemos usar los que ya estan en la biblioteca de metodos de orederedcollection

Luis L. dijo...

Respuesta a nacho acerca de ordered collection: si te referís a si podés utilizar los métodos at:put:, la respuesta es sí. Deben aprovechar la estructura y comportamiento que heredan de la clase que elijan. Sin embargo fijate que el enunciado pide "además de los métodos básicos necesarios" agregar o quitar columnas/filas, no un elemento particular.

Daniel dijo...

agradecería al que pueda darme una mano con el ejercicio 2 del tp.
al momento de hacer el metodo mezclar, se me ocurre recorrer la coleccion que representa el mazo de cartas de manera aleatoria, estuve buscando alguna clase que me de numeros aleatorios pero no encontré nada.
existe alguna manera de generar números aleatorios? o sea crear instancias de la clase Integer dentro de un cierto rango, aleatoriamente?
Gracias.

Chelo dijo...

para el ejercicio 2, dice que para la clase Carta no utilicemos mensajes del tipo itTrue:itFalse. Significa que no podemos usar conjuntamente, es decir como si fuera un if / else? O tampoco podemos usarlo por separado?

Luciana dijo...

Respuesta a Marcelo: La restricción respecto de evitar usar IfTrue: IfFalse: es para forzar a que en el programa halla una aplicación de POLIMORFISMO. La idea está relacionada con definir a carta como una clase abstracta, y definir subclases CartaBasto, CartaOro,CartaCopa.... o bien crear una jerarquias de TipoCarta. El modelado queda al gusto de ustedes. Obviamente, si en algun otro método por otra cuestión necesitan usar condicionales IfTrue:IfFalse, pueden hacerlo.

Luciana dijo...

Respuesta a Daniel: Si no recuerdo mal, la version de Smalltalk que usamos no trae nada en la librería de clases para numeros aleatorios. Busquen un poco, en matemática discreta pueden haber dado algun metodo para generar numeros pseudoaleatorios en rango dado [a,b]. Saludos

Daniel dijo...

hola, quisiera que me ayuden a utilizar el polimorfismo para la clase Carta. Ya cree como subclases de Carta las clases CartaEspada, CartaBasto, CartaOro, CartaCopa.
El método crear:palo: de la clase Carta lo dejo vacio y lo redefino en las subclases.

Desde el Workspace mando un mensaje a Carta como sigue:

Carta crear:2 palo:#oro.

como es posible que se cree un objeto de la subclase CartaOro?

Luis L. dijo...

Respuesta a Daniel acerca de polimorfismo y clase carta:

El método crear: valor palo: palo tiene sentido si decidiste modelar utilizando Carta únicamente.

Para el modelo que vos planteás lo mejor sería, si tenés:

Object subclass: #Carta
Carta subclass: #CartaBasto
Carta subclass: #CartaOro
Carta subclass: #CartaCopa
Carta subclass: #CartaEspada
Carta subclass: #CartaMono


definiendo un método crear: valor en cada uno.

Es suficiente con tener métodos crear:n en CartaBasto,CartaOro CartaCopa, CartaEspada.

Desde el Transcript, o desde algún método de Mazo que cree las instancias Carta, se debería hacer

CartaBasto crear:1.
CartaEspada crear:12.
CartaOro crear: 1.
CartaCopa crear:1
CartaMono crear: 0.
CartaMono crear: 0.

...

(seguramente encontrarás una forma más sencilla de crear las 50 cartas).

Las instancias creadas serían de la clase a la que le envíes el mensaje crear.

La idea de aprovechar el polimorfismo es ver donde y como implementar cada método. Una idea de esto lo podés ver si inspeccionás como están definidos los métodos isString, isCollection, etc y donde.

Como último tip, para la creación de cartas, quizá esto les sea útil (sólo un par de mensajes de prueba, vean si les sirve o pueden usarlo de otra forma).

Carta subclasses.
(Carta subclasses at:1) crear: 5.

Saludos

voluntario dijo...

Hola, quería hacer la siguiente consulta. La clase Array, por ser subclase de IndexedCollection crea arreglos de tamaño fijo?
En este caso, para incorporar una fila y/o eliminarla, como se opera si hice la matriz subclase de la clase arreglo? Ya que no se podría ampliar o disminuir el tamaño del arreglo...

Luis L. dijo...

Respuesta a la pregunta de flaco acerca de Array:
Existe un método en Array llamado grow (crecer). Podrías utilizarlo para hacer crecer el Array. Fijate que deberás mover filas o columnas y llevar control de otras cuestiones como inicio y fin del arreglo.

Otra alternativa, dado que como decís, Array es una FixedCollection, lo que debes hacer es crear un nuevo objeto Matriz, que será la matriz con la fila/columna incorporada/eliminada.

Esto modifica un poco lo pedido en el enunciado, que pide trabajar con la matriz original, pero estaría bien.

voluntario dijo...

Hola de nuevo, estuve viendo lo de la función grow y el problema es que no me funciona dentro de un método de la clase.. Capaz me estoy saltando una pavada o no se, el tema es que dentro del método hago "super grow" y al hacer ShowIt tira error!
Por otro lado hay algún sitio o material de donde podamos sacar información de métodos de Smalltalk (además del apunte de cátedra). Gracias!

Luis L. dijo...

Respuesta a la pregunta de flaco acerca de grow:
Para utilizar el método grow deberías reimplementar new: y agregar una condición para cuando te pasan un entero. Lo mismo con at:.

El problema está en que tenés redefinidos esos métodos de Array seguramente. Te sugiero dos alternativas: o que elijas una mejor clase como superclase (o sea a la cual especializar), o bien que no sobreescribas la implementación de los métodos básicos de Array (new, at:put:, at:) en los cuales seguramente utilizás como parámetros instancias de la clase Point.