Hola, cómo están?
Tengo un problema con el TP 0, tengo el tema 2 de películas.
El tema es que yo tengo que ir agregando diferentes puntajes para cada película, y decidí hacerlo todo desde la clase PelisRankings, utilizando un diccionario con:
Clave: Nombre de la película, Valor: Una colección de los puntajes para cada película.
El problema está en que no puedo lograr una colección diferente por cada película. O sea crea una única colección que se llena con todos los datos, sin importar la película, o se crea una nueva lista cada vez que se llama a calificarPelicula, por lo que no logro hacer el promedio, si no que solo está el último puntaje agregado para cada película.
Hola Nicolás:
En situaciones como esta te conviene realizar pruebas más pequeñas y acotadas sobre el Playground para poder ir acostumbrándote al manejo de las colecciones de Pharo y poder encontrar la solución antes de aplicarlo directamente al TP.
Para realizar lo que proponés debés simplemente verificar que exista la clave en tu diccionario y acceder siempre a la colección correspondiente a esa clave, tal cual como hacías con los diccionarios en Python.
En Pharo los diccionarios entienden un mensaje que se llama at:ifAbsentPut:
que recibe dos parámetros. El primero es la clave que va a buscar y, en caso de encontrarla devuelve el valor asociado a esa clave e ignora lo que se haya pasado
por segundo parámetro. En caso de que la clave no exista, la crea y pone al objeto pasado por segundo parámetro como su valor asociado.
Te dejo el siguiente código a modo de ejemplo:
| unDiccionario coleccion |
Transcript clear.
unDiccionario := Dictionary new.
" Agrego una nueva asociación clave-valor sabiendo que la clave 'Juan' no existe "
unDiccionario at: 'Juan' put: (OrderedCollection new).
" Obtengo el la colección asociada a la clave 'Juan' sabiendo que ya existe "
coleccion := unDiccionario at: 'Juan'.
coleccion add: 3.
" Busco el valor de la clave 'Maria' y si no existe le pongo una OrderedColecction "
coleccion := unDiccionario at: 'Maria' ifAbsentPut: (OrderedCollection new).
coleccion add: '4'.
coleccion := unDiccionario at: 'Juan'.
coleccion add: 5.
coleccion := unDiccionario at: 'Maria'.
coleccion add: 6.
unDiccionario associationsDo: [ :asociacion |
Transcript show: (asociacion key); show: ' -> '.
(asociacion value) do: [ :elemento | Transcript show: elemento; show: ' ' ].
Transcript cr.
]
Te recomiendo copiar este código en el Playground, ejecutarlo y verificar qué obtenés impreso en el Transcript para entender qué sucede.
Por otro lado, aprovecho para mencionar que, si bien para el alcance del TP0 está bien utilizar un diccionario para eso y que hayas hecho que toda la lógica esté en la clase PelisRankings, para el TP1 esto se considerará como un error muy grave y significará la desaprobación automática del TP, dado que viola los conceptos de encapsulamiento y delegación que se vieron esta semana en clase (ilustrados por el ejemplo de la Máquina expendedora de bebidas). Para el TP0 no te preocupes porque el objetivo era simplementa familiarizarte con el entorno y la sintaxis de Pharo y amigarse con el libro Pharo By Example, pero después de lo visto en esta semana ya debería hacerte un poco de ruido que quieras meterle toda la responsabilidad a una sola clase.
Saludos,
Tomás