P. 1
Manual de Smalltalk

Manual de Smalltalk

|Views: 5,990|Likes:
Published by Caca Popo

More info:

Published by: Caca Popo on Aug 28, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

08/15/2013

pdf

text

original

Sections

  • Capítulo 1: Un Vistazo al Paradigma de Objetos
  • Capítulo 2: Objetos, Clases y Mensajes
  • Capítulo 3: Instrucciones Smalltalk
  • Capítulo 4: Operaciones con Datos
  • Capítulo 5: Herencia
  • Capítulo 6: Colecciones

Manual de Smalltalk

Desarrollo y ejemplificación de los conceptos del Paradigma de Objetos

Paradigmas de Programación Facultad Regional Buenos Aires Universidad Tecnológica Nacional

Ing. Lucas Spigariol

Manual de Smalltalk - Ing. Lucas Spigariol

Contenido
Capítulo 1: Un Vistazo al Paradigma de Objetos
¿Qué es la Programación Orientada a Objetos? Conceptos centrales del Paradigma de Objetos Smalltalk

Capítulo 2: Objetos, Mensajes y Clases
Objetos y Clases Envío de Mensajes Métodos de clase Self

Capítulo 3: Instrucciones Smalltalk
Instrucciones Asignación Devolución de Valores Comentarios Variables Temporales Estructura Básica de un Método Bloques Mensajes en Cascada

Capítulo 4: Operaciones con Datos
Literales Operaciones Aritméticas Nil True y False Comparaciones Lógicas Lógica Condicional Iteraciones

Capítulo 5: Herencia
¿Qué es la herencia? Herencia de Métodos Herencia de Variables Variables de Clase Clases Abstractas Super vs. Self

Capítulo 6: Colecciones
¿Qué es una Colección? Colecciones Comunes Mensajes a las Colecciones Colecciones Especiales

Glosario

Página 2

Manual de Smalltalk - Ing. Lucas Spigariol

Capítulo 1: Un Vistazo al Paradigma de Objetos
¿Qué es la Programación Orientada a Objetos?
La Programación Orientada a Objetos (POO) es diferente de los lenguajes de programación procedurales (C, Cobol, Pascal, etc.). Todo en POO está conceptualizado como "objetos" (ver Abstracción de datos). La POO, definida en su más puro sentido, es implementada por el envío de mensajes a los objetos. Para entender este concepto, primero debemos conocer qué es un objeto.

¿Qué es un Objeto?
Un objeto puede ser considerado una "cosa" que puede realizar un conjunto de actividades. El conjunto de actividades que un objeto puede realizar define el comportamiento del objeto. Por ejemplo, un objeto "EstadoAlumno" puede informarle su promedio, año de escuela, etc.; o puede agregar una lista de las materias cursadas. Un objeto "Alumno" puede informarle su nombre o su dirección. La interfase del objeto consiste en un conjunto de comandos, cada comando desarrolla una acción específica. Un objeto puede pedirle a otro objeto que realice una acción, enviándole un mensaje. El objeto que envía el mensaje es designado emisor y el objeto que recibe el mensaje es designado receptor.

Página 3

En este caso. El nuevo nombre es pasado como un argumento en el mensaje. Un objeto receptor siempre devuelve un valor al objeto emisor. El objeto receptor Alumno devuelve su nombre al objeto emisor. Por ejemplo. luego el control regresa al objeto emisor.Ing. útil al objeto emisor.Manual de Smalltalk . un objeto Escuela le pide al objeto Alumno su nombre enviándole un mensaje preguntándole por su nombre. Un mensaje también puede contener información que los objetos emisores necesitan pasar al objeto receptor. Esto lo hace enviando al objeto Alumno un mensaje para cambiar su nombre a uno nuevo. Este valor devuelto puede ser. o no. al objeto Escuela no le interesa el valor que devuelva el mensaje. Lucas Spigariol El control le es dado al objeto receptor hasta que complete la acción. Página 4 . Por Ejemplo. a esta información se la llama argumento de un mensaje. el objeto Escuela ahora desea cambiar el nombre del alumno.

el Objeto A envía un mensaje al Objeto B. lleva a cabo cada mensaje. Observe el siguiente diagrama. El Objeto D devuelve el control al Objeto C. Asimismo el Objeto C envía otro mensaje al Objeto D. para completar su tarea. Un objeto tiene tantos métodos como acciones se desea que tenga.Manual de Smalltalk . Por ejemplo. El nombre del mensaje. asimismo el Objeto C devuelve el control al Objeto B que. En otras palabras. el mensaje nombre pasa el control al método nombre definido en Alumno. El control no es devuelto al Objeto A hasta que todos los otros mensajes se han completado. El código que está asociado a cada mensaje se llama método. nombre:. Cuando el objeto Alumno recibe el mensaje nombre. Cuando un objeto recibe un mensaje. ya sea al mismo u otros objetos. Método ¿Cómo los objetos receptores interpretan los mensajes de los objetos emisores? ¿Cómo se procesan los mensajes? Cada mensaje posee un código asociado a él. estos mensajes determinan el comportamiento de un objeto y el código determina cómo.Ing. lo devuelve al Objeto A. Para que el Objeto B procese este mensaje. direccion y nombre:direccion: son nombres de métodos para el objeto Alumno. nombre. a su vez. Lucas Spigariol Operación Secuencial Es muy común que un mensaje provoque el envío de otros mensajes. El control no le será devuelto al objeto emisor original hasta que todos los otros mensajes hayan sido completados. determina qué método es el solicitado y pasa el control al método. envía otro mensaje al Objeto C. su código es ejecutado. Página 5 . también suele llamarse el nombre del método debido a su asociación con el método. Cuando un objeto recibe un mensaje. A esto se lo llama operación secuencial. el siguiente diagrama. el objeto.

y los mensajes que invocan métodos de instancia se llaman mensajes de instancia. Estas variables son llamadas variables de instancia. directamente. A esto se lo llama encapsulamiento y asegura que el proceso para obtener los datos de un objeto sea seguro. procedimientos o funciones que se encuentran en los lenguajes procedurales (C. por sí mismo. Sólo el método de instancia de un objeto puede referirse y modificar los valores guardados en las variables de instancia.Manual de Smalltalk . Los métodos de instancia de los objetos no pueden referirse a los datos de otros objetos. Pascal). Observe el siguiente diagrama. Los métodos son similares a las subrutinas. El envío de mensajes a objetos es similar al llamado de subrutinas. Por ejemplo. Página 6 .Ing. El emisor no puede referirse a las variables. y el código del método equivale al código de la subrutina. un nombre de método equivale al nombre de una subrutina. Algunos objetos también contienen variables que soportan su comportamiento. Un objeto sólo puede acceder a los datos de otro objeto enviándole mensajes. Datos de un Objeto Cada objeto necesita guardar la información sobre cómo realizar su comportamiento definido. las variables de instancia variableUno hasta variableX sólo pueden ser accedidas por el emisor a través de los métodos de instancia métodoUno hasta métodoN. Lucas Spigariol Los métodos que operan sobre objetos específicos son los métodos de instancias.

Manual de Smalltalk . Si un tipo particular de problema ha sido resuelto utilizando la POO. Sólo el objeto que "posee" los datos puede cambiar su contenido. un problema similar. y carrera así como también las variables de instancia nombre. dirección.Ing. dirección. y encapsulamiento. Una de las características más importantes de la programación orientada a objetos es la habilidad para modificar las soluciones existentes para resolver nuevos problemas. puede ser resuelto haciendo algunos cambios en el protocolo del objeto-mensaje ya existente. Otros objetos pueden ver o cambiar estos datos enviando mensajes al "dueño". Por ejemplo. Conceptos centrales del Paradigma de Objetos Un lenguaje de computación está orientado a los objetos si soporta las cuatro propiedades específicas de los objetos. y carrera. Smalltalk distingue entre los identificadores de variables y los identificadores de métodos a través de la posición que ocupan en la expresión. aunque diferente. Lucas Spigariol A diferencia de la programación procedural. La mayoría del tiempo. La correcta aplicación de estos conceptos permite obtener un alto nivel de reutilización de las soluciones. donde las áreas de datos de uso común son utilizadas para compartir información. Página 7 . esto requiere agregar nuevos mensajes. En otros casos puede requerir agregar nuevos objetos y nuevos mensajes a los que responden los nuevos objetos. llamadas abstracción. herencia. la programación orientada a objetos no aprueba el acceso directo a los datos de uso común (exceptuando el uso de las variables globales) por otros programas. Los nombres de variables de instancia pueden ser idénticos a los nombres de los métodos que están asociados a ellos. polimorfismo. el objeto Alumno tiene los métodos nombre.

Por ejemplo. probablemente. de su comportamiento. cualquier cambio interno a la implementación es transparente al usuario. Si bien los lenguajes procedurales también pueden ser reutilizados. Esto permite al programador separar la implementación de un objeto. la interfase encapsula los datos y código de un objeto. los objetos interactúan entre ellos a través de los mensajes. El programador puede cambiar la implementación en cualquier momento. Página 8 . Lo único que un objeto conoce de otro es su interfase. Los datos y lógica de un objeto están ocultos a los otros objetos. los lenguajes de Objetos hacen la reutilización no sólo mucho más fácil.Manual de Smalltalk . Encapsulamiento En la programación orientada a objeto.Ing. A través de esta interfase un objeto emisor se comunica con otro objeto receptor. la más importante característica del paradigma orientado de Objetos. pero el mensaje nombre aún debería trabajar ya que la interfase es la misma. pero el objeto emisor desconoce la forma en que se lleva a cabo la acción solicitada (mensaje). sino que la consideran como intrínseca de la configuración del lenguaje. Esta separación crea una "caja negra" en donde el usuario está alejado de los cambios de la implementación. O sea. si el mensaje nombre es enviado al objeto Alumno. Mientras la interfase permanezca igual. Abstracción de Datos La abstracción de datos permite diferenciar entre el comportamiento de un objeto (la acción que es capaz de realizar) y cómo lleva a cabo este comportamiento. Esta abstracción de datos se implementa a través de una interfase de objeto. al usuario no le importa cómo el programador implementó el código que maneja este mensaje. Lucas Spigariol La reutilización es.

Una analogía del polimorfismo con la vida diaria es cómo los alumnos responden al timbre de la escuela. sin embargo. Todos los alumnos conocen el significado del timbre. Cada objeto que puede ser impreso debe conocer como imprimirse. Suponga que existe un método printPage en un objeto Documento que tiene la responsabilidad de imprimir una página. Sólo el objeto receptor se preocupa de ello. pero su respuesta puede ser diferente. Para imprimir una página. su protocolo es el mismo que el mensaje nombre del objeto Alumno. Lucas Spigariol Polimorfismo Otro beneficio que surge al separar la implementación del comportamiento es el polimorfismo. Este método sigue enviando el mensaje print y el nuevo objeto provee su propio método print en respuesta a ese mensaje. siempre y cuando el objeto receptor soporte los mensajes. Cada alumno responde al timbre. Algunos alumnos irán a casa. pero la implementación sobre qué deben hacer para imprimirse a sí mismos varía. El objeto Documento no necesita conocer qué tipos de objetos están en la página. sólo que cada uno soporta el comportamiento de la impresión.Manual de Smalltalk . Aunque la implementación de este mensaje nombre devolvería el número de curso y su nombre. Página 9 . Otro ejemplo del polimorfismo es la función de imprimir. y otros irán a clases. El objeto emisor no necesita conocer cómo el objeto receptor implementa el mensaje.Ing. El mensaje es el mismo a todos los diferentes objetos: print. el método printPage envía el mensaje print a cada objeto de página. Un método llamado nombre también podría ser implementado en un objeto de la clase Curso. tiene su propio significado para cada alumno (objeto). El polimorfismo permite al objeto emisor comunicarse con los objetos receptores sin tener que comprender qué tipo de objeto es. Cuando el timbre (mensaje) suena. Nuevos objetos pueden ser agregados a la página sin afectar el método printPage. El polimorfismo permite a un objeto emisor comunicarse con diferentes objetos de una manera consistente sin tener que preocuparse sobre las diferentes implementaciones de un mensaje. El polimorfismo permite a dos o más objetos responder al mismo mensaje. otros a la biblioteca.

