UTNianos

Versión completa: [Paradigmas] Duda ejercicio objetos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, quisiera saber porque cuando uso este metodo asi:



esAgresiva:persona
^celulasAmenazadas > persona cantidadCelulas * 0.1.



me dice que no entiende el mensaje "false"

y cuando lo uso asi:



esAgresiva:persona
^persona cantidadCelulas * 0.1 < celulasAmenazadas.



anda perfecto. Esa duda es la que tengo. Saludos y gracias !!

celulasAmenazadas es una variable de clase.

cantidadCelulas es un metodo que devuelve la cantidad de celulas de una persona.
Hola,

tiene que ver con la precedencia del lenguaje Smalltalk.

Las reglas de precedencia para el envío de mensajes son:
- siempre se va de izquierda a derecha
- después los mensajes unarios (por ejemplo, cantidadCelulas)
- después los mensajes binarios (por ejemplo, * y <)
- después los mensajes de palabra clave (por ejemplo, esAgresiva=)

Los paréntesis sirven para forzar una ejecución particular, los agregué yo para explicitar el orden de ejecución en tus dos ejemplos



esAgresiva:persona
^(celulasAmenazadas > (persona cantidadCelulas)) * 0.1



Los mensajes se envían en el siguiente orden
- el objeto referenciado por persona recibe cantidadCelulas (suponete que devuelve el objeto X)
- el objeto referenciado por celulasAmenazadas recibe el mensaje > con el argumento X (supone que todo eso devuelve el objeto booleano B)
- finalmente, el objeto B recibe el mensaje * con el argumento 0.1
- como B es un booleano (true o false) no entiende el mensaje * y se rompe

En tu otro ejemplo



esAgresiva:persona
^((persona cantidadCelulas) * 0.1) < celulasAmenazadas.



Los mensajes se envían en el siguiente orden
- el objeto referenciado por persona recibe cantidadCelulas (suponete que devuelve el objeto X)
- el objeto X recibe el mensaje * con el argumento 0.1 (supone que todo eso devuelve el objeto Y)
- finalmente, el objeto Y recibe el mensaje < con el objeto reverenciado por la variable celulasAmenazadas como argumento

En resumen, si querés mantener el primer ejemplo, tenés que agregar un par de paréntesis para que funcione



esAgresiva:persona
^celulasAmenazadas > (persona cantidadCelulas * 0.1)



Saludos,
El error debe ser "false no entiende el mensaje *".

Acordate las reglas de precedencia: primero los mensajes unarios (los que no tienen parámetros), después los binarios (los que son chirimbolitos), y por último los de palabra clave. Dentro de la misma categoría, va todo de izquierda a derecha.

En tu caso, primero haría "persona cantidadCelulas", que va a dar un número. Y la línea a evaluar quedaría: "^celulasAmenazadas > 42 * 0.1" (asumiendo que devolvió 42).

Todo lo que quedan ahí son mensajes binarios, entonces va de izquierda a derecha: primero resuelve celulasAmenazadas > 42, y evidentemente eso le da false. Entonces ahora tiene "^false * 0.1", y, buen, false no entiende *.

En tu segundo caso, aplicando esto que te cuento, fijate que tiene sentido que funcione.

¿Qué le faltaría a tu primer versión para que ande como esperás? ¿Cómo te quedaría esa línea?


De todos modos, estamos en PdeP, queremos programar bien. Si cuesta tanto entender esa línea de código, probablemente sea un buen momento para pensar que te están faltando abstracciones. "persona cantidadCelulas * 0.1" pareciera representar algo en tu dominio: ¿por qué no hacer un método nuevo que resuelva eso? Y entonces una persona sería agresiva cuando la [nombre de tu nuevo método] de esa persona fuera menor a la cantidad de celulas amenazadas. Sin saber tu dominio, me arriesgo a nombres como "nivelDeCelulasCritico" o algo por el estilo.

¡Salutes!
Gracias a los dos por las respuestas. Creo que me perdi esa clase. Tiene algun apunte que explique estas cosas teoricas de smalltalk?
Yo justo me puse a hacer este ejercicio ayer, es el de Dr house no? mañana me pongo con la segunda parte.

Fijate que hay una wiki que explica todo, creo que es uqbar o algo asi, buscala.
URLs de referencia