Autor |
Mensaje |
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Gente necesito una mano con un ejercicio que hay q entregar este miercoles.
No le puedo agarrar la mano a Smalltalk y se me esta complicando bastante .
Tengo que hacer una maquina expendedora de bebidas. Estaba trantado de hacer un metodo "hacedorDeCafeConLeche: unVaso conAzucar: cucharadasAzucar"
unVaso es de tipo Vaso y tiene un contenido y una cantDeCucharadasDeAzucar (atributos).
Les dejo el enunciado (PDF) donde esta la especificacion de lo que tendria que hacer este metodo (es un embole estar copiando y pegando ademas ahi esta mas ordenado).
Si me pueden dar una manito con esto porque sino me parece que me voy a ir despidiendo de algo 3 por este cuatri jaja
|
|
|
|
|
|
|
|
|
Bistek
Nivel 8
Registrado: 07 May 2010
Mensajes: 691
Carrera: Informática
|
|
El ejercicio esta basicamente hecho en el enunciado pero describiendo los algoritmos con palabras. Cada cuadrado es una clase que tenes que implementar. Los nombres de la parte de arriba del cuadrado tomalos como atributos de la clase y lo que esta abajo son los metodos que tiene que implementar.
Recorda que los metodos representan las acciones que puede realizar un objeto perteneciente a la clase, por lo tanto deben usarse verbos para los nombres. Un metodo llamado "hacedorDeCafeConLeche: unVaso conAzucar: cucharadasAzucar" es incorrecto, deberia ser "hacerCafeConLecheEn: unVaso conAzucar: cantidadDeCucharadasDeAzucar"
No se que mas te puedo decir para ayudarte. Podrías agregar clases si es necesario, por ejemplo, para representar el vaso
|
|
|
|
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Si mas o menos eso lo entendi pero me mareo cuando lo voy a implementar en Smalltalk.
Una cosa que no aclare es que en realidad el verdadero ejercicio que tenemos que hacer es hacer pasar unas pruebas (usando el TestRunner).
Por ejemplo este es el codigo de uno de los test:
Código:
|
testCafe
| unaMaquinaDeCafe unVaso |
unaMaquinaDeCafe := MaquinaDeCafe new.
unVaso := Vaso new.
unaMaquinaDeCafe prepararCafeEn: unVaso conAzucar: 0.
self assert: (unVaso volcarContenido = 'cafe').
self assert: (unVaso volcarContenido = nil).
|
Lo que se me habia ocurrido es armar una cola o algo asi y que cada vez que llama a volcarContenido saque el ultimo elemento que se agrego.
Pero no entiendo bien como hacer la implementacion de "unaMaquinaDeCafe prepararCafeEn: unVaso conAzucar: 0".
Lo que me marea es esa manera de escribir que tiene smalltalk (tal vez porque siempre programe en C/C++ y ahora me tiraron smalltalk por la cabeza y arreglate jaja)
|
|
|
|
|
|
|
|
|
Bistek
Nivel 8
Registrado: 07 May 2010
Mensajes: 691
Carrera: Informática
|
|
Si tenes un vaso y le echas cafe el contenido es 'cafe', si le echaste cafe y leche el contenido es 'cafe con leche', le echas azucar a esto y tenes 'cafe con leche con azucar' por ejemplo. No veo que haga falta tomar registro de los elementos individuales que vas echando porque una vez en el vaso son inseparables.
Por cierto, lo que te marea no es el lenguaje, es que no estas pensando en objetos. Fuiste a las clases? este ejercicio suelen resolverlo en clase pasando al frente a modo de juego.
Todo lo que tenes en smalltalk son objetos y mensajes. La clave de este ejercicio (y de poo) es ir delegando responsabilidades. La maquina de cafe no sabe como preparar el cafe con leche, solo tiene el vaso. Entonces le pasa el vaso al hacedor de cafe con leche y le dice que prepare el cafe con leche. El hacedor de cafe con leche conoce la receta del cafe con leche, pero no tiene ni el cafe ni la leche, entonces le pasa el vaso al cafetero y le dice que le ponga cafe adentro, cuando termina lo recupera y se lo pasa al lechero para que le ponga leche, lo recupera de nuevo y el cafe con leche ya esta listo, entonces le devuelve el vaso a la maquina que inicialmente habia pedido la bebida.
Como ves, cada objeto tiene responsabilidad limitada, la maquina conoce las bebidas que puede preparar, los hacedores de cafe y te conocen la receta de los mismos, y el cafetero y el lechero solo saben poner su producto adentro del vaso.
|
|
|
|
Última edición por Bistek el Dom Mar 31, 2013 10:58 pm, editado 1 vez
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Por otro lado, si hicieras lo de sacar un contenido por vez, no se cumplirían los asserts. Está claro por las purebas que después de sacar café una vez el vaso queda vacío.
Fijate cómo son los otros tests (o sea, los de café con azúcar y con leche); eso te debería decir qué es lo que tenés que implementar.
|
|
|
|
_________________
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Perdón, no había leido el enunciado; dice que el cafetero, el lechero y el azucarero "ponen un papel en el vaso".
¿Por qué no posteás las pruebas de alguna bebida más compleja?
BTW, por como está redactado el que implementa la parte de contener las cosas que le pusieron es el vaso, no la máquina de café.
|
|
|
|
_________________
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Esta es la prueba mas "completa" de las que pusieron:
Código:
|
testTeConLecheConTresDeAzucar
| unaMaquinaDeCafe unVaso |
unaMaquinaDeCafe := MaquinaDeCafe new.
unVaso := Vaso new.
unaMaquinaDeCafe prepararTeConLecheEn: unVaso conAzucar: 3.
self assertTrue: (unVaso volcarContenido = 'te').
self assertTrue: (unVaso volcarContenido = 'leche').
self assertTrue: (unVaso volcarContenido = 'azucar').
self assertTrue: (unVaso volcarContenido = 'azucar').
self assertTrue: (unVaso volcarContenido = 'azucar').
self assertTrue: (unVaso volcarContenido = nil).
|
Si, estuve en clase cuando hicieron el ejercicio y entendi que el objetivo era ir separando las responsabilidades. Mi problema es que a la hora de traducir el "pseudo-codigo" que esta en el pdf nose como hacerlo. No entiendo bien el funcionamiento de Smalltalk para ir delegando entre las clases.
Por ejemplo en el metodo que puse antes "unaMaquinaDeCafe prepararCafeEn: unVaso conAzucar: 0"
A quien corresponderia ese metodo?, a la clase MaquinaDeCafe o al Vaso?
Tengo que hacer otro metodo a parte q sea "prepararCafeEn:"(el que haria esto seria el "hacedorDeCafé")? Si es asi como hago para decirle dentro "unaMaquinaDeCafe prepararCafeEn: unVaso conAzucar: 0" anda a "prepararCafeEn:" y poné cafe??
Muchas pregunta no?? .
Perdon que sea tan rompepelotas y gracias por la ayuda
|
|
|
|
|
|
|
|
|
Bistek
Nivel 8
Registrado: 07 May 2010
Mensajes: 691
Carrera: Informática
|
|
unaMaquinaDeCafe prepararCafeEn: unVaso conAzucar: 0
La sintaxis es siempre "objeto metodo:argumento"
Aca invocas al metodo "prepararCafeEn: argumento1 conAzucar: argumento2" del objeto unaMaquinaDeCafe que es una instancia de la clase MaquinaDeCafe
Los metodos con varios argumentos se escriben con ese estilo, pero corresponden a un solo metodo.
Tenes que implementar ese metodo en la clase MaquinaDeCafe, tal como lo harias en algo2... esta bien lo que decis del hacedorDeCafe, fijate como podes hacer para que la maquina de cafe conozca al hacedor de cafe y asi poder llamar a sus metodos.
Si aun no entendes, ponete a leer sobre delegacion. Consegui el libro de fontela o busca esa version vieja del mismo que se consigue en internet.
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Adhiero a la respuesta de Bistek.
Al respecto del lenguaje, ¿entendés lo que estńa haciendo los dos tests que pegaste? (qué se instancia, cómo, qué métodos se llaman, a qué objeto pertenecen, cuáles son los parámetros)
Sobre el particular la implementación de vaso necesita un contenedor para guardar los "papelitos" (sobre lo de colas que dijiste antes, ¿no se te ocurre un contenedor más sencillo?). Sobre el enunciado, está mal documentado lo que hace el azucarero; no escribe tantas equis como cucharadas de azúcar haya, pone un papelito "azúcar" en el vaso por cada cucharada.
Fijate de entender bien los tests porque te dan un montón de información (por ejemplo, ¿el vaso es LIFO o FIFO?). Igualmente vale lo de Bistek, antes preocupate por entender bien clases, métodos y objetos, lo básico de OOP.
|
|
|
|
_________________
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Gracias por las respuestas. Pude avanzar en el ejercicio pero tengo una duda en el metodo "volcarContenido".
Lo que hice al final es ir guardando en una lista (LinkedList) lo que se iba agregando al vaso (primero agrego cafe o te, despues leche si es q lo pide y por ultimo azucar tmb si lo pide) pero no se bien como ir sacando de la lista.
Por lo q entiendo el vaso seria un FIFO pero hay algun metodo que saque el primero de una lista (y lo borre)??
|
|
|
|
|
|
|
|
|
cyng
Nivel 8
Registrado: 04 Jul 2010
Mensajes: 472
Carrera: Informática y Sistemas
|
|
|
|
|
ezequiel.grillo
Nivel 4
Registrado: 11 Abr 2011
Mensajes: 74
Carrera: Informática y Sistemas
|
|
Gracias gente ya pasaron todas las pruebas.....costo pero al final se me activo el cerebro jajaj
Abrazo.
|
|
|
|
|
|
|
|
|
cristian3629
Nivel 1
Registrado: 03 Dic 2012
Mensajes: 4
|
|
Hola! Tengo un problema con el mismo ejercicio, básicamente es sobre assert.
En las pruebas realizan esto
self assertTrue(algo="cadena").
y me salta un error del estilo doesNotUnderstand: #assertTrue
Básicamente hago esto:
|p1 contenidos objeto|
contenidos :=OrderedCollection new.
p1 := String new.
p1 := 'cafe'.
contenidos addLast:p1.
objeto:=contenidos removeLast .
self assertTrue(objeto=´cafe´). <------acá esta el problema!
Si alguien me puede decir una pista se lo agradecería mucho!
Saludos
|
|
|
|
|
|
|
|
|
cyng
Nivel 8
Registrado: 04 Jul 2010
Mensajes: 472
Carrera: Informática y Sistemas
|
|
En la lista aclararon que se debe usar el assert y NO el assertTrue
|
|
|
|
|
|
|
|
|
|