Suponga la siguiente aplicación. La herencia permite a una clase tener el mismo comportamiento que otra y extender o limitar ese comportamiento para proveer una acción especial a una necesidad específica. carrera. y ambas heredan el comportamiento de Alumno. es llamada superclase. La clase Graduado y la clase SinGraduar tienen comportamiento similar. Alumno es una superclase de Graduado y SinGraduar. Ambas clases Graduado y SinGraduar se vuelven subclases de la clase Alumno. Este modelo soporta la herencia. Por ejemplo. Smalltalk Smalltalk es un modelo puro orientado a objetos lo que significa que todo. es tratado como un objeto. como por ejemplo. el comportamiento es colocado en una nueva clase llamada Alumno. la clase SinGraduar puede querer conocer cómo un cierto alumno va en la carrera. Las distintas versiones de Smalltalk presentan completos entornos de desarrollo para la implementación de aplicaciones orientadas a objetos. promedio. Lucas Spigariol Herencia Otro concepto importante de la programación orientada a objetos es la herencia. el manejo de nombre. dirección. La clase.Manual de Smalltalk . etc. Graduado y SinGraduar son subclases de Alumno. es un extenso programa de entorno de desarrollo con numerosos clases y métodos. Entre todos los lenguajes orientados a objetos. Graduado puede ser tanto para un doctorado o una carrera de postgrado. En vez de colocar este comportamiento en ambas clases. Smalltalk es el más consistente en cuanto al manejo de las definiciones y propiedades del paradigma orientado a objetos. Las clases que heredan de otras clases se llaman subclases. el comportamiento de Página 10 .Ing. En el ejemplo. Los Smalltalk más comunes y simples de utilizar consisten de los siguientes componentes: • Un modelo de objeto a partir del cual los objetos están definidos: El modelo de objeto define cómo se comportan los objetos. en el entorno. Smalltalk es más que un lenguaje. Ambas clases Graduado y SinGraduar pueden agregar comportamiento adicional que sea único a ellas. Por otro lado. de la que una subclase hereda.

Esto permite una mejora en la productividad. incluyendo la habilidad de poder realizar seguimientos.Ing. modificar datos. y realizar cambios al código en tiempo de ejecución de un programa.Manual de Smalltalk . también se encargan de la definición y manejo de las clases. Un conjunto de herramientas de desarrollo: Estas herramientas habilitan a los usuarios a mirar y modificar las clases existentes. y borrar clases. Estas clases proveen las funciones básicas en Smalltalk. También proveen detección de errores a nivel fuente. Existe un núcleo de clases estándar compartidas por los más conocidos fabricantes. Los cambios realizados al código fuente son reflejados instantáneamente en la aplicación que se está ejecutando. observar datos. Smalltalk contiene un gran conjunto de objetos que pueden ser utilizados directamente. Un entorno en tiempo de ejecución: Esto permite a los usuarios a ejecutar un programa en Smalltalk mientras se cambia el código fuente. y las colecciones. el manejo de mensajes. y una calidad en la zona de trabajo. Lucas Spigariol • • • clases e instancias. o fácilmente modificados para satisfacer la necesidad de una aplicación en general. a la que se agregan otras clases que permiten realizar funcionalidades específicas. Un conjunto de clases reutilizables: Smalltalk tiene una gran cantidad de clases que pueden ser reutilizadas en cualquier programa Smalltalk. Página 11 . además del soporte para la portabilidad a diferentes plataformas. agregar nuevas clases. la asociación dinámica (binding dinámico). renombrar clases. Una de las mejores características de Smalltalk es el alto grado de reutilización. Lo objetos suelen ser utilizados en más de una aplicación. incluyendo la portabilidad de las interfaces gráficas de usuario.

Manual de Smalltalk .Ing. Programar en Smalltalk consiste en crear nuevas clases. se clasifican juntos en lo que se denomina una Clase. Los objetos que responden a los mismos mensajes con el mismo comportamiento y que tienen la misma estructura interna de datos. Objetos y Clases Existen muchos objetos en el entorno Smalltalk. Sin entrar en detalles de las implementaciones es importante tener en cuenta que una clase. que es una instancia de una clase llamada Metaclase. Los métodos que están definidos en una Clase determinan el comportamiento de los mensajes de esa clase Una expresión general en Smalltalk consiste en el nombre del objeto que recibe el mensaje. y de palabra clave. en su esencia. seguido del nombre del mensaje y sus argumentos (si los tuviera). Clases y Mensajes Presentación sintética: • • • Todo el procesamiento de Smalltalk consiste en el envío de mensajes a objetos. crear instancias de clases. binarios. también es un objeto y en consecuencia también se comporta como tal. incluyendo la definición de una clase. En Smalltalk todo es un objeto. Los tres tipos de mensajes son: unarios. y especificar una secuencia de intercambios de mensajes a través de todos estos objetos. Es la Clase la que determina como es y cómo actúa cada objeto. Lucas Spigariol Capítulo 2: Objetos. Todo Objeto es instancia de alguna clase en particular. Creación de una Clase Página 12 .

Con estos cambios. ¿Cómo aparecerá en el examinador?. Solicite agregar una nueva clase. cruces. Cuando se le pida ingrese el nombre de la nueva clase. etc. de la siguiente manera: Object subclass: #TrenElectrico instanceVariableNames: ' ' classVariableNames: ' ' poolDictionaries: ' ' Las variables de instancia se agregan por medio del ingreso de sus nombres entre las comillas simples. Cuando termine. usando uno de los examinadores (browsers) de clases o aplicaciones. vías. Ahora puede ser modificada para cambiar y extender la clase. Object subclass: #TrenElectrico instanceVariableNames: 'motor carros casas vías cruces ' classVariableNames: ' ' poolDictionaries: ' ' Si la nueva clase TrenElectrico tuviera uno o muchos diccionarios compartidos y/o variables de clase. Esta expresión fue utilizada para crear la clase. se agregarán de la misma forma que antes. Lucas Spigariol Las clases son creadas en el entorno de desarrollo. el examinador presentará lo siguiente: Object subclass: #TrenElectrico instanceVariableNames: 'motor carros casas vías cruces' classVariableNames: ' DiagramaDeVías ' poolDictionaries: ' Trenes ' Página 13 .Manual de Smalltalk . Tenga en cuenta que los cuatro pasos aquí descritos pueden variar levemente para cada plataforma particular de Smalltalk. son los siguientes: • • • • Seleccione la clase que será "padre" o superclase de la nueva clase. todo lo necesario para armar un circuito por donde pasa el tren eléctrico. Cuando se le pida el tipo de subclase. Los pasos a seguir. que se encuentran después de instanceVariableNames:. Para ver un ejemplo concreto de la creación de una clase suponga que la expresión para una nueva clase es TrenElectrico. entre las comillas simples que siguen a poolDicionaries y a classVariableNames.Ing. un juego compuesto por los trenes. seleccione subclase. no olvide que la primera letra del nombre debe estar en mayúscula. respectivamente.. la ventana del examinador mantendrá una expresión en el área de texto.

Los métodos dan los detalles de implementación para los mensajes. las palabras extras comienzan con una letra en mayúscula. Los nombres de mensajes comienzan con una letra en minúscula y pueden tener cualquier combinación de letras y números sin espacios en blanco. unObjeto unNumero: 1 unNombre: 'Pedro' Existen tres tipos de mensajes: unarios. todos los nombres de clases comienzan con una letra en mayúscula. como por ejemplo "Alumno". es tratar de reutilizar los mensajes y objetos existentes. Sin embargo se trata de acortar los nombres de mensajes. Un nombre válido de mensaje podría ser "unMensaje" o "miDirección.Manual de Smalltalk . y representan el comportamiento de la clase. Lucas Spigariol Envío de Mensajes Los mensajes a los que un objeto puede responder están definidos en el protocolo de su clase. como los mensajes de palabra clave.Ing. Por ejemplo: unObjeto unMensaje Para aquellos mensajes que necesitan pasar argumentos al objeto receptor. seguido por el nombre del mensaje. una expresión Smalltalk consiste en el nombre del objeto que recibe el mensaje. por lo tanto el nombre de mensaje adecuado sería "nombre". trabaja para desarrollar una secuencia objeto-mensaje que proveerá la solución deseada. El programador de Smalltalk. Por convención. Formato de un Mensaje En general. El cómo estos mensajes se ejecutan o son implementados está definido en los métodos de la clase. pues es muy difícil trabajar con nombres largos. Un enfoque inicial de la resolución de problemas. en Smalltalk. Los argumentos se separan por medio de un espacio en blanco." Un mensaje como "dame tu nombre" podría ser "dameTuNombre". al nombre del objeto receptor le sigue el nombre del mensaje y su argumento. Todo el procesamiento de Smalltalk se realiza por medio del envío de mensajes a objetos. binarios y de palabra clave. Cuando el nombre de un mensaje contiene más de una palabra. Página 14 .

Mensajes de Palabra Clave Un mensaje de Palabra Clave es equivalente a una llamada de un procedimiento con dos o más parámetros. se escribe primero. 'Date'. lógicas y de comparación. unObjeto unMensaje: parametro Página 15 . '5'. Un mensaje binario puede ser de uno o dos caracteres de longitud y puede contener cualquier combinación de los siguientes caracteres especiales: +/\*~<>=@%|&?!. y devuelve true (verdadero) o false (falso)" El primer ejemplo puede también ser interpretado como "el mensaje '+' se envía al objeto 'a' con el parámetro 'b'". el nombre del objeto. Lucas Spigariol Mensajes Unarios Un mensaje Unario es similar a la llamada de una función con parámetro único. luego el nombre del mensaje (o nombre del método) y luego el parámetro que se pasa. Los objetos se colocan antes del nombre del mensaje. 'factorial'.Manual de Smalltalk . y 'hola' son objetos y 'sin'. Lo siguientes son ejemplos de expresiones en Smalltalk. y 'outputToPrinter' son nombres de mensajes. Observe el siguiente ejemplo. Este tipo de mensaje consiste de un nombre de mensaje y un operando. 'tomorrow'. Los siguientes son ejemplos de mensajes unarios: x sin Date tomorrow 5 factorial 'hola' outputToPrinter "devuelve el resultado de sen(x)" "devuelve una nueva instancia de la clase Date" "devuelve el factorial de 5" "Envía la cadena 'hola' a la impresora" En estos ejemplos 'x'. utilizando mensajes binarios: a+b "devuelve la suma de a y b" a|b "devuelve la comparación lógica a o b" a >= b "compara si a es mayor o igual que b. al cual el mensaje es enviado.Ing. Mensajes Binarios Los mensajes Binarios son utilizados para especificar operaciones aritméticas.

