3.2 Explorar POO desde el Browser

En la Figura 2.1 del Browser, debajo del panel de clases, hay tres botones:

Observa el amplio panel de texto debajo de estos tres botones, que proporciona información contextual sobre el elemento seleccionado.

Una vez más, los métodos de clase se aplican a la propia clase. Los métodos de instancia se aplican a todas las instancias modeladas por la clase. Hemos visto anteriormente que la clase Fraction tiene un método #numerator:denominator: que se utiliza para obtener una nueva instancia de Fraction. Solo hay un objeto de clase Fraction. Los mensajes como #squared y #abs se envían a cualquier instancia de Fraction, de las que hay muchas.

Hasta ahora, hemos intentado ser muy cuidadosos con las definiciones, pero ya sabes que cuando decimos «una fracción» nos referimos a «una instancia de la clase Fraction». A partir de aquí, nuestro lenguaje será más informal.

 CuisLogo Cuando se selecciona la clase Float, ¿qué información proporciona el panel de texto?

Ejercicio 3.1: Información de la clase Float

Hemos dedicado mucho tiempo a este tema porque es importante evitar la confusión entre los métodos de instancia y los métodos de clase. Consideremos la clase Float como ejemplo.

Métodos de clase. En la Figura 3.1 los métodos listados son del lado de la clase, con el botón class pulsado en el Browser, se puede ver esta lista.

ch03-floatClassSide

Figura 3.1: Métodos de clase en Float

Desde un Workspace, estos métodos se llaman con el nombre del mensaje directamente a la clase:

Float e
⇒ 2.718281828459045
Float epsilon
⇒ 2.220446049250313e-16
Float fmax
⇒ 1.7976931348623157e308

 note Habrás notado que el texto que escribes en el espacio de trabajo se colorea y resalta según lo que escribes. Hablaremos de esto más adelante, cuando tratemos el lenguaje Smalltalk, pero la idea es que resulte útil. Si empiezas a escribir una palabra que el espacio de trabajo de Cuis conoce, puedes pulsar la tecla tab y obtendrás un conjunto de opciones para completar la palabra. Prueba a escribir Float epsi y pulsa la tecla tab. A continuación, pulsa la tecla enter y deberías ver Float epsilon. Haz clic en cualquier otro lugar del espacio de trabajo para que desaparezca este menú.

Sin embargo, no se puede enviar un mensaje de clase a una instancia de Float, ya que se produce un error y se abre la ventana roja del depurador. Por ahora, basta con cerrar la ventana del depurador para ignorar el resultado.

3.14 pi
⇒ MessageNotUnderstood: SmallFloat64>>pi
Float pi e
⇒ MessageNotUnderstood: SmallFloat64>>e

Con frecuencia, estos métodos de clase se utilizan para acceder a valores constantes, como se ve en el ejemplo anterior, o para crear una nueva instancia:

OrderedCollection new
⇒ Create a new empty ordered collection
Fraction numerator: 1 denominator: 3
⇒ 1/3 "a fraction instance"
Float new
⇒ 0.0
Float readFrom: '001.200'
⇒ 1.2 
Integer primesUpTo: 20
⇒ #(2 3 5 7 11 13 17 19) 

Métodos de instancia. En la Figura 3.2, los métodos listados son los de la parte instancia, con el botón instance pulsado en el Browser, aparece esta lista.

ch03-floatInstanceSide

Figura 3.2: Métodos de instancia en Float

En un Workspace, estos métodos se llaman con el nombre del mensaje enviado directamente a una instancia:

-10.12 abs ⇒ 10.12
3.14 cos ⇒ -0.9999987317275395
-10.12 * 2 ⇒ -20.24

Los mensajes a métodos de instancia no se pueden enviar directamente a una clase, necesitas primero instanciar un objeto:

Float cos
⇒ MessageNotUnderstood: Float class>>cos
Fraction squared
⇒ MessageNotUnderstood: Fraction class>>squared
OrderedCollection add: 10
⇒ MessageNotUnderstood: OrderedCollection class>>add:

Por supuesto, puedes mezclar tanto métodos de clase como de instancia, mientras envíes el mensaje correcto a la clase o la instancia:

Float pi cos
⇒ -1.0
Float e ln
⇒ 1.0 
(Fraction numerator: 4 denominator: 5) squared
⇒ 16/25
OrderedCollection new add: Float pi; add: Float e; yourself
⇒ an OrderedCollection(3.141592653589793 2.718281828459045) 

Otro ejemplo desde Spacewar! mezclando métodos de clase e instancia. Este trozo de código actualiza la orientación de un torpedo de acuerdo con su vector de velocidad:

self rotation: (velocity y arcTan: velocity x) + Float halfPi

Ejemplo 3.2: Alineando un torpedo con su dirección de velocidad

Con esta breve introducción al browser del sistema estás preparado para explorar el sistema de clases.