luego los mensajes binarios. Smalltalk reemplaza el nombre de la variable con el objeto al que ella apunta. los mensajes unarios se ejecutan primero. independientemente de las operaciones que realicen. 4. 3. 5. el nombre del mensaje debe aparecer para cada parámetro. Lucas Spigariol Los dos puntos (:) son una parte esencial del nombre del mensaje. puede resumirse en los siguientes pasos: 1. siempre de izquierda a derecha. Cuando hay más de un parámetro. Página 16 .Manual de Smalltalk . El resultado de un mensaje reemplaza al mensaje en la sentencia. Una expresión puede incluir el nombre de una variable. y finalmente los mensajes de palabra clave. Por ejemplo: unObjeto unNombre1: parametro1 unNombre2: parametro2 o o o o o unObjeto es el objeto receptor unNombre1: es la primera parte del nombre del mensaje parametro1 es pasado a unNombre1: unNombre2: es la segunda parte del nombre del mensaje parametro2 es pasado a unNombre2: "Establece los datos privados UnDia a month = esteMes y year = "Establece el valor de las instancia del objeto Alumno a los parámetros" de unDia month: esteMes year: esteAnio del objeto esteAnio" alumno nombre: 'Juan' direccion: 'Junín 51' variables de acuerdo Orden de Ejecución de los Mensajes Las reglas que usa Smalltalk en la decisión del orden de ejecución de los mensajes.Ing. 6. comenzando por la izquierda. Esto significa que no hay un orden especial para ejecutar operaciones aritméticas. Smalltalk ejecuta primero todas las expresiones que aparecen entre paréntesis. 2. Smalltalk ejecuta mensajes de izquierda a derecha. y por aquella que está más anidada. Smalltalk ejecuta todos los mensajes binarios de izquierda a derecha. Dentro de una expresión.

Por ejemplo: miAlumno nombre: 'Luis' miAlumno nombre Self Considere la siguiente sentencia: miAlumno nombre: 'Pedro' direccion: 'Medrano 951' La sentencia envía el mensaje name:address: al objeto Alumno apuntado por la variable miAlumno.Ing. En vez de duplicar el código que ya existe en los métodos nombre: y direccion:. debe existir alguna forma para que un método pueda referirse al objeto en el cual existe. Los métodos de clase proveen un comportamiento de clase. es poder crear nuevas instancias de una clase. Una vez ejecutada la sentencia de arriba. la expresión := es la sintaxis para la función de asignación. El mensaje new retorna una nueva instancia. Página 17 . Uno de los principales usos de los métodos de clase. La variable de la izquierda apunta al resultado de la expresión de la derecha. Tienen las mismas convenciones de nombramiento que los métodos de instancia. la variable miAlumno apunta al nuevo objeto Alumno: miAlumno := Alumno new En Smalltalk. Alumno new En el siguiente ejemplo. que apunta a una instancia del objeto Alumno. el método nombre:direccion: se implementa ejecutando los métodos nombre: y direccion:. los mensajes pueden ser enviados a miAlumno.Manual de Smalltalk . Cada clase contiene el mensaje new. Lucas Spigariol Métodos de clase Un método de clase es la implementación de un mensaje cuyo receptor es la clase misma. La siguiente instrucción envía el mensaje de clase new a la clase Alumno. Dado que nombre: y direccion: son métodos del mismo objeto que nombre:direccion:.

Lo mismo se aplica a la obtención de los contenidos de una variable. El alcance de las variables temporales de un método es local. Página 18 . la misma instancia que recibió el mensaje nombre:direccion:. el método nombre: podría también implementarse de la siguiente manera: nombre: nombreAlumno nombre := nombreAlumno El método nombre:direccion: podría elegir directamente asignar el valor a las variables. No hay ninguna relación entre estos nombres y no están obligados a ser los mismos. Un método puede acceder otros métodos en su propio objeto especificando self como el receptor del mensaje.Manual de Smalltalk . self direccion: unaDireccion El uso de self hace que Smalltalk envíe los mensajes nombre: y direccion: a la instancia actual de Alumno. Observe el código para estos tres métodos: nombre: unNombre nombre := unNombre direccion: unaDireccion direccion := unaDireccion nombre: unNombre direccion: unaDireccion self nombre: unNombre. En el ejemplo. Por ejemplo. Esto se implementaría de esta forma: nombre: unNombre direccion: unaDireccion nombre := unNombre. o sea sólo en ese método. Lucas Spigariol Este es el propósito de self. en vez de usar lo métodos nombre: y direccion:. los métodos nombre: y direccion: definieron sus variables temporales con el mismo nombre que las definió el método nombre:direccion:. direccion := unaDireccion Sin embargo es mejor centralizar la asignación de variables dentro de un método simple.Ing.

Manual de Smalltalk . excepto la última instrucción. Asignaciones: apunta la variable a la izquierda de := al valor de retorno de la instrucción de la derecha. el código ejecutable está formado por instrucciones. la instrucción se ejecuta de acuerdo al orden de ejecución de los mensajes discutido en el capítulo anterior Página 19 . además de contener mensajes. Una instrucción de Smalltalk. Una expresión válida de Smalltalk puede ser cualquiera de las siguientes: • • • Un nombre de variable Una literal Un envío de mensajes Cada instrucción se separa por un punto.Ing. Comentarios: son cualquier agrupación de caracteres encerrados entre dobles comillas. Lucas Spigariol Capítulo 3: Instrucciones Smalltalk Presentación sintética: Existen varias reglas que gobiernan la sintaxis y gramática en que son escritas las instrucciones de Smalltalk. Instrucciones En Smalltalk. Si una instrucción tiene más de una expresión. Variables temporales están declaradas al comienzo de un método justo después de la definición de interfase del método Bloques: permiten que el código sea pasado como argumento en un mensaje y ejecutado posteriormente en otro método. Cada instrucción tendrá una o más expresiones Smalltalk. La sintaxis de Smalltalk consiste de: • • • • • Instrucciones: consisten en una o más expresiones Smalltalk válidas. o devolver una expresión. puede contener una instrucción de asignación (determinar el contenido específico de una variable dada).

Las líneas en blanco son ignoradas por Smalltalk. self direccion: unaDireccion Para que el código sea más fácil de leer. Por ejemplo: x := 7. Lucas Spigariol Cuando Smalltalk procesa cada mensaje. En Smalltalk. múltiples instrucciones pueden aparecen en una sola línea. k := 'algunos caracteres'. Asignación Una asignación cambia el valor del objeto al que apunta una variable. Smalltalk separa las instrucciones ejecutables por medio del punto. que es el resultado de ejecutar el mensaje. y que no termina con un punto (. o una sola instrucción puede aparecer en muchas líneas. El punto es opcional para la última instrucción de un método. El siguiente es un ejemplo del método nombre:direccion: de la clase Alumno: nombre: unNombre direccion: unaDireccion self nombre: unNombre. Como resultado. La línea final no necesita un punto final. la instrucción en el mensaje se reemplaza por un valor retornado. y la instrucción puede ser cualquier instrucción válida de Smalltalk. La sintaxis para una instrucción de asignación es: variable := instrucción donde la variable puede ser un nombre dentro del alcance del método. Página 20 . porque es el final del método. no se suele tener más de una instrucción en una sola línea.). una variable apunta a un objeto en vez de guardarlo. self direccion: unaDireccion Note que la primera línea es la definición de la interfase de un método. Se dice que una variable contiene al identificador del objeto.Manual de Smalltalk .Ing. unaVariable := j * k. El ejemplo anterior puede ser escrito de la siguiente manera: nombre: unNombre direccion: unaDireccion self nombre: unNombre.

porque pone de manifiesto que la instrucción de retorno finaliza la ejecución del método en la que se encuentra. donde instrucción puede ser cualquier instrucción válida. ^y "devuelve el valor de y" La instrucción también puede ser escrita como: ^y := y + 7. Este código devuelve el valor de a si a es mayor que b. un mensaje siempre devolverá un valor. el valor de retorno equivale al valor del último mensaje ejecutado. Un método puede anular su valor de retorno por defecto. Para las instrucciones que poseen más de un mensaje. es el receptor del objeto. Una expresión de retorno aparece normalmente adelante de la última instrucción de un método. pero no modifica el valor de y" Devolviendo un valor desde una instrucción condicional (a < b) ifTrue: [^a] ifFalse:[^b] Este ejemplo contiene más de una instrucción de retorno. Lucas Spigariol Devolución de Valores En Smalltalk. la expresión es la variable a y el valor retornado de la expresión es el valor de a.Ing. El valor de una instrucción siempre es equivalente a la última expresión ejecutada en la instrucción. La devolución por defecto. "devuelve el valor de y" Para devolver el valor de y + 7 sin modificar el valor de y: ^y + 7 "devuelve el valor de y + 7. Por ejemplo: ^instrucción Se retorna el resultado de la instrucción. En la instrucción ^a. colocando un símbolo de intercalación (^) adelante de una instrucción. el método finaliza la ejecución y devuelve el valor de la instrucción que le sigue al símbolo de retorno ^. Página 21 .Manual de Smalltalk . Por Ejemplo: y := y + 7. caso contrario devuelve el valor de b. o adelante de una instrucción que se ejecuta como parte de una instrucción de control. El siguiente ejemplo es una práctica importante. Cuando se encuentra un ^.

porque es el último mensaje en ejecutarse. incluyendo su valor de retorno. ¿Cuál es el valor por defecto? El valor por defecto siempre es self. Variables Temporales Página 22 . Por lo tanto. los comentarios se encierran entre comillas dobles. siempre y cuando sea colocado entre dobles comillas. El mensaje nombre: no especifica un valor de retorno. Comentarios En Smalltalk. Por ejemplo: nombre "Devuelve el nombre del alumno receptor. que es el receptor del mensaje." ^nombre Cuando Smalltalk ejecuta un método.Manual de Smalltalk . Esto significa que un comentario puede aparecer en cualquier lado. para explicar su comportamiento. tal como: "esto es un comentario en Smalltalk" Es una convención aceptada el tener comentarios al principio de un método. Lucas Spigariol Por ejemplo: ^Alumno new nombre: unaPersona nombre Las instrucciones del ejemplo son evaluadas en el siguiente orden: 1º El mensaje new se envía a la clase Alumno 2º El mensaje nombre se envía al objeto apuntado por la variable unaPersona 3º El mensaje nombre: se envía al resultado del mensaje new El valor de la instrucción será el valor del mensaje nombre:. ignora todos los comentarios. en este ejemplo. por lo que devuelve el valor por defecto. el valor de retorno es la instancia Alumno creada por el mensaje new (el receptor del mensaje nombre:).Ing.

^nuevoValor Este método no tiene mayor significado que el de ilustrar el aspecto básico de un método. Página 23 . • • • La primera línea define la interfase del método. La segunda línea es un comentario describiendo lo que hace el método. El nombre del método es unMétodoEjemplo y la variable temporal es algunaEntrada. listándolas entre barras verticales ('|' pipeline). así como también al nombre del método. Esta variable temporal es local sólo dentro de este método. Estas variables temporales contienen los argumentos pasados en el mensaje nombre:direccion:.Ing.Manual de Smalltalk . Lucas Spigariol Las variables temporales están definidas en la definición de interfase de un método. Esto significa que no puede duplicar el nombre de una variable de instancia. La tercera línea es una declaración de una variable temporal adicional llamada nuevoValor. y debe ser único dentro del método. Un método puede tener más variables temporales." | nuevoValor | nuevoValor := algunaEntrada * 2. ni duplicar el de una variable temporal definida en una interfase. El nombre de una variable temporal comienza con una letra en minúscula. Por ejemplo: | nuevoNombre nuevaDireccion | Esta instrucción no termina con un punto. Por ejemplo: nombre: unNombre direccion: unaDireccion En la instrucción hay definidas dos variables temporales: unNombre y unaDireccion. Este método es un método de palabra clave con un argumento. Estructura Básica de un Método El siguiente es un ejemplo de un método: unMetodoEjemplo: algunaEntrada "Esto es un ejemplo de un método. así como tampoco puede duplicar el nombre de una variable temporal cualquiera.

o cualquier número de comentarios. y un código que realiza iteraciones o ejecuciones condicionales. Las siguientes reglas se aplican a los bloques: • • • Un bloque puede contener cualquier número de instrucciones válidas ejecutables. En este ejemplo el resultado del mensaje de multiplicación es el valor de retorno." ^algunaEntrada * 5 La expresión de retorno primero procesa todas las instrucciones que aparecen a su derecha y luego devuelve el valor de la última expresión ejecutada. Lucas Spigariol • La cuarta y la quinta línea contienen la lógica del método. La última línea contiene una expresión de retorno. Como un bloque es parte de un método no posee una definición de interfase de método. que no será necesaria a menos que se explicite un valor de retorno diferente al receptor del mensaje. Un punto es opcional para la última línea de un método. De modo que el método puede simplificarse así: unMétodoEjemplo: algunaEntrada "Esto es un ejemplo de un método. y en la última instrucción del bloque. Sin embargo este método no contiene un código eficiente. El bloque en la siguiente instrucción: ifTrue: [x := 2] Página 24 . Por ejemplo. excepto cuando se definen las variables temporales.Ing. un bloque de código es utilizado para especificar qué ejecutar como resultado de una condición verdadera o falsa: ifTrue: [x := 2] ifFalse: [x := 5] Un bloque puede pensarse como un mini-método dentro de un método. Bloques Los bloques son corchetes que contienen ninguna o muchas expresiones. donde el punto es opcional. Define una variable que mantiene el resultado de la multiplicación. Un bloque tiene acceso a las mismas variables que el método al que pertenece. y luego usa esa variable temporal sólo en la instrucción de retorno.Manual de Smalltalk . Cada instrucción debe terminar con un punto.

" self nombre: unNombre.Ing. La variable x debe estar dentro del alcance del método en donde se encuentra el bloque. dirección y teléfono de una instancia Alumno. Mensajes en cascada Algunas veces es necesario enviar a un objeto varios mensajes consecutivos. Para evitar esto. cada palabra clave debe estar en una instrucción separada. self telefono: unTelefono Self es el receptor de los mensajes para todas las instrucciones del método. como el siguiente: [:variable1 | código] [:variable1 :variable2 | código] donde variable1 y variable2 son variables temporales y son válidas sólo dentro del alcance del bloque. El nombre de la variable es precedido por dos puntos ':'. no puede aceptar ningún argumento. Como ejemplo. Página 25 . Dado que Smalltalk permite el agrupamiento de todas las palabras clave en una sola expresión. Sin embargo es posible definir un bloque que pueda tomar argumentos. Esta instrucción multiplica una variable llamada x por el argumento pasado en el bloque.Manual de Smalltalk . Sin embargo esto provocará un número infinito de llamadas recursivas (debe tener en cuenta que este nombre de mensaje es el mismo que el nombre del método en el que se encuentra esta expresión). Por ejemplo: [:unNumero | x * unNumero] La variable unNumero está definida dentro del bloque. revea el siguiente código: nombre: unNombre direccion: unaDireccion telefono: unTelefono "Determina el nombre. el mensaje nombre:direccion:telefono sería enviado al receptor como una expresión válida. self direccion: unaDireccion. Lucas Spigariol es llamado bloque de cero-argumento. y los mensajes que requieren bloques como argumento. En el próximo capítulo serán discutidos en más detalle los bloques. necesitan aparecer en instrucciones separadas. Para ejecutar los mensajes correctamente. Se examinará qué ocurre cuando self es seguido por todos estos mensajes de palabra clave sin ninguna separación: self nombre: unNombre direccion: unaDireccion telefono: unTelefono.

Esto causa un error de ejecución. Lucas Spigariol Si las tres instrucciones se combinan en una sola con self adelante de cada palabra clave. La primera instrucción se escribe de manera normal." self nombre: unNombre. exceptuando a la última instrucción para la que el punto es opcional. ya que self no es un mensaje soportado por ninguno de esos dos objetos. excepto que termina con un punto y coma. El método del Ejemplo 3. telefono: unTelefono La primera instrucción se escribe de manera normal. Existe una forma de acortar el código que permite trabajar con instrucciones consecutivas. Evalúa al último self como un mensaje enviado al objeto unaDireccion. se vuelve el objeto receptor del primer mensaje en la siguiente instrucción. El objeto receptor del último mensaje en esta secuencia. de la siguiente manera: self unTelefono.3 puede se escrito de la siguiente forma: nombre: unNombre direccion: unaDireccion telefono: unTelefono "Determina el nombre. direccion: unaDireccion.) en vez de con un punto (. pero todas las instrucciones sucesivas pueden omitir al objeto receptor.). Cada instrucción termina con un punto y coma (.Ing. nombre: unNombre self direccion: unaDireccion self telefono: Smalltalk evalúa el segundo self en la instrucción como un mensaje enviado al objeto unNombre. dirección y teléfono de una instancia Alumno.Manual de Smalltalk . Página 26 .

o un vector (Array) de literales. • • • Un literal puede ser utilizado explícitamente para definir datos. Smalltalk no conoce los tipos de datos o las operaciones sobre datos. comparaciones lógicas. Float (real). incluyendo las comparaciones lógicas. una cadena (String). Lucas Spigariol Capítulo 4: Operaciones con Datos Presentación sintética: ¿Cómo hace Smalltalk para tratar con datos. un carácter (Character). iteración y otras funciones condicionales? “Todo en Smalltalk es un objeto”. las operaciones lógicas usando "and" y "or". Las operaciones sobre datos se realizan enviando un mensaje al objeto. un símbolo (Symbol). y las iteraciones. los condicionales lógicos. Las operaciones sobre datos. y las operaciones sobre datos como los métodos de estas clases. Number (número). Character (carácter).Ing. Página 27 . Un literal puede ser un número (Number). Los nuevos datos pueden ser creados como instancias de una clase. las operaciones aritméticas. son implementadas como métodos en sus respectivas clases. Symbol (símbolo) y Array (vector). y Fraction (fracción) son parte de los literales también. Todas las variables inicialmente apuntan al objeto nil. es por esto que Smalltalk implementa todos los tipos de datos como clases de Smalltalk. A diferencia de los lenguajes procedurales donde los tipos de datos y operaciones son definidos como parte de la sintaxis del lenguaje. Las subclases de Number: Integer (entero). Este valor es una instancia de una clase llamada UndefinedObject.Manual de Smalltalk . Literales Smalltalk provee soporte para los literales como instancias de cinco clases: String (cadena).

4e. precedido por un signo numeral.Manual de Smalltalk . La siguiente instrucción determina si el primer carácter de una cadena es igual a 'Y' mayúscula: unaCadena first = $Y String Un string (cadena) es cualquier secuencia de caracteres encerrados entre comillas simples. #nombre #+ #at:put: "un identificador" "un selector binario" "un selector de palabra clave" Página 28 . Todos los símbolos son únicos. #.23 59.' 'Las cadenas pueden contener esto %@#^|\' nuevoAlumno nombre: 'Pedro' "Determina el argumento del mensaje nombre: como una cadena.7 Character Un character (carácter) es cualquier carácter ASCII precedido por el signo $.34e10 . 2. selector binario.564 -2. Por ejemplo: 'Esto es una cadena." Symbol Un symbol (símbolo) es un identificador. Lucas Spigariol Number Un number (número) puede ser uno cualquiera de los siguientes: • • • Un integer (entero) de cualquier longitud Una fraction (fracción) Un número de floating point (punto flotante) "un entero" "un entero negativo" "una fracción" "una fracción negativa" "un número de punto flotante" "un número de punto flotante negativo" "ERROR Un número no puede comenzar con un punto decimal" "ERROR Un número no puede terminar con un punto decimal" "ERROR El exponente debe ser un entero" 123 -234 3/4 -1/7 4. tal como $G o $@. o un selector de palabra clave.Ing.

Cualquier variable puede ser apuntada a nil durante la ejecución. y := 6.Ing. "devuelve 2" 9 \\ 4.Manual de Smalltalk . Un vector literal es una secuencia indexada de otros literales. Página 29 . con una instrucción como la siguiente: UnaVariable := nil. x*y "devuelve 12" Nil En Smalltalk. Por ejemplo: #('uno' 'dos' 'tres' 'cuatro') cadenas" #(1 2 3 4) enteros" #(1 'dos' $Y) "Produce "Produce un un vector vector de con cuatro cuatro "Produce un vector con un entero. y un caracter" Operaciones Aritméticas Una instrucción que realiza una operación aritmética en Smalltalk tiene la siguiente forma: número operación número donde una operación puede ser una de las siguientes: + "suma" "resta" * "multiplicación" / "división" // "división entera (cociente)" \\ "resto de una división" Los siguientes son algunos ejemplos de operaciones aritméticas: 3 + 4. Lucas Spigariol Array Un array (vector) es una estructura de datos cuyos elementos pueden ser cualquier objeto válido. nil es un objeto que significa "nada". "devuelve 1" |xy| x := 2. Inicialmente todas las variables apuntan a nil. una cadena. "devuelve 7" 9 // 4. Un vector se caracteriza por estar encerrado entre paréntesis y precedido por un signo numeral (#).

la siguiente lógica devuelve nil si un argumento es no positivo. y comparación puede ser cualquier operación válida de comparación. y símbolos. caracteres. caso contrario devuelve el resultado de la operación aritmética: raise: unNumero toPower: unaPotencia "Raise (eleva) unNumero a toPower (a la potencia) especificada por unaPotencia. respectivamente y representan los valores booleanos utilizados en toda expresión condicional y comparación lógica. respectivamente. Los siguientes son algunos ejemplos de comparaciones lógicas: 3>8 "devuelve false" $e <= $f "devuelve true" |ij| i := 3. Lucas Spigariol Nil también puede usarse como un valor de retorno para indicar que una operación no fue exitosa. Por ejemplo. Comparaciones Lógicas Una instrucción de comparación tiene el siguiente formato: valor comparación valor donde valor puede ser cualquier expresión que resulte en un valor que pueda ser comparado. tal como números. Caso contrario. Página 30 . devuelve el resultado. ^aNumber raisedTo: aPower True y false En Smalltalk los valores true y false son provistos por las clases True y False." unaPotencia < 0 ifFalse: [^nil]. que son instancias de las clases True y False. Devuelve nil si unaPotencia es no positiva.Manual de Smalltalk . Algunos ejemplos son: > < = ~= >= <= == "mayor que" "menor que" "igual en valor" "desigual en valor" "mayor o igual que" "menor o igual que" "el mismo objeto que" Las comparaciones lógicas devuelven un valor que puede ser true (verdadero) o false (falso). cadenas.Ing.

" (a > 0) | (b < 0) "Devuelve true si a es positivo y/o b es negativo. y los mensajes de palabra clave and: y or:. El código en el bloque no es evaluado hasta que el valor del receptor booleano no es determinado como true o false. en vez de comparar si son iguales en valor. usando la operación o. las expresiones booleanas pueden ser combinadas en un resultado. z := 7. "y" Lógico y "o" Lógico En Smalltalk. El formato para estos mensajes es: booleano and: [código] booleano or: [código] El booleano es cualquier expresión cuyo valor resulte true o false.Ing. i == j "devuelve false" La comparación "==". El bloque de código encerrado entre corchetes debe devolver un valor de true o false. Existe una diferencia entre los mensajes binarios & y |.Manual de Smalltalk . o la operación y. en el último ejemplo. y := 5. Lucas Spigariol j := 7. Página 31 . Los mensajes de palabra clave son considerados caminos cortos porque utilizan evaluación diferida. Por ejemplo: (a > 0) & (b < 0) "Devuelve true si a es positivo y b es negativo." Una sentencia puede contener un número ilimitado de mensajes binarios. Por ejemplo: |xyz| x := 3. y para o lógico es or:. y para el o lógico es |. Los métodos and: y or: combinan los dos valores booleanos y devuelve el resultado correspondiente. (x > 0) & (y < 0) | (x > y) & (y = z) El mensaje de palabra clave para y lógico es and:. compara si dos objetos son el mismo objeto. Caso contrario devuelve false. Estas dos funciones pueden ser utilizadas como mensajes binarios o mensajes de palabra clave. El mensaje binario para el y lógico es &. respectivamente. Caso contrario devuelve false.

Ing. ya que en una operación and con un false siempre es false. ya que en una operación or con un true siempre es true. si el receptor evalúa false. entonces el código del bloque no se ejecuta. (x > y) ifTrue: [nuevoValor := x] ifFalse: [nuevoValor := y]. por ejemplo: booleano ifTrue: [código] ifFalse: [código]. Página 32 . z := 7. donde booleano es cualquier expresión que resulte true o false. (((x > 0) and: [y < 0]) or: [x > y]) and: [y = z] Not El mensaje unario not provee la función not. Por ejemplo: | x y nuevoValor | x := 1. Existen varios mensajes de palabra clave que proveen esta función. entonces el código del bloque no se ejecuta. o false se vuelve true). y := 2. En el caso del mensaje or:. La expresión [código] puede ser cualquier bloque de cero-argumentos. El siguiente es un ejemplo utilizando mensajes de palabra clave: |xyz| x := 3. Este mensaje invierte un valor booleano (true se vuelve false. El formato es: booleano not El siguiente es un ejemplo: (5 > 1) not "El valor de retorno es false." Lógica Condicional La lógica condicional permite la ejecución del código dependiendo de un valor booleano. y := 5. si el receptor evalúa true.Manual de Smalltalk . El mensaje de palabra clave ifTrue:ifFalse ejecuta un bloque diferente dependiendo del valor del booleano. Lucas Spigariol En el caso del mensaje and:.

timesRepeat: El mensaje timesRepeat: ejecuta un bloque de código un número específico de veces.Manual de Smalltalk . y finalizando en un valor final. whileTrue: y whileFalse: Estos dos mensajes realizan la misma operación. whileTrue:. y devuelve el valor en nuevoValor. El formato del mensaje es: [booleano] whileFalse: [código] [booleano] whileTrue: [código] Página 33 . en este caso y. 3 timesRepeat: [x := x + 1]. Ellos son: • • • • Hacer algo n número de veces Hacer algo hasta que se encuentre con una condición false Hacer algo hasta que se encuentre con una condición true Hacer algo usando un índice. whileFalse:. Lucas Spigariol ^nuevoValor Este ejemplo determina el valor de la variable nuevoValor al valor del mayor entre x o y. y to:do:. excepto que uno se ejecuta por true y el otro por false. El siguiente es un ejemplo: "Agrega 1 a la variable x tres veces. ^x El resultado es 5. comenzando con un valor inicial. Los cuatro mensajes de palabra clave que proveen estas funciones son: timesRepeat:. y código es un bloque de código de cero-argumento.Ing. El formato del mensaje es: número timesRepeat: [código] donde número puede ser cualquier expresión que resulte en un entero. Iteraciones Smalltalk soporta cuatro tipos tradicionales de iteraciones." |x| x := 2.

^y to:do: El mensaje to:do: ejecuta un bloque múltiples veces. Al final x valdrá 6. basado en un valor inicial y un valor final.Manual de Smalltalk . (Este formato es utilizado generalmente con enteros. debe estar encerrado en un bloque. ^x Página 34 . [y <= x] whileTrue: [y := y + 1]. ^y "Itera hasta que y es mayor than x" |xy| x := 5. El formato del mensaje es: número1 to: número2 do: [:var | código]. Lucas Spigariol Un booleano puede ser cualquier expresión que resulte en un valor de true o false. y := 0.Ing. 1 to: 3 do: [:i | x := x + i]. ambos ejemplos incrementan y de a 1 hasta que es mayor a x. Por ejemplo. El bloque se ejecuta para cada número perteneciente al rango entre número1 y número2. "Ejecuta este bloque 3 veces con i referenciado a cada valor entre el rango de 1 a 3. donde número1 y número2 pueden ser cualquier expresión que resulte en un número." |x| x := 0. que varían en el rango de a 1 a la vez.). y [:var | código] es un bloque de código de unargumento. [x < y] whileFalse: [y := y + 1]. La expresión [código] es un bloque de código de cero-argumento. inclusive. "Itera mientras x es menor que y" |xy| x := 5. y := 0. El argumento del bloque de un-argumento equivale al valor actual en el rango.

El nombre super actúa de manera similar al self en cuanto que representa al objeto receptor del. Una clase abstracta ofrece un comportamiento común para todas sus subclases. La herencia permite que el usuario extienda el programa existente para que realice la función que se necesite.Ing. Una variable de clase existe sólo una vez en una clase y sus subclases. y es compartida por todas ellas. pero causa que la búsqueda del método a ejecutar comience por la superclase del objeto receptor. Lucas Spigariol Capítulo 5: Herencia Presentación sintética: La herencia es una característica de Smalltalk que habilita a una clase a tener el mismo comportamiento que otra clase. La herencia es especialmente importante en cuanto que dota al lenguaje Smalltalk de las características de reusabilidad y extensibilidad. ¿Qué es la Herencia? Un ejemplo de herencia es cuando alguien tiene un programa y desea que su programa realice más de una función. pero esto no significa que pueda tener instancias propias. • • • • • • • Las clases que heredan el comportamiento de otras clases se llaman subclases. y luego cambiar ese comportamiento para ofrecer un comportamiento único. Una subclase puede agregar nuevos métodos a su comportamiento o reemplazar (redefinición) los métodos heredados. Una subclase puede agregar nuevas variables de instancia o de clase a su definición. Las clases cuyo comportamiento es heredado por otras clases se llaman superclases.Manual de Smalltalk . El siguiente diagrama muestra un ejemplo de herencia: Página 35 .

la subclase siempre toma el comportamiento y la estructura interna de las superclases superior a ella. nombre:. a las ideas de clase. Lucas Spigariol La herencia involucra superclases y subclases. La subclase Cliente tiene las mismas variables de instancia.Ing. género. Página 36 . Esto significa que las subclases pueden tener subclases que también tienen subclases. La jerarquía de herencias es ilimitada. y telefono:. y telefono. direccion. La clase Persona soporta los mensajes nombre. direccion. La clase Persona que se muestra en el siguiente gráfico tiene variables de instancia llamadas nombre. y la familia de clasificaciones en el mundo animal.Manual de Smalltalk . En la herencia. Estas clases son similares en su jerarquía. La subclase Cliente también soporta estos mensajes. direccion:. telefono.

En el gráfico anterior. ya sean de instancia o de clase. y agregarPedidoCliente:. Entonces. Página 37 .Manual de Smalltalk . La definición de la clase Cliente puede ahora soportar todos los mensajes o métodos de la clase Persona y los nuevos tres mensajes. Esto puede ser hecho agregando nuevos métodos. la definición de la clase Cliente también desearía gestionar los pedidos de los clientes. la definición de la clase deseará agregar: pedidosCliente. en la definición de la clase. más los nuevos métodos. o redefiniendo los métodos heredados. incorporándolos. Agregando Métodos Se puede agregar métodos de manera muy simple. Lucas Spigariol Herencia de Métodos La herencia de métodos es útil para permitir a una clase modificar su comportamiento respecto de su superclase.Ing. Todo objeto de la subclase soporta los métodos de su superclase. pedidosCliente:.

Lucas Spigariol Redefinición de Métodos La redefinición de un método heredado es otra herramienta que los usuarios tienen para proveer de un comportamiento único a una clase. Las variables de instancia están definidas en la definición de la clase. La figura muestra cómo Smalltalk trabaja con la jerarquía cuando está buscando un método para un mensaje. si no lo encuentra tampoco en Object envía un mensaje de error. Enviando Métodos a Instancias En la jerarquía. Los métodos heredados no pueden eliminarse. Los datos de la instancia se mantienen en un área de datos creada por Smalltalk. La instancia de la clase busca en sí misma para saber si el método existe en ella. La instancia de una clase puede recibir un mensaje para buscar un método que no es soportado por la clase. Página 38 . Las subclases también pueden poseer variables propias.Manual de Smalltalk . ha sido diseñada para que las subclases hereden las variables de sus superclases. Si un objeto recibe un mensaje que existe en la definición de la clase. si tampoco lo encuentra busca en la superclase de su superclase y así continúa hasta llegar a Object. la búsqueda se pasa a la superclase de la subclase. Si el método es encontrado. Si no. una subclase hereda los métodos de su superclase. entonces se hereda en la instancia de la subclase. Las variables de instancia se agregan a la clase colocándolas en la definición de clase.Ing. el objeto busca en la jerarquía hasta que encuentra el método con ese nombre. Herencia de Variables La jerarquía del lenguaje Smalltalk.

Variables de Clase Una variable de clase es una variable que es compartida por todos los objetos de la clase. pero sólo los métodos de instancia pueden referirse a las variables de instancia. Las variables de clase también permiten compartir la información a través de todas las subclases de la clase en que fueron declaradas. Cada instancia posee su propia copia de las variables de instancia. el nombre de la variable debe comenzar con una letra minúscula. telefono. direccion. excepto que la primera letra de una variable de clase debe comenzar con mayúscula. Entonces. Relación entre métodos y variables de clase Los métodos de instancia y los métodos de clase pueden referirse a las variables de clase. Lucas Spigariol La variable Cliente tiene las variables de instancia: nombre. Sólo existe una copia de la variable de clase en la jerarquía local de clases. de esta forma hace a las variables de instancia propias de la instancia. Todos los objetos de la clase referencian a esta única copia de la variable. y pedidosCliente. Tienen las mismas convenciones de nombramiento que las variables de instancia. Estas variables incluyen las variables de instancia heredadas de Persona.Manual de Smalltalk . El siguiente diagrama muestra este hecho: Página 39 .Ing.

Esto se hace por medio de un método de inicialización por cada clase. Las variables de instancia de clase soportan el comportamiento de herencia.Manual de Smalltalk . Super y Self El uso de super provoca que la búsqueda del método comience en la superclase del objeto receptor. las variables de instancia de clase deben comenzar con minúscula. Un ejemplo para crear una nueva instancia de una clase es: Private Class Methods new Página 40 .Ing. Super también es usado para crear variables de instancia por cada nueva instancia. Cuando super es encontrado en la ejecución de un programa. Smalltalk busca el método en la superclase del receptor. teniendo cada clase su propio estado de la variable. pero nunca tendrán sus propias instancias. La siguiente figura muestra con un recuadro más claro las clases abstractas de un supuesto árbol de jerarquías de Smalltalk. Clases Abstractas Las clases abstractas proveen de un comportamiento a sus subclases. Dado que es una variable privada. Lucas Spigariol Variables de Instancia de Clase Las variables de instancia de clase son como las variables de clase. excepto que cada subclase tiene su propia copia. Super es la única forma en que la clase pueda agregar comportamiento a los métodos sin tener que reemplazarlos.

Un ejemplo del uso del comando self es: self calcular que significa enviar el mensaje calcular a self.Ing. Smalltalk busca el método en el receptor. Página 41 . Cuando self es encontrado en la ejecución de un programa.Manual de Smalltalk . Lucas Spigariol ^super new inicializar Self hace que la búsqueda del método comience en el mismo objeto receptor.

Lucas Spigariol Capítulo 6: Colecciones Presentación sintética: • • • • • • • • • Una Bag (Bolsa) es una colección de tamaño variable. Un Set (Conjunto) es idéntica a una Bolsa excepto en que no permite objetos duplicados. Un String (Cadena) es similar a un vector excepto en que sólo contiene caracteres. Una SortedCollection (Colección Ordenada) es una colección de tamaño variable que guarda objetos en un orden específico por medio de un bloque de ordenamiento de dos argumentos. e iterar (do) a través de una colección. eliminar (remove) ítems. Un Array (Vector o Arreglo) es una colección de tamaño fijo que es indexable. Las Colecciones tienen varios mensajes que soportan la administración de una colección. que guarda objetos en un orden al azar y que no es indexable. Son objetos que contienen y manejan grupos de objetos Página 42 . Un Dictionary (Diccionario) administra pares clave/valor y permite acceder por clave a los objetos que contiene. ¿Qué es una Colección? Una colección es una estructura de datos que referencia a un conjunto de objetos. Un Symbol (Símbolo) es similar a una cadena excepto en que no permite objetos Symbol duplicados con el mismo valor. Una OrderedCollection (Colección Organizada) es una colección de tamaño variable que es indexable. agregar (add) objetos a una colección.Manual de Smalltalk .Ing. Esto incluye preguntar por su tamaño (size).

Página 43 . Con una colección de tamaño variable. ser utilizado algún valor apropiado. Para implementar esta lista. la clase String es una colección que debe contener objetos del tipo Character (carácter). Por ejemplo. el agregado o eliminación de clientes podría hacer que esta lista incremente o decremente su número. Si se quisiera.Ing. se necesitaría una colección de tamaño variable que posea este comportamiento. Las colecciones de tamaño fijo son apropiadas cuando el número de elementos en un grupo es conocido y estable. suelen tener un esquema de manejo más eficiente. Otras colecciones no pueden cambiar su tamaño y. como resultado. Las colecciones varían en las capacidades que ofrecen. su tamaño inicial puede ser especificado. El siguiente diagrama ilustra la jerarquía de clases de estas clases de colecciones: A la mayoría de las colecciones no les importa que clase de objeto esté manejando. Lucas Spigariol Smalltalk posee un número de diferentes tipos de colecciones. o por defecto. si cada instancia de Cliente estuviera en una lista. Algunas colecciones son específicas respecto del tipo de objeto que manejan. cada elemento en una colección podría contener un objeto diferente de una clase diferente.Manual de Smalltalk . Por ejemplo. Algunas colecciones pueden crecer y decrecer en tamaño y son útiles para grupos de objetos que requieren de este comportamiento.

Por ejemplo. ellos son: • representan un grupo de objetos llamados elementos Página 44 . Las colecciones indexadas siempre están organizadas y no cambian en forma arbitraria el orden de los elementos de la colección.Manual de Smalltalk . pero no nil Cualquier objeto. N = Comportamiento no soportado Las Clases de Colecciones tiene varios comportamientos similares. Todos los índices comienzan en 1 y terminan en el tamaño de la colección. La indexación permite referirse a un elemento en un lugar fijo. se puede solicitar el elemento en el índice (lugar) 1. pero no nil Cualquier Objeto Cualquier objeto Cualquier objeto Caracteres Caracteres Clave + Cualquier objeto S = Comportamiento soportado. en un vector de tres cadenas: #('rojo' 'blanco' 'azul'). o una clave como en un Dictionary (diccionario). La siguiente tabla muestra estas colecciones y sus comportamientos: Tamaño Duplicado Orden variable s S S N S S N N S S N S S S S N N N N N N S N N N COLECCIONES Indexación Bag Set Array OrderedCollectio n SortedCollection String Symbol Dictionary N N S S S S S N Contenidos Cualquier objeto. como en un Array (vector). como por ejemplo el self. o impuesta por algún orden interno como en una SortedCollection (colección ordenada). Esta organización puede ser un índice simple.Ing. que no permiten elementos duplicados dentro de la colección. hasta que sea explícitamente movido de lugar. Lucas Spigariol Una colección organizada tiene una organización sobre sus elementos. Colecciones Comunes Smalltalk tiene varias colecciones comunes. Algunas colecciones tienen características adicionales. Un objeto permanece en el lugar que le fue asignado.

Por ejemplo. y collect:. Un Set ignora cualquier petición que pudiera agregar un elemento duplicado a la colección. unSet size -> 3 unSet occurrencesOf: 3 Salida: 1 Página 45 . y acepta elementos duplicados (puede contener el mismo objeto varias veces). Bag (Bolsa) Una Bag es una colección desorganizada de elementos que está preparada para una búsqueda eficiente.Ing. Una Bolsa actúa como un contenedor dentro del cual se pueden colocar y retirar cosas. soportan cuatro categorías de mensajes que agregarán nuevos elementos. unaBag size -> 6 unaBag occurrencesOf: 3 Salida: 4 Set (Conjunto) Un Set es similar a una Bolsa excepto porque no permite objetos duplicados. unaBag es utilizada para determinar el número de ocurrencias de cada elemento: unaBag := #(1 2 3 3 3 3) asBag. and enumerarán los elementos. Guardan sus elementos en un orden al azar y no pueden ser indexadas. En este caso un Conjunto es más apropiado que una Bolsa. select:. asegurarse que no hay duplicados agrega un costo cada vez que un objeto es añadido a la lista. Como ejemplo. Por ejemplo. determinarán las ocurrencias de los elementos. se podría decidir que es importante asegurarse que no hay clientes duplicados en la lista cada vez que un nuevo objeto cliente es agregado. Sin embargo.Manual de Smalltalk . eliminarán elementos. detect:. Una Bolsa puede incrementar o decrementar su tamaño. Lucas Spigariol • • • proveen un estructura de datos básica para la programación reemplazan construcciones iterativas en los lenguajes tradicionales con los Mensajes a las Colecciones do:. unSet es utilizado para determinar elementos únicos: unSet := #(1 2 3 3 3 3) asSet.

una Colección Organizada es usualmente utilizada en las interfaces de usuario para mantener la información visible en una caja de listas. como ocupante o número de teléfono. Los elementos de una Colección Organizada pueden ser objetos de cualquier clase. Una Colección Organizada puede ser indexada por una clave de números enteros que comienzan en 1 y crecen. Un Vector es útil cuando se conoce el tamaño de la colección y ese tamaño cambia raramente. Una Colección Organizada también permite objetos duplicados y guarda los elementos en un orden al azar. Los elementos de un Vector puede ser cualquier objeto. Por ejemplo. y es consecuentemente el "caballo de batalla" más utilizado por los programadores. El número de habitaciones es fijo y se desea una manera rápida de indexar cada habitación para chequearlas por información. Este ejemplo también demuestra la habilidad de indexación de unArray: unArray := Array new: 3 unArray at: 1 put: 'hola' unArray at: 1 Salida: 'hola' unArray at: 3 Salida: nil OrderedCollection (Colección Organizada) Una OrderedCollection ofrece el protocolo más completo de cualquiera de las clases de colecciones. Página 46 . asumamos que se está diseñando una aplicación para administrar habitaciones en un edificio. de elementos que pueden ser indexados por claves de números enteros que comienzan en 1 y se incrementan. Por ejemplo. los objetos duplicados están permitidos. El soporte de indexación es útil cuando el usuario selecciona un elemento en particular de la Colección Organizada. Un Vector es una buena elección para esta situación. Por ejemplo.Ing. y los elementos se guardan según la posición. Esto permite que la información sea agregada o eliminada de la lista. de tamaño fijo.Manual de Smalltalk . Lucas Spigariol Array (Vector o Arreglo) Un Array es una colección. Esta colección es principalmente utilizada para listas de tamaño variable que requieren de un control sobre la ubicación de los elementos de la colección. unArray es un vector de 3 posiciones con 'hola' en la primera posición. Un Vector no puede crecer o disminuir.

La colección guarda el primer argumento adelante del segundo argumento en la colección cuando la evaluación del bloque sortBlock es verdadera (true). Lucas Spigariol SortedCollection (Colección Ordenada) Una SortedCollection guarda objetos en el orden especificado por un bloque de código llamado sortBlock. El método para escribir un nuevo bloque sortBlock es: #(4 3 5 2 1) asSortedCollection: [:a :b | a >= b] #('uno' 'dos' 'tres') asSortedCollection: [ :x :y | x size >= y size] Una Colección Ordenada es una buena elección para mantener una lista de clientes ordenada por nombre. El bloque sortBlock puede contener múltiples sentencias. El primer argumento en el bloque sortBlock siempre apunta al nuevo objeto y el segundo argumento apunta a un objeto existente. El bloque sortBlock es un bloque de dos argumentos que indica el orden en que los dos argumentos debieran ser almacenados en la colección respecto uno del otro. o hasta que no haya más elementos en la colección. en cuyo caso el nuevo elemento pasa a ser el último en el orden de la lista. Esta colección utiliza el bloque sortBlock cada vez que un elemento es agregado a la colección. Mensajes a las Colecciones Las colecciones tienen una variedad de mensajes para administrarse: Página 47 . de manera que debe usarse prudentemente. Por ejemplo. esto agrega un significante costo adicional cada vez que un nuevo objeto es añadido a la colección. Sin embargo. el siguiente bloque compara el objeto referenciado por la variable a con el objeto referenciado por la variable b: [:a :b | a <= b] "devuelve true cuando a es menor o igual a b" El bloque devuelve el valor true si el primer objeto es menor o igual que el segundo objeto. hasta que el bloque devuelva true. pero debe retornar un valor de verdad: true o false. La colección ejecuta el bloque sortBlock en forma iterativa y secuencial recorriendo todos los elementos existentes en la colección. Este es el bloque de ordenamiento por omisión que utiliza la clase SortedCollection.Manual de Smalltalk . Es bloque hace que la colección guarde sus elementos en orden ascendente.Ing.

Manual de Smalltalk - Ing. Lucas Spigariol

new
El mensaje new designa una colección con un tamaño por omisión, que varía dependiendo del tipo de la colección. Este mensaje devuelve la nueva colección. Por ejemplo, la siguiente sentencia designa unaBag con el siguiente mensaje:
|unaBag| unaBag := Bag new

Este mensaje puede ser inapropiado para colecciones de tamaño fijo dado que designa una colección vacía (sin elementos). Se debe recordar que las colecciones de tamaño fijo no pueden crecer.

new: unNúmero
El mensaje new: designa una colección con un tamaño específico dado por el argumento unNúmero. El mensaje devuelve la nueva colección. Para una colección de tamaño fijo, el argumento especifica un número de elementos en la colección. Pruebe el siguiente ejemplo:
Array new: 10

Esta expresión designa un vector de 10 elementos. Un mensaje size enviado a esta colección devolverá el número 10. Pruebe el siguiente ejemplo:
(Array new: 10) size

with: unObjeto
Estos cuatro mensajes crean una colección para contener los objetos especificados:
• • • •

with: unObjeto with: unObjeto1 with: unObjeto2 with: unObjeto1 with: unObjeto2 with: unObjeto3 with: unObjeto1 with: unObjeto2 with: unObjeto3 with: unObjeto4

El tamaño de la colección es igual al número de palabras clave en el mensaje. Por ejemplo, el mensaje with: crea una colección con un elemento y coloca unObjeto en esa ubicación de la colección. El mensaje devuelve la nueva colección. Este mensaje es válido para todas las colecciones. Pruebe el siguiente ejemplo
Array with:'cadena 1' with:'cadena 2'. OrderedCollection with:1 with:2 with:3 with:4.

Página 48

Manual de Smalltalk - Ing. Lucas Spigariol

size
El mensaje size devuelve el número de elementos actualmente en la colección. Es soportado por todas las colecciones. Si la colección está vacía, su tamaño será cero. Este mensaje se encuentra en varios de los ejemplos anteriores.

do: unBloque
El mensaje do: es una iteración general que recorre cada elemento de la colección y ejecuta un bloque de código de un argumento, especificado por el argumento unBloque, con cada elemento de la colección como argumento de este bloque. Por ejemplo, el siguiente código contará el número de vocales en la cadena 'ahora es el momento' y devolverá el valor 8. Pruebe el ejemplo:
"Cuenta el numero de vocales en una cadena." |vocales cadena| vocales := 0. cadena := 'ahora es el momento'. cadena do: [:letra | letra isVowel ifTrue: [ vocales := vocales + 1]] ^vocales

Sea otro ejemplo, donde se tiene una colección de números, se calcula la suma de todos los números de la colección, obteniéndose un resultado de 15. Pruebe el ejemplo:
"Calcula el total de la suma de los números en numeros." |numeros suma| numeros := #(1 2 3 4 5). suma := 0. numeros do: [ :unNumero | suma := suma + unNumero]. ^suma

Este ejemplo ejecuta el bloque de código para cada número en la colección con la variable temporal unNumero apuntando al número. El siguiente diagrama ilustra esta iteración:

Página 49

Manual de Smalltalk - Ing. Lucas Spigariol

Veamos otro ejemplo. El siguiente código cuenta el número de de números pares en una colección. Obtiene el resultado de 2.
"Cuenta el número de números pares en numeros." |numeros pares| numeros := #(1 2 3 4 5). pares := 0. numeros do: [:unNumero | unNumero even ifTrue: [pares := pares + 1]]. ^pares

Los números reconocen un mensaje llamado even que devuelve true si el número es par, y devuelve false si es impar.

add: unObjeto
El mensaje add: agrega un objeto, especificado por el argumento unObjeto, a la colección. El mensaje sólo es válido para las colecciones que pueden crecer en tamaño. Este mensaje devuelve el objeto que fue agregado.
|unaColeccion| unaColeccion := Bag new. unaColeccion add: 1

remove: unObjeto
El mensaje remove elimina un objeto de la colección. El mensaje sólo es válido para las colecciones que pueden crecer o disminuir en tamaño. El mensaje devuelve el objeto eliminado. Si el objeto no es encontrado, será visualizada la ventana de depuración (debugger window).
|unaColeccion| unaColeccion := Bag new. unaColeccion add: 1. unaColeccion remove: 1.

at: unNúmero put: unObjeto

Página 50

(Array with: 'cadena 3'). ^unaColeccion at: unNúmero El mensaje at: devuelve el objeto en el índice especificado por el argumento unNúmero. especificado por el argumento unObjeto. #( 4 7 10 3 7) detect: [ :nro | nro > 7] ifNone: [^nil]. en la colección en el índice especificado por el argumento unNúmero. El mensaje devuelve una nueva colección de la misma clase que el receptor. unaColeccion at: 5 put: 'cadena 5'. El mensaje es válido para las colecciones que pueden ser indexadas. Página 51 . unaColección El mensaje combina dos colecciones para formar una tercera colección por concatenación. unaColeccion at: 1 put: 'cadena 1'. unaColeccion at: 5 . al crear un vector y luego agregar un nuevo elemento al vector. |unaColeccion| unaColeccion := Array new: 10. Por ejemplo. unaColeccion at: 5 put: 'cadena 5'. El índice debe ser un número válido.Manual de Smalltalk . El receptor del mensaje debe ser una colección que pueda ser indexada. unaColeccion at: 2 put: 'cadena 2'. unaColeccion := unaColeccion. Lucas Spigariol El mensaje at: put: coloca un objeto. El argumento unaColección puede ser cualquier tipo de colección. |unaColeccion| unaColeccion := Array new: 2. Es mensaje sólo es válido para las colecciones que pueden ser indexadas. |unaColeccion| unaColeccion := Array new: 10. Esta sentencia devolverá el número 10. Este mensaje es una buena forma de hacer crecer a una colección de tamaño fijo. El mensaje devuelve el objeto colocado en la colección.Ing. detect: unBloque Este mensaje devuelve el primer elemento en el receptor para el cual la evaluación del argumento unBloque es verdadera.

'ahora es el momento' select: [:letra | letra isVowel ] Devuelve la colección formada por: a o a e e o e o. detect select: reject: collect: : S S S S S S S S S S S S S S S S S S S S Página 52 . COLECCIONES Bag Set Array OrderedCollectio n SortedCollection do: add: remove: at: S S S S S S S N S S S S N S S N N S S S at: put: N N S S N N N S S S . Los elementos de la nueva colección son el resultado de ejecutar el argumento unBloque en cada uno de los elementos del receptor. #('ahora' 'es' 'el' 'momento' 123) collect: [:elemento | elemento isString ] Devuelve la colección formada por: true true true true false. 'ahora es el momento' reject: [:letra | letra isVowel ] Devuelve la colección formada por: h r s l m m n t.Manual de Smalltalk .Ing. Lucas Spigariol select: unBloque Este mensaje devuelve un subconjunto del receptor conteniendo todos aquellos elementos para los cuales la evaluación del argumento unBloque es verdadera. Resumen de colecciones y mensajes La siguiente tabla resume los métodos que cada colección soporta. collect: unBloque Este mensaje crea y devuelve una nueva colección del mismo tamaño que la receptora. reject: unBloque Este mensaje devuelve un subconjunto del receptor conteniendo aquellos elementos para los cuales la evaluación del argumento unBloque es falsa.

Las cadenas tienen métodos adicionales que sólo tienen sentido para una cadena de caracteres. pero no soporta los mensajes add: o remove:. Por lo tanto. y Dictionary. pero puede ser indexada. Una cadena no puede crecer o disminuir en tamaño. soporta los mensajes at: y at:put:. cada uno de ellos apuntando a un caracter. String Lógicamente la clase String es idéntica a la clase Array con la excepción que sólo puede contener caracteres. con la herramienta Inspect de Smalltalk.Manual de Smalltalk . Las tres clases son String." 'Marzo 10. Lucas Spigariol Dictionary String Symbol S S S S N N N N N S N N S S S N S S S S S S S S S S S S S S Colecciones Especiales Hay otras tres colecciones que son útiles pero que difieren bastante de las otras colecciones ya vistas. "Devuelve una cadena hasta el primer caracter ingresado. Note que la cadena está compuesta de ocho elementos.Ing. Los mensajes que parecen hacer crecer a un objeto String crean un nuevo objeto String en vez de hacer crecer al objeto existente." 'uno dos ' asArrayOfSubtrings “Devuelve un vector de cadenas por cada palabra en la Página 53 . la siguiente cadena: 'Fernando' La ventana de Inspección se abre y muestra el contenido de la cadena. lo que amerita una discusión especial. vea el siguiente diagrama de la cadena 'John': Inspeccione. Por ejemplo. Symbol. 2000' upTo: $. ' hola' trimBlanks “Devuelve una cadena sin los espacios iniciales.

Los símbolos también son usados para obtener claves únicas en los diccionarios. with: with: with:. No pueden existir dos símbolos con el mismo valor.Ing. #nombre1. una vez creado no puede ser modificado. si la clase Cliente tiene un método llamado nombre. Los diccionarios son colecciones desorganizadas cuyos elementos son accedidos por una clave externa explícitamente asignada. Sin embargo. y no un nuevo símbolo. with:. Sí soporta el mensaje . Lucas Spigariol cadena principal. Un símbolo es único. #nombre2 Recuerde que un símbolo es precedido por el signo numeral. Un símbolo no vacío sólo puede ser creado utilizando un literal como: |unaColeccion| unaColeccion := #Simbolo. pero en principio cualquier Página 54 . entonces el símbolo para el selector es #nombre. con algunas diferencias únicas. with: with:. La clase Symbol es similar a la clase String. Esto significa que no soporta ningún método que pueda cambiar su valor como at:put:. Por ejemplo. • Un símbolo es fijo en tamaño. • Dictionary Un objeto dictionary es como una base de datos simple. Esto significa que no soporta mensajes como add:. y with: with: with: with:. Un símbolo es de sólo lectura. Esto significa que no soporta los mensajes: new:. Posee el siguiente comportamiento: • • • Un símbolo es un objeto de sólo lectura una vez que ha sido creado." Symbol Los objetos Symbol son usados por las clases para definir los selectores para los métodos definidos por la clase. Las claves usualmente son cadenas o símbolos. No puede crecer o decrecer. los átomos también pueden ser utilizados para esto. (coma) pero devuelve una nueva cadena.Manual de Smalltalk .

Inspeccione el siguiente ejemplo: Dictionary new add: (Association key: '45841122'). que es. Devuelve la asociación que fue agregada. Cuando se ejecuta el comando Show it sobre un objeto Dictionary sólo se ven sus valores y no sus claves. varios de los métodos para la clase Dictionary son un poco diferentes de los métodos para las otras colecciones. Los siguientes párrafos brevemente resumen algunos de los más comunes métodos para diccionarios.Ing.Manual de Smalltalk . Una Ventana de Inspección se necesita para ver las claves y los valores. Las claves deben ser únicas en un diccionario. Un elemento en un diccionario contiene un puntero a una instancia de asociación. otro objeto String con el mismo valor no puede ser agregado como clave. dos elementos no pueden estar asociados a la misma clave ni dos claves pueden ser iguales. No hay restricciones sobre los elementos que se guardan en un diccionario. La clase Dictionary también ofrece varios métodos adicionales específicos para claves y valores. yourself Página 55 . Algunos de los ejemplos necesitan que los inspeccione. Consecuentemente. add: unaAsociacion El mensaje add: agrega el argumento unaAsociacion al diccionario. Por ejemplo. Una instancia de asociación apunta a un objeto que es una clave y apunta a un objeto que es el valor. las claves deben ser únicas con respecto a la operación de igualdad. por lo que no habrá dos asociaciones en un diccionario que tengan claves con el mismo valor. Lucas Spigariol objeto puede ser usado como una clave de diccionario. si un objeto String con el valor 'nombre' está actualmente almacenado como clave. El apareo de claves para el almacenamiento o acceso de los elementos está basado en la operación de igualdad =. Debido a los pares clave/valor. Los diccionarios mantienen un seguimiento de las parejas clave/valor. Cada par clave/valor es una instancia de una clase llamada Association.

unDiccionario Página 56 . Manuel').Ing. unDiccionario at:'45841122' keyAtValue: unValor El mensaje keyAtValue: devuelve la clave del primer valor que encuentra que es igual al argumento unValor. |unDiccionario| unDiccionario := Dictionary new.Manual de Smalltalk . Si la clave no se encuentra. |unDiccionario| unDiccionario := Dictionary new. se visualizará la ventana de depuración. unDiccionario add: (Association key:'45841122' value:'Manuel'). Lucas Spigariol removeKey: unaClave El mensaje removeKey:elimina una asociación del diccionario con la clave igual al argumento unaClave. Si el argumento unaClave no es encontrado en el diccionario se visualizará la ventana de depuración. Si unaClave no existe en el diccionario se visualizará la ventana de depuración. Este mensaje devuelve unValor. Inspeccione el siguiente ejemplo: |unDiccionario| unDiccionario := Dictionary new. unDiccionario add: (Association key:'45841122' value:'Rodríguez. unDiccionario at:'45820022' put:'Tía Claudia'. unDiccionario add: (Association key:'45841122' value:'Manuel'). unDiccionario keyAtValue:'Manuel' at:unaClave put:unValor El mensaje at: put: encuentra el argumento unaClave en el diccionario y reemplaza su valor por el argumento unValor. El mensaje devuelve el valor de la asociación que fue eliminada. unDiccionario at:'45841122' put:'Felipe'. unDiccionario add: (Association key: '45841122' value: 'Rodríguez. |unDiccionario| unDiccionario := Dictionary new. Manuel'). unDiccionario removeKey: '45841122' at: unaClave El mensaje at: devuelve el valor asociado con el argumento unaClave. Este mensaje puede ser utilizado en lugar del mensaje add: para agregar una nueva asociación al diccionario. entonces se agrega al diccionario. Si el argumento unValor no se encuentra en el diccionario.

unaColeccion := OrderedCollection new.tel]. unDiccionario keysDo:[:tel |unaColeccion add:'Teléfono = '. unaColeccion := OrderedCollection new. |unDiccionario unaColeccion| unDiccionario := Dictionary new. unDiccionario at:'45820022' put:'Tía Claudia'. ^unaColeccion Este ejemplo crea una Colección Ordenada con cada elemento apuntando a un objeto String con el teléfono precedido por la cadena 'Teléfono = '. unDiccionario at:'45820022' put:'Tía Claudia'. keys El mensaje keys devuelve un conjunto con todas las claves del diccionario.nombre]. do: unBloque El mensaje do: realiza iteraciones a través de todos los elementos del diccionario. unDiccionario at:'45841122' put:'Manuel'. Lucas Spigariol Note que el valor para la clave '45841122' ha sido modificado y una nueva asociación con la clave '45820022' y el valor 'Tía Claudia' ha sido agregado. unDiccionario do:[:nombre |unaColeccion add:'Nombre = '. keysDo: unBloque El mensaje keysDo: realiza iteraciones a través de todos los elementos del diccionario. ejecutando un bloque de código de un sólo argumento especificado por el argumento unBloque. unDiccionario at:'45841122' put:'Manuel'. donde cada argumento de dicho bloque se corresponde con la clave de cada asociación. |unDiccionario unaColeccion| unDiccionario := Dictionary new. ejecutando un bloque de código de un sólo argumento especificado por el argumento unBloque. Página 57 .Manual de Smalltalk . el argumento de dicho bloque se corresponde con los valores de cada asociación.Ing. ^unaColeccion Este ejemplo devuelve una Colección Organizada donde cada elemento apunta a un objeto String con el nombre de la persona precedido por la cadena 'Nombre = '.

unaColeccion := OrderedCollection new. Lucas Spigariol |unDiccionario| unDiccionario := Dictionary new. Pero como un objeto Dictionary puede tener valores duplicados. unDiccionario values ¿Por qué el diccionario devuelve las claves en un Conjunto y los valores en una Bolsa? Un Conjunto no permite duplicados. se colocan en una Bolsa. unDiccionario at:'45841122' put:'Manuel'. entonces un Conjunto es una buena elección. mientras que una Bolsa sí lo hace. unDiccionario at:'45820022' put:'Tía Claudia'. unaColeccion := OrderedCollection new. unDiccionario at:'45820022' put:'Tía Claudia'. unDiccionario keys values El mensaje values devuelve una instancia de la clase Bag con todos los valores del diccionario.Ing. unDiccionario at:'45841122' put:'Manuel'.Manual de Smalltalk . Un objeto Dictionary no puede tener claves duplicadas. |unDiccionario| unDiccionario := Dictionary new. Página 58 .

Manual de Smalltalk . (2) Es la clase abstracta que proporciona un comportamiento común para las clases y metaclases. y de la implementación de un objeto. Los objetos representados por una clase se llaman instancias de la clase. mientras que suprime los detalles que son inmateriales o de distracción. Los mensajes binarios y los mensajes de palabra clave toman argumentos. pero no se diseña para generar instancias a partir de ella. Todas las acciones a las cuales un objeto responde se definen en la descripción de su clase. los dos puntos ( : ) después de una palabra clave indican que se necesita un argumento. Lucas Spigariol Glosario: Abstracción: Una descripción o vista simplificada de algo que enfatiza las características o los propósitos relevantes al usuario. donde cada elemento es un objeto. Las subclases heredan las propiedades de sus superclases. Clase abstracta: Es una clase que proporciona un comportamiento común a sus subclases. Colección: Es un conjunto de elementos. Definición de la clase: La definición de una clase contiene: • • • • • El nombre de la clase El tipo de clase La superclase inmediata para la clase Las variables de instancia y de clase Los diccionarios compartidos que la clase usa Página 59 . Estas clases se disponen jerárquicamente desde superclases menos específicas hacia subclases más específicas. Comentario: Es un conjunto de caracteres encerrados entre comillas dobles. Esto incluye la descripción de los atributos. de los comportamientos. Comportamiento: (1) Es el conjunto externo de características que exhibe un objeto. Clase: Una clase es un objeto que especifica las propiedades generales para los tipos específicos de objetos. Smalltalk ignora los comentarios y no los ejecuta.Ing. Argumento: Es un dato incluido como parte de un mensaje. Los argumentos proporcionan información adicional que el receptor puede utilizar para realizar la operación solicitada. En un mensaje de palabra clave.

una cadena de caracteres. Un literal puede ser un número. El objeto creado por un literal es inalterable: no puede ser modificado. Diccionario Compartido (Pool Dictionary): Es un objeto del tipo diccionario cuyas claves definen variables que pueden ser compartidas por múltiples clases. Todos los literales son únicos: dos literales con el mismo valor referencian al mismo objeto. las comparaciones y las operaciones lógicas. jerárquicamente hablando. Jerarquía de clases: Es una estructura de árbol que define las relaciones entre las clases. de palabra clave. Un mensaje consiste en una referencia al objeto receptor. y (generalmente) los argumentos que son usados por el método. Lucas Spigariol Diccionario: En Smalltalk. El nombre de Página 60 . según el receptor sea una instancia ó una clase. Encapsulamiento: Oculta la representación de los datos internos de un objeto. También puede hacerse una clasificación de acuerdo al receptor. Todos los métodos para una clase pueden acceder a las variables que se encuentran en un Diccionario compartido como parte de su alcance. El objeto solamente dice qué puede hacer pero no cómo lo hace. Instancia: Es un objeto que es una ocurrencia particular de una determinada clase. El objeto proporciona una interfaz que consulta y manipula los datos sin exponer su estructura interna. Mensaje Binario: Un mensaje que especifica una acción que se realizará en el objeto receptor y un objeto adicional pasado como argumento.Manual de Smalltalk . y unarios. Una subclase hereda todo de una superclase. y superclases por encima de ella.Ing. seguido por un selector indicando el método solicitado. Literal: Es un objeto creado por el compilador. Hay tres tipos de mensajes: binarios. un caracter. Una clase tiene subclases bajo ellas. es una colección desordenada cuyos elementos son accedidos por una clave externa explícitamente asignada. Herencia: Es la relación entre las clases en las cuales una clase comparte su estructura y comportamiento de otra. Mensaje: Es la comunicación de un objeto a otro que solicita que el objeto receptor ejecute un método. Véase también pool dictionary (Diccionarios Compartidos). En Smalltalk se utiliza los mensajes binarios para la aritmética. Los métodos y las variables de una clase son heredados por sus subclases. esta puede ser mensajes de instancia ó mensajes de clase. Una instancia existe en memoria o en un medio externo en forma permanente. ó un vector. un símbolo.

Todo el código y los datos de Smalltalk deben ser parte de un objeto. Es la única instancia de la clase UndefinedObject. Toda clase tiene una metaclase de la cual es su instancia. Esto es lo que lo diferencia de los mensajes binarios y de los mensajes unarios. 2 y $H son los argumentos. comportamiento e implementación de una clase. objeto: Es el bloque de construcción básico en el desarrollo de Smalltalk. Cada palabra clave requiere un argumento. pueden responder a un mismo mensaje de maneras diferentes. Polimorfismo: Es la capacidad de los objetos que. y no a la instancia de la clase. Una palabra clave es un identificador seguido por dos puntos ( : ). Compare con clase Método: Es el código ejecutable que implementa la lógica de un mensaje particular de una clase. Los mensajes que invocan métodos de instancia se envían a las instancias particulares y no a la clase. 'hola' at:2 put: $H es un ejemplo de un mensaje de palabra clave . Véase también Mensaje. nil: Es el objeto que en Smalltalk significa "sin valor". Un objeto es cualquier cosa que puede mostrar un comportamiento. Hay dos tipos de métodos: método de clase y método de instancia. Todas las variables en un principio son inicializadas a nil. a la que se le puede asignar responsabilidades. Página 61 . X + Y es un ejemplo de un mensaje binario con + como el selector binario. Esto significa que objetos diferentes pueden tener implementaciones de métodos diferentes para un mismo mensaje. y el orden de las palabras claves es importante.Manual de Smalltalk . Mensaje unario: Es un mensaje que no posee argumentos. Lucas Spigariol estos mensajes no debe tener ningún carácter alfanumérico. Metaclase: Es la especificación de una clase. o sea. siendo diferentes. Método de Instancia: Un método que proporciona el comportamiento para las instancias de la clase. at: y put: son los selectores de la palabra clave. size es un ejemplo de un mensaje unario.Ing. El mensaje para invocar métodos de clase se envía a la clase. es la completa descripción de los atributos. Un objeto puede enviar un mensaje sin importarle como el receptor implementa el mensaje. Mensaje de palabra clave: Es un mensaje que recibe uno ó más argumentos. Método de Clase: Es un método que proporciona el comportamiento para una clase.

Subclase: Es una clase que hereda el comportamiento y las especificaciones. de la clase y sus subclases. La búsqueda de ese nuevo mensaje comienza a partir de la clase a la que pertenece el receptor. o sea. es decir. sus valores son diferentes. Superclase: Es una clase de la cual otra clase hereda el comportamiento y las especificaciones. herencia y polimorfismo.Ing. Lucas Spigariol Programación Orientada a Objetos: Es una metodología de programación construida alrededor de objetos y se basa en la interacción de los objetos mediante el envío de mensajes. o sea. pueden referirse directamente a estos datos. Redefinición: Es cuando se vuelve a definir un método que ya existe en alguna clase superior (superclase). Variable de instancia de la clase: Es la información privada que le pertenece a una clase. Variable de clase: Son los datos compartidos por la clase que la define y sus subclases. Self: Es una pseudovariable que hace referencia al receptor de un mensaje. Se utiliza dentro de un método de una clase para poder enviar un mensaje al objeto receptor del mensaje original. El conjunto de variables de instancias define las características particulares de un objeto. Variable: Un lugar de almacenamiento dentro de un objeto para un dato. los métodos y variables. Al cambiar el valor de una variable de clase en una clase. también cambia para todas las otras clases que hereden esta variable.Manual de Smalltalk . si bien todos los objetos de esa clase tienen la misma cantidad de variables de instancia. Variable de instancia: Son los datos privados que pertenecen a una instancia de una clase. Las variables de instancia pueden ser accedidas solamente por los métodos de instancia de la clase y sus subclases. de otra clase. Los conceptos básicos de la programación orientada a objetos son la encapsulamiento. La diferencia con self es que con super la búsqueda comienza a partir de la superclase del objeto receptor. Super: Es una pseudovariable que hace referencia al receptor de un mensaje. donde el dato es un objeto. los métodos y las variables. y están ocultos a los accesos directos por parte del resto de los objetos. La clase que la define y cada una de sus Página 62 . Con super podemos hacer referencia a métodos redefinidos en esa clase. Los métodos de instancia y los métodos de clase. Se utiliza dentro de un método de una clase para poder enviar un mensaje al objeto receptor del mensaje original.

Una variable temporal toma un valor asignado.Manual de Smalltalk . Cambiar la información en una clase no la cambia en todas las clases de la jerarquía. Lucas Spigariol subclases mantienen su propia copia de la información. Página 63 .Ing. a diferencia de lo que ocurre con las variables de clase Variable Temporal: Es una variable cuyo alcance está limitado al método ó bloque donde está definida.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->