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 emporale s 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 Progra Programac mació ión n Orien Orientad tada a a Objeto Objetos s (POO) (POO) es dife difere rent nte e de los los lenguajes de programación procedurales (C, Cobol, Pascal, etc.). Todo en POO está conceptualizado como "objetos" (ver Abstracción de datos). datos). La POO, definida en su más puro sentido, es implementada por el envío de mensajes a los objetos. objetos. Para entender este concepto, primero debemos conocer qué es un objeto. 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 obje objeto to "EstadoAlumno" EstadoAlumno " pued puede e info inform rmar arle le su prom promed edio io,, año año de escuela, etc.; o puede agregar una lista de las materias cursadas. Un objeto "Alumno "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. mensaje. El objeto que envía el mensaje es designado emisor y el objeto que recibe el mensaje es designado receptor .
Página 3
Manual de Smalltalk - Ing. Lucas Spigariol
El control le es dado al objeto receptor hasta que complete la acción; luego el control regresa al objeto emisor. Por Ejemplo, un objeto Escuela le pide al objeto Alumno su nombre enviándol enviándole e un mensaje preg pregun untá tánd ndol ole e por por su nomb nombre re.. El obje objeto to receptor Alumno devuelve su nombre al objeto emisor.
Un mensaj mensaje e tambié también n puede puede conten contener er inform informaci ación ón que los los objeto objetos s emisores necesitan pasar al objeto receptor, a esta información se la llama argumento de un mens mensaj aje. e. Un obje objeto to rece recept ptor or siem siempr pre e devuelve un valor al objeto emisor. Este valor devuelto puede ser, o no, útil al objeto emisor. Por ejemplo, el objeto Escuela ahora desea cambiar el nombre del alumno. Esto lo hace enviando al objeto Alumno un mensaje para cambiar su nombre a uno nuevo. El nuevo nombre es pasado como un argumento en el mensaje. En este caso, al objeto Escuela no le interesa el valor que devuelva el mensaje.
Página 4
Manual de Smalltalk - Ing. Lucas Spigariol
Operación Secuencial Es muy común que un mensaje provoque el envío de otros mensajes, ya sea al mismo u otros objetos, para completar su tarea. A esto se lo llama operación secuencial. secuencial. El control no le será devuelto al objeto emis emisor or orig origin inal al hast hasta a que que todo todos s los los otro otros s mens mensaj ajes es haya hayan n sido sido completados. Por ejemplo, el siguiente diagrama, el Objeto A envía un mensaje al Objeto B. Para que el Objeto B procese este mensaje, envía otro mensaje al Objeto C. Asimismo el Objeto C envía otro mensaje al Objeto D. El Objeto D devuelve el control al Objeto C, asimismo el Objeto C devuelve el control al Objeto B que, a su vez, lo devuelve al Objeto A. El control no es devuelto al Objeto A hasta que todos los otros mensajes se han completado.
Método ¿Cómo los objetos receptores interpretan los mensajes de los objetos emisores? ¿Cómo se procesan los mensajes? Cada Cada mens mensaj aje e pose posee e un códi código go asoc asocia iado do a él. él. Cuan Cuando do un obje objeto to recibe un mensaje, su código es ejecutado. En otras palabras, estos mensajes determinan el comportamiento de un objeto y el código determina cómo, el objeto, lleva a cabo cada mensaje. El código que está está asoc asocia iado do a cada cada mens mensaj aje e se llam llama a método. método. El nombr ombre e del del mensaje, también suele llamarse el nombre del método debido a su asociación con el método. Cuando un objeto recibe un mensaje, determina qué método es el solicitado y pasa el control al método. método. Un objeto tiene tantos métodos como acciones se desea que tenga. Observ Observe e el siguie siguiente nte diagr diagrama ama,, nombre, nombre, nombre:, nombre: , direccion y nombre:direccion: son nombres de métodos para el objeto Alumno. Alumno. Cuando el objeto Alumno recibe el mensaje nombre, nombre, el mensaje nombre pasa pasa el cont contro roll al méto método do nombre defin definido ido en Alumno. Alumno.
Página 5
Manual de Smalltalk - Ing. Lucas Spigariol
Los métodos que operan sobre objetos específicos son los métodos de instancias, instancias, y los mensajes que invocan métodos de instancia se llaman mensajes de instancia. instancia. Los Los méto método dos s son son simi simila lare res s a las las subr subrut utin inas as,, proc proced edim imie ient ntos os o func funcio ione nes s que que se encu encuen entr tran an en los los leng lengua uaje jes s proc proced edur ural ales es (C, (C, Pascal). Por ejemplo, un nombre de método equivale al nombre de una una subr subrut utin ina, a, y el códi código go del del méto método do equi equiva vale le al códi código go de la subrutina. El envío de mensajes a objetos es similar al llamado de subrutinas.
Datos de un Objeto Cada objeto necesita guardar la información sobre cómo realizar su comp compor orta tami mien ento to defi defini nido do.. Algu Alguno nos s obje objeto tos s tamb tambié ién n cont contie iene nen n vari variab able les s que que sopo soport rtan an su comp compor orta tami mien ento to.. Esta Estas s vari variab able les s son son llamadas variables de instancia. instancia. Sólo el método de instancia de un obje objeto to pued puede e refe referi rirs rse e y modi modifi fica carr los los valo valore res s guar guarda dado dos s en las las variables de instancia. Los métodos de instancia de los objetos no pueden referirse a los datos de otros objetos. Un objeto sólo puede acceder a los datos de otro objeto enviándole mensajes. A esto se lo llama encapsulamiento y asegura que el proceso para obtener los datos de un objeto sea seguro. Observe el siguiente diagrama, las variables de instancia variableUno hasta variableX sólo variableX sólo pueden ser accedidas por el emisor a través de los métodos de instancia métodoUno hasta métodoN. métodoN. El emisor no puede referirse a las variables, directamente, por sí mismo.
Página 6
Manual de Smalltalk - Ing. Lucas Spigariol
A diferencia de la programación procedural, donde las áreas de datos de uso com común son son util tilizad zadas para ara comp compar arttir infor formaci ación, ón, 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) globales) por otros programa programas. s. Sólo Sólo el objeto objeto que "posee" "posee" los los datos datos puede puede cambia cambiarr su conten contenid ido. o. Otros Otros objeto objetos s pueden pueden ver o cambia cambiarr estos estos datos enviando mensajes al "dueño". Los nombres de variables de instancia pueden ser idénticos a los nombres de los métodos que están asociados a ellos. Por ejemplo, el objeto Alumno tiene los métodos nombre, nombre, dirección, dirección, y carrera así como también las variables de instancia nombre, nombre, dirección, dirección, y carrera. carrera. Smal Smallt ltal alk k dist distin ingu gue e entr entre e los los iden identi tifi ficad cador ores es de vari variab able les s y los los identificadores de métodos a través de la posición que ocupan en la expresión.
Conceptos centrales del Paradigma de Objetos Un lenguaje de computación está orientado a los objetos si soporta las cuat cuatrro pro propied piedad ades es espe especí cífi fica cas s de los objet bjeto os, llamad amadas as abstracción, abstracción, polimorfismo, polimorfismo , herencia, herencia, y encapsulamiento. encapsulamiento. La correcta aplicación de estos conceptos permite obtener un alto nivel de reutilización de las soluciones. Una de las Una las cara caract cter erís ísti tica cas s más más impo import rtan ante tes s de la prog progra rama maci ción ón orient orientada ada a objeto objetos s es la habil habilida idad d para para modifi modificar car las las soluci solucion ones es existentes para resolver nuevos problemas. Si un tipo particular de problema ha sido resuelto utilizando la POO, un problema similar, aunque diferente, puede ser resuelto haciendo algunos cambios en el protocolo del objeto-mensaje ya existente. La mayoría del tiempo, esto esto requ requie iere re agre agrega garr nuev nuevos os mensajes. mensajes. En otro tros caso casos s pued puede e requer requerir ir agrega agregarr nuevos nuevos objetos y nuev nuevos os mensajes a los que responden los nuevos objetos. Página 7
Manual de Smalltalk - Ing. Lucas Spigariol
La reutilización es, probablemente, la más importante característica del paradigma orientado de Objetos. Si bien los lenguajes procedurales tamb tambié ién n pued pueden en ser ser reut reutil iliz izad ados os,, los los leng lengua uaje jes s de Objetos hacen la reutilización no sólo mucho más fácil, sino que la consideran como intrínseca de la configuración del lenguaje.
Abstracción de Datos La abstracción de datos permite diferenciar ent 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. A través de esta interfase un objeto emisor se comunica con otro objeto receptor, pero el objeto emisor desconoce la forma en que se lleva a cabo la acción solicitada (mensaje (mensaje). ).
Encapsulamiento
En la programación orientada a objeto, los objetos interactúan entre ellos a través de los mensajes. 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. O sea, la interfase encapsula los datos y código de un objeto. Esto permite al programador separar la implementación de un objeto, de su comportamiento. Esta separación crea una "caja negra" en donde el usuario está alejado de los cambios de la implementación. Mientras la interfase permanezca igual, cualquier cambio interno a la implementación es transparente al usuario. Por ejemplo, e jemplo, si el mensaje nombre es enviado al objeto Alumno, Alumno, al usuario no le importa cómo el programador implementó el código que maneja este mensaje. El prog progra rama mado dorr pued puede e camb cambia iarr la impl implem emen enta taci ción ón en cual cualqu quie ierr momento, pero el mensaje nombre aún debería trabajar ya que la interfase es la misma. Página 8
Manual de Smalltalk - Ing. Lucas Spigariol
Polimorfismo Otro beneficio que surge al separar la impleme ementación del comportamiento es el polimorfismo. polimorfismo. El polimorfismo permite a dos o más más obje objeto tos s resp respon onde derr al mism mismo o mens mensaj aje. e. Un méto método do llam llamad ado o nombre también podría ser implementado en un objeto de la clase Curso. Curso. Aunque la implementación de este mensaje nombre devolvería el número de curso y su nombre, su protocolo es el mismo que el mensaje nombre del objeto Alumno. Alumno. El polimorfismo polimorfismo permite a un obje objeto to emis emisor or comu comuni nicar carse se con con dife difere rent ntes es obje objeto tos s de una una manera consistente sin tener que preocuparse sobre las diferentes implementaciones de un mensaje. Una analogía del polimorfismo con la vida diaria es cómo los alumnos responden al timbre de la escuela. Todos los alumnos conocen el sign signif ific icad ado o del del timb timbre re.. Cuan Cuando do el timb timbre re (men (mensa saje je)) suen suena, a, sin sin embarg embargo, o, tiene tiene su propi propio o signif significa icado do para para cada cada alumno alumno (objet (objeto). o). Algunos alumnos irán a casa, otros a la biblioteca, y otros irán a clases. Cada alumno responde al timbre, pero su respuesta puede ser diferente. Otro ejemplo del polimorfismo es la función de imprimir. Cada objeto que puede ser impreso debe conocer como imprimirse. El mensaje es el mismo a todos los diferentes objetos: print, print, pero la implementación sobre qué deben hacer para imprimirse a sí mismos varía. El obje objeto to emis emisor or no nece necesi sita ta cono conoce cerr cómo cómo el obje objeto to rece recept ptor or implementa el mensaje. Sólo el objeto receptor se preocupa de ello. Suponga que existe un método printPage en un objeto Documento que tiene la responsabilidad de imprimir una página. Para imprimir una página, el método printPage envía el mensaje print a cada objeto de página. El objeto Documento no necesi necesita ta conoce conocerr qué tipos de objetos están en la página, sólo que cada uno soporta el comportamiento de la impresión. Nuev Nuevos os obje objeto tos s pued pueden en ser ser agre agrega gado dos s a la pági página na sin sin afec afecta tarr el método printPage. printPage. Este método sigue enviando el mensaje print y el nuevo objeto provee su propio método print en respuesta a ese mensaje. El polimorfismo permite al objeto emisor comunicarse con los objetos receptores sin tener que comprender qué tipo de objeto es, siempre y cuando el objeto receptor soporte los mensajes.
Página 9
Manual de Smalltalk - Ing. Lucas Spigariol
Herencia Otro concepto importante de la programación orientada a objetos es la herencia. herencia. La her herenci encia a per permite mite a una cla clase tene tenerr el mis mismo comportamiento que otra y extender o limitar ese comportamiento para proveer una acción especial a una necesidad específica. Supong Suponga a la sigui siguient ente e aplica aplicació ción. n. La clase clase Graduado y la clas clase e SinGraduar tienen tienen comportami comportamiento ento similar, similar, como por ejemplo, ejemplo, el mane manejo jo de nomb nombre re,, dire direcci cción ón,, carr carrer era, a, prom promed edio io,, etc. etc. En vez vez de colocar este comportamiento en ambas clases, el comportamiento es colo coloca cado do en una una nuev nueva a clas clase e llam llamad ada a Alumno. Alumno. Amba Ambas s clas clases es Graduado y SinGraduar se vuelven subclases de la clase Alumno, Alumno, y ambas heredan el comportamiento de Alumno. Alumno. Ambas mbas cla clases ses Graduado y SinGraduar pued pueden en agre agrega garr comp compor orta tami mien ento to adic adicio iona nall que que sea sea únic único o a ella ellas. s. Por Por ejem ejempl plo, o, Graduado pued puede e ser ser tant tanto o para para un doct doctor orad ado o o una una carr carrer era a de postgrado. Por otro lado, la clase SinGraduar puede querer conocer cómo un cierto alumno va en la carrera. Las clases que heredan de otras clases se llaman subclases. subclases. La clase, de la que una subclase hereda, es llamada superclase. superclase. En el ejemplo, Alumno es una superclase de Graduado y SinGraduar. SinGraduar. Graduado y SinGraduar son subclases de Alumno. Alumno.
Smalltalk Smalltalk es un modelo puro orientado a objetos lo que significa que todo todo,, en el ento entorn rno, o, es trat tratad ado o como como un obje objeto to.. Entr Entre e todo todos s los los lenguajes orientados a objetos, Smalltalk es el más consistente en cuanto al manejo de las definiciones y propiedades del paradigma orientado a objetos. Smal Smallt ltal alk k es más más que que un leng lengua uaje je,, es un exte extens nso o prog progra rama ma de entorno de desarrollo con numerosos clases y métodos. Las distintas versiones de Smalltalk presentan completos entornos de desa desarr rrol ollo lo para para la impl implem emen enta taci ción ón de apli aplica caci cion ones es orie orient ntad adas as a objetos. Los Smalltalk más comunes y simples de utilizar consisten de los siguientes componentes: •
Un model modelo o de ob objet jeto o a part partir ir del del cual cual los los obje objeto tos s está están n definidos: El modelo de objeto define cómo se comportan los objetos. Este modelo soporta la herencia, el comportamiento de
Página 10
Manual de Smalltalk - Ing. Lucas Spigariol
•
•
•
clases e instancias, la asociación dinámica (binding dinámico), el manejo de mensajes, y las colecciones. Un conjunto de clases reutilizables: reutilizables: Smalltalk tiene una gran cantidad de clases que pueden ser reutilizadas en cualquier programa Smalltalk. Estas clases proveen las funciones básicas en Smal Smallt ltal alk, k, adem además ás del del sopo soport rte e par para la port portab abil ilid idad ad a dife difere rent ntes es plat plataf afor orma mas, s, incl incluy uyen endo do la port portab abil ilid idad ad de las las inte interf rface aces s gráf gráfic icas as de usua usuari rio; o; tamb tambié ién n se enca encarg rgan an de la definición y manejo de las clases. Existe un núcleo de clases estándar compartidas por los más conocidos fabricantes, a la que se agregan otras clases que permiten realizar funcionalidades específicas. Un conjunto de herr herram amie ient ntas as de desa desarr rrol ollo lo:: Estas herramientas habilitan a los usuarios a mirar y modificar las clases existentes, renombrar clases, agregar nuevas clases, y borrar clases. También proveen detección de errores a nivel fuente, incluyendo la habilidad de poder realizar seguimientos, observar datos, modificar datos, y realizar cambios al código en tiempo de ejecución de un programa. Un entorn entorno o en tiemp tiempo o de ejecuc ejecución ión:: Esto permite a los usua usuari rios os a ejec ejecut utar ar un prog progra rama ma en Smal Smallt ltal alk k mien mientr tras as se camb cambia ia el códi código go fuen fuente te.. Los Los camb cambio ios s real realiz izad ados os al códi código go fuente son reflejados instantáneamente en la aplicación que se está ejecutando.
Una de las mejores características de Smalltalk es el alto grado de reutilización. reutilización. Small Smalltal talk k contie contiene ne un gran gran conju conjunto nto de objetos que pueden ser utilizados directamente, o fácilmente modificados para satisf satisface acerr la necesi necesidad dad de una una aplica aplicació ción n en genera general. l. Lo objeto objetos s suelen ser utilizados en más de una aplicación. Esto permite una mejora en la productividad, y una calidad en la zona de trabajo.
Página 11
Manual de Smalltalk - Ing. Lucas Spigariol
Capítulo 2: Objetos, Clases y Mensajes Presentación sintética: •
•
•
Todo el procesamiento de Smalltalk consiste en el envío de mensajes a objetos. objetos. Los tres tipos de mensajes son: unarios, unarios, binarios, y de palabra clave. clave. 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 Smalltalk consiste en el nombre del del obje objeto to que que reci recibe be el mens mensaj aje, e, segu seguid ido o del del nomb nombre re del del mensaje y sus argumentos (si los tuviera).
Objetos y Clases Existe Existen n muchos muchos objeto objetos s en el entor entorno no Small Smalltal talk. k. Los objeto objetos s que responden a los mismos mensajes con el mismo comportamiento y que tienen la misma estructura interna de datos, se clasifican juntos en lo que se denomina una Clase. Clase. Es la Clase la que determina como es y cómo actúa cada objeto. Todo Objeto es instancia de alguna clase en particular. En Smalltalk todo es un objeto, incluyendo la definición de una clase, que es una instancia de una clase llamada Metaclase. Sin entrar en detalles de las implementaciones es importante tener en cuenta que una clase, en su esencia, también es un objeto y en consecuencia también se comporta como tal. Prog Progra rama marr en Smal Smallt ltal alk k cons consis iste te en crea crearr nuev nuevas as clas clases es,, crea crearr instancias de clases, y especificar una secuencia de intercambios de mensajes a través de todos estos objetos.
Creación de una Clase
Página 12
Manual de Smalltalk - Ing. Lucas Spigariol
Las clases son creadas en el entorno de desarrollo, usando uno de los examinadores (browsers) de clases o aplicaciones. Los pasos a seguir, son los siguientes: •
• •
•
Seleccione la clase que será "padre" o superclase de la nueva clase. Solicite agregar una nueva clase. Cuando se le pida ingrese el nombre de la nueva clase, no olvide que la primera letra del nombre debe ebe estar en mayúscula. Cuando se le pida el tipo de subclase, seleccione subclase.
Cuando termine, la ventana del examinador mantendrá una expresión en el área de texto. Esta expresión fue utilizada para crear la clase. Ahora puede ser modificada para cambiar y extender la clase. Tenga en cuen cuenta ta que que los los cuat cuatro ro paso pasos s aquí aquí desc descri rito tos s pued pueden en vari variar ar levemente para cada plataforma particular de Smalltalk. Para ver un ejemplo concreto de la creación de una clase suponga que la expresión para una nueva clase es TrenElectrico, TrenElectrico, un juego compuesto por los trenes, vías, cruces, etc.; todo lo necesario para armar un circuito por donde pasa el tren eléctrico. ¿Cómo aparecerá en el examinador?, de la siguiente manera: Object subclass: #TrenElectrico instanceVariableNames:: ' ' instanceVariableNames classVariableNames: classVariableNames: ' ' poolDictionaries: ' '
Las variables de instancia se agregan por medio del ingreso de sus nombres entre las comillas simples, que se encuentran después de instanceVariableNames:.. instanceVariableNames: Object subclass: #TrenElectrico instanceVariableNames:: 'motor carros casas vías cruces ' instanceVariableNames classVariableNames: classVariableNames: ' ' poolDictionaries: ' '
Si la nueva clase TrenElectrico tuviera uno o muchos diccionarios compartidos y/o variables de clase, se agregarán de la misma forma que antes, entre las comillas simples que siguen a poolDicionaries y a clas classV sVar aria iabl bleN eNam ames es,, resp respec ecti tiva vame ment nte. e. Con Con esto estos s camb cambio ios, s, el examinador presentará lo siguiente: Object subclass: #TrenElectrico instanceVariableNames:: 'motor carros casas vías cruces' instanceVariableNames classVariableNames: classVariableNames: ' DiagramaDeVías ' poolDictionaries: ' Trenes '
Página 13
Manual de Smalltalk - Ing. Lucas Spigariol
Envío de Mensajes Los mensajes a los que un objeto puede responder están definidos en el protocolo de su clase. clase. El cómo estos mensajes se ejecutan o son implementados está definido en los métodos de la clase. Los métodos dan los detalles de implementación para los mensajes, y representan el comportamiento de la clase. Todo el procesamiento de Smalltalk se realiza por medio del envío de mensajes a objetos. Un enfoque inicial de la resolución de problemas, en Smalltalk, es tratar de reutilizar los mensajes y objetos existentes. El programador de Smalltalk, trabaja para desarrollar una secuencia objeto-mensaje que proveerá la solución deseada. Por convención, todos los nombres de clases comienzan con una letra en mayú mayús scul cula, como como por ejem ejemp plo "Alumno" Alumno". Los nombres de mensajes comien comienzan zan con una letra letra en minúsc minúscul ula a y pueden pueden tener tener cualquier combinación de letras y números sin espacios en blanco. Cuando el nombre de un mensaje contiene más de una palabra, las palabras extras comienzan con una letra en mayúscula. Un nombre válido de mensaje podría ser "unMensaje "unMensaje"" o "miDirección "miDirección." ." Un mensaje como "dame tu nombre" podría ser "dameTuNombre "dameTuNombre". ". Sin embargo se trata de acortar los nombres de mensajes, pues es muy difícil trabajar con nombres largos; por lo tanto el nombre de mensaje adecuado sería "nombre "nombre". ".
Formato de un Mensaje En general, una expresión Smalltalk consiste en el nombre del objeto que recibe el mensaje, seguido por el nombre del mensaje. Por ejemplo: unObjeto unMensaje
Para aquellos mensajes que necesitan pasar argumentos al objeto receptor, como los mensajes de palabra clave, al nombre del objeto rece recept ptor or le sigu sigue e el nomb nombre re del del mens mensaj aje e y su argu argume ment nto. o. Los Los argumentos se separan por medio de un espacio en blanco. unObjeto unNumero: 1 unNombre: 'Pedro'
Existe Existen n tres tres tipos tipos de mensaj mensajes: es: unarios, unarios, binarios y de palabra clave. clave.
Página 14
Manual de Smalltalk - Ing. Lucas Spigariol
Mensajes Unarios Un mensaje mensaje Unario Unario es simi simila larr a la llam llamad ada a de una una func funció ión n con con parámetro único. Este tipo de mensaje consiste de un nombre de mensaje y un operando. Los objetos se colocan antes del nombre del mensaje. 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" Date" "devuelve el factorial de 5" "Envía la cadena 'hola' a la impresora"
En esto estos s ejem ejempl plo os 'x', 'x', 'Dat 'Date' e',, '5', '5', y 'ho 'hola' son son objetos etos y 'si 'sin', 'tomorrow', 'factorial', y 'outputToPrinter' son nombres de mensajes.
Mensajes Binarios Los mensajes mensajes Binario Binarios s son utilizad utilizados os para especificar especificar operacio operaciones nes aritméticas, lógicas y de comparación. Un mensaje binario puede ser de uno uno o dos dos cara caract cter eres es de long longit itud ud y pued puede e cont conten ener er cual cualqu quie ierr combinación de los siguientes caracteres especiales: +/\*~<>=@%|&?!,
Lo siguientes son ejemplos de expresiones en Smalltalk, 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, 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'". 'b'".
Mensajes de Palabra Clave Un mensaje de Palabra Clave es equivalente a una llamada de un proc proced edim imie ient nto o con con dos dos o más más pará paráme metr tros os.. Obse Observ rve e el sigu siguie ient nte e ejemplo, el nombre del objeto, al cual el mensaje es enviado, se escribe primero, luego el nombre del mensaje (o nombre del método) y luego el parámetro que se pasa. unObjeto unMensaje: parametro
Página 15
Manual de Smalltalk - Ing. Lucas Spigariol
Los dos puntos (:) son una parte esencial del nombre del mensaje. Cuan Cuando do hay hay más más de un pará paráme metr tro, o, el nomb nombre re del del mens mensaj aje e debe debe aparecer para cada parámetro. 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:
unDia month: esteMes year: esteAnio del objeto
"Establece los datos privados UnDia a month = esteMes y year =
esteAnio" alumno nombre: 'Juan' direccion: 'Junín 51' variables de
"Establece el valor de las inst instan anci cia a del del obje objeto to Alumno de
acuerdo a los parámetros"
Orden de Ejecución de los Mensajes Las reglas que usa Smalltalk en la decisión del orden de ejecución de los mensajes, puede resumirse en los siguientes pasos: 1. Smalltal Smalltalk k ejecuta ejecuta mensajes mensajes de izquier izquierda da a derecha. derecha. 2. El resul sultado tado de un men mensaj saje reemp eempllaza aza al mens ensaje aje en la sentencia. 3. Small Smalltal talk k ejecut ejecuta a prime primero ro todas todas las las expres expresio iones nes que aparec aparecen en entre paréntesis, comenzando por la izquierda, y por aquella que está más anidada. 4. Dent Dentro ro de una una expr expres esió ión, n, los los mens mensaj ajes es unar unario ios s se ejecu ejecuta tan n primero, luego los mensajes binarios, y finalmente los mensajes de palabra clave; siempre de izquierda a derecha. 5. Small Smalltal talk k ejecut ejecuta a todos todos los los mensaj mensajes es binari binarios os de izquierd izquierda a a derecha, independientemente de las operaciones que realicen. Esto Esto sign signif ific ica a que que no hay hay un orde orden n espe especi cial al para para ejec ejecut utar ar operaciones aritméticas. 6. Un Una a expr expres esiión puede uede incl ncluir el nombr mbre de una una vari ariabl able. Smalltalk reemplaza el nombre de la variable con el objeto al que ella apunta.
Página 16
Manual de Smalltalk - Ing. Lucas Spigariol
Métodos de clase Un método de clase es la implementación de un mensaje cuyo receptor es la clase misma. Los métodos de clase proveen un comportamiento de clase . Tienen las
mis mismas mas conv conven enci cion ones es de nomb nombrrami amiento ento que que los méto método dos s de instancia. Uno de los principales usos de los métodos de clase, es poder crear nuevas instancias de una clase. La siguiente instrucción envía el mensaje de clase new a la clase Alumno. Cada Cada clas clase e cont contie iene ne el mens mensaj aje e new. new. El mens mensaj aje e new retorna una nueva instancia. Alumno new
En el sigu siguie ient nte e ejem ejempl plo, o, la vari variab able le miAlumno apun apunta ta al nuev nuevo o objeto Alumno: Alumno: miAlumno := Alumno new
En Small Smalltal talk, k, la expres expresión ión := es la sint sintax axis is para para la func funció ión n de asigna asignació ción. n. La variab variable le de la izquie izquierda rda apunta apunta al resul resultad tado o de la expresión de la derecha. Una vez ejecutada la sentencia de arriba, los mensajes pueden ser envi enviad ados os a miAlumno, miAlumno, que que apu apunta nta a una una insta nstanc nciia del del objet bjeto o Alumno. Alumno. 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. miAlumno. En vez de duplicar el código que ya exi existe ste en los méto étodos dos nombre: y direccion:, direccion:, el método nombre:direccion: se implementa ejecutando los métodos nombre: y direccion:. direccion:. Dado que nombre: y direccion: son método métodos s del mismo mismo objeto objeto que nombre:direccion:, nombre:direccion:, debe debe existi existirr alguna alguna forma forma para que un método pueda referirse al objeto en el cual existe.
Página 17
Manual de Smalltalk - Ing. Lucas Spigariol
Este es el propósito de self. Un método puede acceder otros métodos en su propio objeto especificando self como self como el receptor del mensaje.
Observe el código para estos tres métodos: nombre: unNombre nombre := unNombre direccion: unaDireccion direccion := unaDireccion nombre: unNombre direccion: direccion: unaDireccion self nombre: unNombre. self direccion: unaDireccion
El uso de self hace que Smalltalk envíe los mensajes nombre: y direccion: a la instancia actual de Alumno, Alumno, la misma instancia que recibió el mensaje nombre:direccion:. nombre:direccion:. En el ejemplo, los métodos nombre: y direccion: definiero definieron n sus variables temporales con el mismo nombre que las definió el método nombre:direccion:. nombre:direccion:. No hay ninguna relación entre estos nombres y no están obligados a ser los mismos. El alcance de las variables temporales de un método es local, o sea sólo en ese método. Por ejemplo, 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 alor a las var variabl ables, es, en vez vez de usar lo métod étodo os nombre: y direccion:. direccion:. Esto se implementaría de esta forma: nombre: unNombre direccion: unaDireccion nombre := unNombre. direccion := unaDireccion
Sin embargo embargo es mejor mejor central centraliza izarr la asigna asignació ción n de variab variables les dentro dentro de un método método simple. Lo mismo se aplica a la obtención de los contenidos de una variable.
Página 18
Manual de Smalltalk - Ing. Lucas Spigariol
Capítulo 3: Instrucciones Smalltalk Presentación sintética: Existen varias reglas que gobiernan la sintaxis y gramática en que son son escr escrit itas as las las inst instru rucc ccio ione nes s de Smal Smallt ltal alk. k. Un Una a inst instru rucc cció ión n de Smal Smallt ltal alk, k, adem además ás de cont conten ener er mens mensaj ajes es,, pued puede e cont conten ener er una una instrucción de asignación (determinar el contenido específico de una variable dada), o devolver una expresión. La sintaxis de Smalltalk consiste de: •
•
•
•
•
Instrucciones: consisten en una o más expresiones Smalltalk válidas. Asignaciones: apunta la variable a la izquierda de := al valor de retorno de la instrucción de la derecha. Comentarios: son son cual cualqu quiier agr agrupaci pació ón de carac aractteres eres encerrados entre dobles comillas. 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.
Instrucciones En Smalltal Smalltalk, k, el código código ejecutable ejecutable está formado formado por instruccione instrucciones. s. Cada Cada inst instru rucc cció ión n tend tendrá rá una una o más más expr expres esio ione nes s Smal Smallt ltal alk. k. Un Una a expresión válida de Smalltalk puede ser cualquiera de las siguientes: • • •
Un nombre de variable Una literal Un envío de mensajes
Cada ada inst nstrucci ucció ón se sep separa ara por por un punt unto, exce except pto o la última tima inst instru rucc cció ión. n. Si una una inst instru rucc cció ión n tien tiene e más más de una una expr expres esió ión, n, la inst instru rucc cció ión n se ejecu ejecuta ta de acue acuerd rdo o al orde orden n de ejec ejecuc ució ión n de los los mensajes discutido en el capítulo anterior
Página 19
Manual de Smalltalk - Ing. Lucas Spigariol
Cuando Smalltalk procesa cada mensaje, la instrucción en el mensaje se reemplaza por un valor retornado, que es el resultado de ejecutar el mensaje. El siguiente es un ejemplo del método nombre:direccion: de la clase Alumno: Alumno: nombre: unNombre direccion: unaDireccion self nombre: unNombre. self direccion: unaDireccion
Note Note que que la prim primer era a líne línea a es la defini definició ción n de la interf interfase ase de un método, y que no termina con un punto (.). La línea final no necesita un punto final, porque es el final del método. El punt punto o es opci opcion onal al para para la últi última ma inst instru rucc cció ión n de un méto método do.. Smalltalk separa las instrucciones ejecutables por medio del punto. Como resultado, múltiples instrucciones instrucciones pueden aparecen en una sola línea; o una sola instrucción puede aparecer en muchas líneas. El ejemplo anterior puede ser escrito de la siguiente manera: nombre: unNombre direccion: unaDireccion self nombre: unNombre. self direccion: unaDireccion
Para que el código sea más fácil de leer, no se suele tener más de una instrucción en una sola línea. Las líneas en blanco son ignoradas por Smalltalk.
Asignación Una asignación cambia el valor del objeto al que apunta una variable. En Smalltalk, una variable apunta a un objeto en vez de guardarlo. guardarlo. Se dice que una variable contiene al identificador del objeto. La sintaxis para una instrucción de asignación es: variable := instrucción
dond donde e la variable pued puede e ser ser un nomb nombre re dent dentro ro del del alca alcanc nce e del del método, y la instrucción puede ser cualquier instrucción válida de Smalltalk. Por ejemplo: x := 7. k := 'algunos caracteres'. unaVariable := j * k.
Página 20
Manual de Smalltalk - Ing. Lucas Spigariol
Devolución de Valores En Smalltalk, un mensaje siempre devolverá un valor. La devolución por defecto, es el receptor del objeto. Un método puede anular su valor de retorno por defecto, colocando un símbolo de intercalación (^) (^) adel adelan ante te de una una inst instru rucc cció ión. n. Cuan Cuando do se encu encuen entr tra a un ^, el método finaliza la ejecución y devuelve el valor de la instrucción que le sigue al símbolo de retorno ^. Por ejemplo: ^instrucción
Se retorna el resultado de la instrucción, donde instrucción puede ser cual cualqu quie ierr inst instru rucc cció ión n váli válida da.. Un Una a expr expres esió ión n de reto retorn rno o apar aparec ece e norm normal alme ment nte e adel adelan ante te de la últi última ma inst instru rucc cció ión n de un méto método do,, o adel adelan ante te de una una inst instru rucc cció ión n que que se ejec ejecut uta a como como part parte e de una una inst nstrucci ucció ón de con control trol.. El sig siguien uientte ejem ejempl plo o es una prác prácti tica ca importante, porque pone de manifiesto que la instrucción de retorno finaliza la ejecución del método en la que se encuentra. Por Ejemplo: y := y + 7. ^y "devuelve el valor de y"
La instrucción también puede ser escrita como: ^y := y + 7.
"devuelve el valor de y"
Para devolver el valor de y de y + + 7 sin modificar el valor de y de y : ^y + 7
"devuelve el valor de y + 7, 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. Este código devuelve el valor de a si a es mayor que b, caso contrario devuelve el valor de b. En la instrucción ^a, ^a, la expresión es la variable a y el valor retornado valor retornado de la expresión es el valor de a. El valor de una instrucción siempre es equivalente a la última expresión ejecutada en la instrucción. Para las instrucciones que poseen más de un mensaje, el valor de retorno equivale al valor del último mensaje ejecutado.
Página 21
Manual de Smalltalk - Ing. 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 mens mensaj aje e nombre se enví envía a al obje objeto to apun apunta tado do por 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:, nombre:, porque es el últi últim mo mensa ensajje en ejec ejecut utar arse se.. El mens mensaj aje e nombre: no espe especi cifi fica ca un valo valorr de reto retorn rno, o, por por lo que que devu devuel elve ve el valo valorr por por defecto. ¿Cuál es el valor por defecto? El valor por defecto siempre es self , que es el receptor receptor del mensaje. Por lo tanto, en este ejemplo, ejemplo, el valor de retorno es la instancia Alumno creada por el mensaje new (el receptor del mensaje nombre:). nombre:).
Comentarios En Smalltalk, los comentarios se encierran entre comillas dobles, tal como: "esto es un comentario en Smalltalk"
Es una convención aceptada el tener comentarios al principio de un método método,, para para expli explicar car su compor comportam tamien iento, to, inclu incluyen yendo do su valor valor de retorno. Por ejemplo: nombre "Devuelve el nombre del alumno receptor." ^nombre
Cuando Smalltalk ejecuta un método, ignora todos los comentarios. Esto significa que un comentario puede aparecer en cualquier lado, siempre y cuando sea colocado entre dobles comillas.
Variables Temporales
Página 22
Manual de Smalltalk - Ing. Lucas Spigariol
Las variables temporales están definidas en la definición de interfase de un método. Por ejemplo: nombre: unNombre direccion: unaDireccion
En la instrucción hay definidas dos variables temporales: unNombre y unaDireccion. unaDireccion. Estas variables temporales contienen los argumentos pasados en el mensaje nombre:direccion:. nombre:direccion:. Un método puede tener más variables temporales, listándolas entre barras verticales ('|' pipeline), Por ejemplo: | nuevoNombre nuevaDireccion |
Esta instrucción no termina con un punto. El nomb nombre re de una una vari variab able le temp tempor oral al comi comien enza za con con una una letr letra a en minúscula, y debe ser único dentro del método. Esto significa que no puede duplicar el nombre de una variable de instancia, ni duplicar el de una variable temporal definida en una interfase, así como tampoco puede duplicar el nombre de una variable temporal cualquiera.
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." | nuevoValor | nuevoValor := algunaEntrada * 2. ^nuevoValor
Este método no tiene mayor significado que el de ilustrar el aspecto básico de un método. •
•
•
La prim primer era a líne línea a defi define ne la inte interf rfas ase e del del méto método do,, así así como como también al nombre del método. Este método es un método de pala palabr bra a clav clave e con con un argu argume ment nto. o. El nomb nombre re del del méto método do es unMétodoEjemplo y la variable temporal es algunaEntrada. algunaEntrada . La segunda línea es un comentario describiendo lo que hace el método. La tercera línea es una declaración de una variable temporal adicional llamada nuevoValor. nuevoValor . Esta variable temporal es local sólo dentro de este método. Página 23
Manual de Smalltalk - Ing. Lucas Spigariol
•
La cuarta y la quinta línea contienen la lógica del método. Un punto es opcional opcional para la última línea de un método. método. La última última línea contiene una expresión de retorno, que no será necesaria a meno menos s que que se expl explic icit ite e un valo valorr de reto retorn rno o dife difere rent nte e al receptor del mensaje.
Sin embargo este método no contiene un código eficiente. Define una variable que mantiene el resultado de la multiplicación, y luego usa esa variable temporal sólo en la instrucción de retorno. De modo que el método puede simplificarse así: unMétodoEjemplo: algunaEntrada "Esto es un ejemplo de un método." ^algunaEntrada * 5
La expresión de retorno primero procesa todas las instrucciones que apar aparec ecen en a su dere derech cha a y lueg luego o devu devuel elve ve el valo valorr de la últi última ma expresión ejecutada. En este ejemplo el resultado del mensaje de multiplicación multiplicación es el valor de retorno.
Bloques Los bloques son son corc corche hete tes s que que cont contie iene nen n ning ningun una a o much muchas as expr expres esio ione nes, s, y un códi código go que que real realiz iza a iter iteraci acion ones es o ejec ejecuc ucio ione nes s condic condicio ional nales. es. Por ejempl ejemplo, o, un bloque bloque de códig código o es utili utilizad zado o para para especificar qué ejecutar como resultado de una condición verdadera o falsa: ifTrue: [x := 2] ifFalse: [x := 5]
Un bloq bloque ue pued puede e pens pensar arse se como como un mini mini-m -mét étod odo o dent dentro ro de un método. Las siguientes reglas se aplican a los bloques: •
•
•
Un bloque puede contener cualquier número de instrucciones válidas ejecutables, o cualquier número de comentarios. Cada instrucción debe terminar con un punto, excepto cuando se definen las variables temporales, y en la última instrucción del bloque, donde el punto es opcional. Un bloque tiene acceso a las mismas variables que el método al que pertenece.
Como un bloque es parte de un método no posee una definición de interfase de método. El bloque en la siguiente instrucción: ifTrue: [x := 2]
Página 24
Manual de Smalltalk - Ing. Lucas Spigariol
es llamado bloque de cero-argumento; cero-argumento; no puede aceptar ningún argume argumento nto.. Sin Sin embarg embargo o es posib posible le defini definirr un bloque bloque que pueda pueda tomar argumentos, como el siguiente: [:variable1 | código] [:variable1 :variable2 | código]
donde variable1 y variable2 son variables temporales y son válidas sólo sólo dent dentro ro del del alcan alcance ce del del bloq bloque ue.. El nomb nombre re de la vari variab able le es precedido por dos puntos ':'. Por ejemplo: [:unNumero | x * unNumero]
La vari variab able le unNumero está está defi defini nida da dent dentro ro del del bloq bloque ue.. Esta Esta inst instru rucc cció ión n mult multip ipli lica ca una una vari variab able le llam llamad ada a x por por el argu argume ment nto o pasado en el bloque. La variable x debe estar dentro del alcance del método en donde se encuentra el bloque. En el próximo capítulo serán discutidos en más detalle los bloques, y los mensajes que requieren bloques como argumento.
Mensajes en cascada Algu Alguna nas s vece veces s es nece necesa sari rio o envi enviar ar a un obje objeto to vari varios os mens mensaj ajes es consecutivos. Como ejemplo, revea el siguiente código: nombre: unNombre direccion: unaDireccion telefono: unTelefono "Determina el nombre, dirección y teléfono de una instancia Alumno." self nombre: unNombre. self direccion: unaDireccion. self telefono: unTelefono
Self es el receptor de los mensajes para todas las instrucciones del méto método do.. Para Para ejec ejecut utar ar los los mens mensaj ajes es corr correc ecta tame ment nte, e, nece necesi sita tan n apar aparece ecerr en inst instru rucc ccio ione nes s sepa separa rada das. s. Se exam examin inar ará á qué qué ocur ocurre re cuando self es self es seguido por todos estos mensajes de palabra clave sin ninguna separación: self nombre: unNombre direccion: unaDireccion telefono: unTelefono.
Dado que Smalltalk permite el agrupamiento de todas las palabras clave en una sola expresión, el mensaje nombre:direccion:telefono sería enviado al receptor como una expresión válida. 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). Para evitar esto, cada palabra clave debe estar en una instrucción separada. Página 25
Manual de Smalltalk - Ing. Lucas Spigariol
Si las tres instrucciones se combinan en una sola con self adelante self adelante de cada palabra clave, de la siguiente manera: self self nomb nombre re:: unTelefono.
unNo unNomb mbre re self self dire direcc ccio ion: n: unaD unaDire irecc ccio ion n
self self tele telefo fono no::
Smalltalk evalúa el segundo self en la instrucción como un mensaje enviado al objeto unNombre. unNombre. Evalúa al último self como self como un mensaje enviado al objeto unaDireccion. unaDireccion. Esto causa un error de ejecución, ya que self no self no es un mensaje soportado por ninguno de esos dos objetos. Exis Existe te una una form forma a de acor acorta tarr el códi código go que que perm permit ite e trab trabaj ajar ar con con instr instrucc uccio iones nes consec consecuti utivas vas.. La primer primera a instru instrucci cción ón se escrib escribe e de manera normal, pero todas las instrucciones sucesivas pueden omitir al objeto receptor. Cada instrucción termina con un punto y coma (;) en vez de con un punto (.), exceptuando exceptuando a la última última instrucción instrucción para la que el punto es opcional. El método del Ejemplo 3.3 puede se escrito de la siguiente forma: nombre: unNombre direccion: unaDireccion telefono: unTelefono "Determina el nombre, dirección y teléfono de una instancia Alumno." self nombre: unNombre; direccion: unaDireccion; telefono: unTelefono
La primera instrucción se escribe de manera normal, excepto que termina con un punto y coma. El objeto receptor del último mensaje en esta secuencia, se vuelve el objeto receptor del primer mensaje en la siguiente instrucción. instrucción.
Página 26
Manual de Smalltalk - Ing. Lucas Spigariol
Capítulo 4: Operaciones con Datos Presentación sintética: ¿Cómo hace Smalltalk para tratar con datos, comparaciones lógicas, iteración y otras funciones condicionales? “Todo en Smalltalk es un objeto objeto”, ”, es por esto esto que Small Smalltal talk k implem implement enta a todos todos los tipos tipos de datos como clases de Smalltalk, y las operaciones sobre datos como los métodos de estas clases. A diferencia de los lenguajes procedurales donde los tipos de datos y operaciones son definidos como parte de la sintaxis del lenguaje, Smalltalk no conoce los tipos de datos o las operaciones sobre datos. Los nuevos datos pueden ser creados como instancias de una clase. Las operac operacion iones es sobre sobre datos datos se reali realizan zan envian enviando do un mensaj mensaje e al objeto. •
•
•
Un literal puede ser utilizado explícitamente para definir datos. Un literal puede ser un número (Number), una cadena (String), un cará caráct cter er (Cha (Chara ract cter er), ), un símb símbol olo o (Sym (Symbo bol) l),, o un vect vector or (Array) de literales. Las operaciones sobre datos, datos , incluyendo las comparaciones lógic lógicas, as, las operac operacio iones nes aritmé aritmétic ticas, as, las operac operacion iones es lógic lógicas as usando "and" y "or", los condicionales lógicos, y las iteraciones, son implementadas como métodos en sus respectivas clases. Todas las variables inicialmente apuntan al objeto nil. nil. Este valor es una instancia de una clase llamada UndefinedObject .
Literales Smalltalk provee soporte para los literales como instancias de cinco clases: Strin tring g (cad cadena), na), Number (núm (númer ero o), Chara haract cter er (carácter), Symbol (símbolo) y Array (vector). (vector). Las Las subc subcla lase ses s de Number: Number: Integ Integer er (ente (entero) ro),, Flo Float at (real) (real),, y Fraction (fracción) son parte de los literales también.
Página 27
Manual de Smalltalk - Ing. 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)
123 -234 3/4 -1/7 4.564 -2.34e10 .23 59. 2.4e.7
"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 "ERROR Un número no puede comenzar con un punto decimal" "ERROR "ERROR Un número no puede terminar con un punto decimal" "ERROR "ERROR El exponente debe ser un entero"
Character Un character (carácter) es cualquier carácter ASCII precedido por el signo $, tal como $G o $@. 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. Por ejemplo: 'Esto es una cadena.' 'Las cadenas pueden contener esto %@#^|\' nuevoAlumn nuevoAlumno o nombre: nombre: 'Pedro' 'Pedro' "Determin "Determina a el argumento argumento del mensaje mensaje nombre: como una cadena."
Symbol Un symbol symbol (símbolo (símbolo)) es un identi identific ficado ador, r, select selector or binari binario, o, o un selector de palabra clave, precedido por un signo numeral, #. Todos los símbolos son únicos. #nombre #+ #at:put:
"un identificador" "un selector binario" "un selector de palabra clave"
Página 28
Manual de Smalltalk - Ing. Lucas Spigariol
Array Un array array (vector) (vector) es una una estr estruc uctu tura ra de dato datos s cuyo cuyos s elem elemen ento tos s pueden ser cualquier objeto válido. Un vector literal es una secuencia inde indexa xada da de otro otros s lite litera rale les. s. Un vect vector or se cara caract cter eriz iza a por por esta estarr encerrado entre paréntesis y precedido por un signo numeral (#). Por ejemplo: #('u #('uno no'' 'dos 'dos'' 'tre 'tres' s' 'cua 'cuatr tro' o')) cadenas" #(1 2 3 4) enteros" #(1 'dos' $Y)
"Pro "Produ duce ce
un
vect vector or
de
cuat cuatro ro
"Pro "Prod duce uce
un
vecto ectorr
con
cua cuatro
"Produce un vector con un entero, una cadena, y un caracter"
Operaciones Aritméticas Una instr instrucc ucció ión n que reali realiza za 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. "devuelve 7" 9 // 4. "devuelve 2" 9 \\ 4. "devuelve 1" |xy| x := 2. y := 6. x*y
"devuelve 12"
Nil En Smalltalk, nil es un objeto que significa "nada " nada". ". Inicialmente todas las variables apuntan a nil. nil. Cualquier variable puede ser apuntada a nil durante la ejecución, con una instrucción como la siguiente: UnaVariable := nil.
Página 29
Manual de Smalltalk - Ing. Lucas Spigariol
Nil también puede usarse como un valor de retorno para indicar que una una oper operac ació ión n no fue fue exit exitos osa. a. Por Por ejem ejempl plo, o, la sigu siguie ient nte e lógi lógica ca devuelve nil si un argumento es no positivo, 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 unaP unaPot oten enci cia. a. Devu Devuel elve ve nil nil si unaP unaPot oten enci cia a es no posi positi tiva va.. Caso Caso contrario, devuelve el resultado." unaPotencia < 0 ifFalse: [^nil]. ^aNumber raisedTo: aPower
True y false En Smalltalk los valores true y false son provistos por las clases True y False, False, resp respec ecti tiva vame ment nte e y repr repres esen enta tan n los los valo valore res s bool boolean eanos os utilizados en toda expresión condicional y comparación lógica.
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, cadenas, caracteres, y símbolos símbolos;; y comparación puede puede ser cualq cualquie uierr opera operació ción n válida válida de comparación. 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), (falso), que son instancias de las clases True y False, False, respectivamente. Los siguientes son algunos ejemplos de comparaciones lógicas: 3>8 "devuelve false" $e <= $f "devuelve true" |ij| i := 3.
Página 30
Manual de Smalltalk - Ing. Lucas Spigariol
j := 7. i == j
"devuelve false"
La comparación "==", en el último ejemplo, compara si dos objetos son el mismo objeto, en vez de comparar si son iguales en valor.
"y" Lógico y "o" Lógico En Smalltalk, las expresiones booleanas pueden ser combinadas en un result resultado ado,, usando usando la operac operació ión n o, o la operación y . Estas dos funciones pueden ser utilizadas como mensajes binarios o mensajes de palabra clave. El mensaje binario para el y lógico es &, y para el o lógico es |. Por ejemplo: (a > 0) & (b < 0)
"Devuelve true si a es positivo y b es negativo. Caso contrario devuelve false." false."
(a > 0) 0) | (b < 0) "Devuelve true si a es positivo y/o b es negativo. Caso contrario devuelve false." false."
Una senten sentencia cia puede puede conten contener er un número número ilimi ilimitad tado o de mensaj mensajes es binarios. Por ejemplo: |xyz| x := 3. y := 5. z := 7. (x > 0) & (y < 0) | (x > y) & (y = z)
El mensaje de palabra clave para y para y lógico lógico es and:, and:, y para o lógico es or:. or:. 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. false. El bloque de código encerrado entre corchetes debe devolver un valor de true o false. false. Los métodos and: y or: combinan los dos valores booleanos y devuelve el resultado correspondiente. Existe una diferencia entre los mensajes binarios & y |, y los mensajes de pala palabr bra a clav clave e and: y or:, or:, respec respectiv tivame amente nte.. Los mensaj mensajes es de pala palabr bra a clav clave e son son cons consid ider erad ados os cami camino nos s cort cortos os porq porque ue util utiliz izan an evaluación diferida. diferida. El código en el bloque no es evaluado hasta que el valor del receptor booleano no es determinado como true o false.
Página 31
Manual de Smalltalk - Ing. Lucas Spigariol
En el caso del mensaje and:, and:, si el receptor evalúa false, false, entonces el código del bloque no se ejecuta, ya que en una operación and con un false siempre es false. En el caso del mensaje or:, or:, si el receptor evalúa true, true, entonces el código del bloque no se ejecuta, ya que en una operación or con or con un true siempre es true. El siguiente es un ejemplo utilizando mensajes de palabra clave: |xyz| x := 3. y := 5. z := 7. (((x > 0) and: [y < 0]) or: [x > y]) and: [y = z]
Not El mensaje unario not provee not provee la función not. not. Este mensaje invierte un valor valor boole booleano ano (true se vuelve vuelve false, false, o false se vuelve vuelve true). true). El formato es: booleano not
El siguiente es un ejemplo: (5 > 1) not
"El valor de retorno es false." false."
Lógica Condicional La lógica condicional permite la ejecución del código dependiendo de un valor valor boolea booleano. no. Exist Existen en vario varios s mensaj mensajes es de palabr palabra a clave clave que proveen esta función, por ejemplo: booleano ifTrue: [código] ifFalse: [código].
donde booleano es cualquier expresión que resulte true o false. false. La expresión [código] puede ser cualquier bloque de cero-argumentos. cero-argumentos. El mensaje de palabra clave ifTrue:ifFalse ejecuta un bloque diferente dependiendo del valor del booleano. Por ejemplo: | x y nuevoValor | x := 1. y := 2. (x > y) ifTrue: [nuevoValor := x] ifFalse: [nuevoValor := y].
Página 32
Manual de Smalltalk - Ing. Lucas Spigariol
^nuevoValor
Este ejemplo determina el valor de la variable nuevoValor al nuevoValor al valor del mayor entre x entre x o o y , en este caso y caso y , y devuelve el valor en nuevoValor .
Iteraciones Smalltalk soporta cuatro tipos tradicionales de iteraciones. iteraciones. 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, comenzando con un valor inicial, y finalizando en un valor final.
Los cuatro mensajes de palabra clave que proveen estas funciones son: timesRepeat:, timesRepeat:, whileTrue:, whileTrue:, whileFalse:, whileFalse:, y to:do:. to:do:.
timesRepeat: El mensaje timesRepeat: ejecuta un bloque de código un número específico de veces. El formato del mensaje es: número timesRepeat: [código]
donde número pued puede e ser ser cual cualqu quie ierr expr expres esió ión n que que resu result lte e en un entero entero,, y código es un bloq bloque ue de códi código go de cero cero-ar -argu gume ment nto. o. El siguiente es un ejemplo: "Agrega 1 a la variable x variable x tres tres veces." |x| x := 2. 3 timesRepeat: [x := x + 1]. ^x
El resultado es 5.
whileTrue: y whileFalse: Estos dos mensajes realizan la misma operación, excepto que uno se ejecuta por true y el otro por false. false. El formato del mensaje es: [booleano] whileFalse: [código] [booleano] whileTrue: [código]
Página 33
Manual de Smalltalk - Ing. Lucas Spigariol
Un booleano puede ser cualquier expresión que resulte en un valor de true o false; false; debe debe esta estarr ence encerr rrad ado o en un bloq bloque ue.. La expr expres esió ión n [código] es un bloque de código de cero-argumento. Por ejemplo, ambos ejemplos incrementan y incrementan y de de a 1 hasta que es mayor a x a x . "Itera mientras x es menor que y" |xy| x := 5. y := 0. [x < y] whileFalse: [y := y + 1]. ^y "Itera hasta que y es mayor than x" |xy| x := 5. y := 0. [y <= x] whileTrue: [y := y + 1]. ^y
to:do: El mensaje to:do: ejecuta un bloque múltiples veces, basado en un valor inicial y un valor final. El formato del mensaje es: número1 to: número2 do: [:var | código].
donde número1 y número2 pueden pueden ser cualq cualquie uierr expres expresió ión n que resulte en un número, y [:var | código] es un bloque de código de unargumento. El bloque se ejecuta para cada número perteneciente al rango entre número1 y número2, número2, inclusive. (Este formato es utilizado generalmente con enteros, que varían en el rango de a 1 a la vez.). El argumento del bloque de un-argumento equivale al valor actual en el rango. "Ejecuta este bloque 3 veces con i referenciado r eferenciado a cada valor entre el rango de 1 a 3. Al final x valdrá 6." |x| x := 0. 1 to: 3 do: [:i | x := x + i]. ^x
Página 34
Manual de Smalltalk - Ing. 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, y luego cambiar ese comportamiento para ofrecer un comportamiento único. La herencia es espe especi cial alme ment nte e impo import rtan ante te en cuan cuanto to que que dota dota al leng lengua uaje je Smalltalk de las características de reusabilidad y extensibilidad. •
•
•
•
•
•
•
Las clases que heredan el comportamiento de otras clases se llaman subclases. subclases. Las clases cuyo comportamiento es heredado por otras clases se llaman superclases. superclases. Una subclase puede agregar nuevos métodos a su comp compor orta tami mien ento to o reem reempl plaz azar ar (red (redef efin inic ició ión) n) los los méto método dos s heredados. Una subclase puede agregar nuevas variables de instancia o de clase a su definición. Una variable de clase existe sólo una vez en una clase y sus subclases, y es compartida por todas ellas. Una clase abstracta ofrece un comportamiento común para todas sus subclases, pero esto no significa que pueda tener instancias propias. El nombre super actúa de manera similar al self en self en cuanto que representa al objeto receptor del, pero causa que la búsqueda del método a ejecutar comience por la superclase del objeto receptor.
¿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. La herencia permite que el usuario extienda el programa existente para que realice la función que que se nece necesi site te.. El sigu siguie ient nte e diag diagra rama ma mues muestr tra a un ejem ejempl plo o de herencia:
Página 35
Manual de Smalltalk - Ing. Lucas Spigariol
La here herenc ncia ia invo involu lucr cra a supe superc rcla lase ses s y subc subcla lase ses. s. Esta Estas s clas clases es son son similares en su jerarquía, a las ideas de clase, género, y la familia de clasi clasific ficaci acione ones s en el mundo mundo animal animal.. La jerarq jerarquía uía de herenc herencias ias es ilimitada. Esto significa que las subclases pueden tener subclases que también tienen subclases. La clase Persona que se muestra en el sigui siguient ente e gráfic gráfico o tiene tiene variab variables les de instan instanci cia a llama llamadas das nombre, direccion, y telefono. telefono. La subclase Cliente tiene las mismas variables de inst instan anci cia. a. La clas clase e Persona soport soporta a los los mensaj mensajes es nombre, direccio direccion, n, telefono, telefono, nombre:, nombre:, direccio direccion:, n:, y telefono:. telefono:. La subc subcla lase se Cliente también soporta estos mensajes.
En la herencia, la subclase siempre toma el comportamiento y la estructura interna de las superclases superior a ella.
Página 36
Manual de Smalltalk - Ing. 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. Esto puede ser hecho agregando nuevos métodos, o redefiniendo los métodos heredados.
Agregando Métodos Se puede agregar métodos de manera muy simple, incorporándolos, ya sean de instancia o de clase, en la definición de la clase. Todo objeto objeto de la subclase subclase soporta soporta los métodos métodos de su superclase, superclase, más los nuevos métodos.
En el gráf gráfic ico o ante anteri rior or,, la defi defini nici ción ón de la clas clase e Cliente también desearía gestionar los pedidos de los clientes. Entonces, la definición de la clas clase e dese desear ará á agre agrega gar: r: pedidosCliente, pedidosCliente:, y agregarPedidoCliente:.. La definición de la clase Cliente puede ahora agregarPedidoCliente: soportar todos los mensajes o métodos de la clase Persona y los nuevos tres mensajes.
Página 37
Manual de Smalltalk - Ing. Lucas Spigariol
Redefinición de Métodos La redefinición de un método heredado es otra herramienta que los usuari usuarios os tienen tienen para para provee proveerr de un compor comportam tamien iento to único único a una clase. Si un objeto recibe un mensaje que existe en la definición de la clase, el objeto busca en la jerarquía hasta que encuentra el método con ese nombre. Los métodos heredados no pueden eliminarse.
La figura muestra cómo Smalltalk trabaja con la jerarquía cuando está buscando un método para un mensaje.
Enviando Métodos a Instancias En la jerarquía, una subclase hereda los métodos de su superclase. La inst instan anci cia a de una una clas clase e pued puede e reci recibi birr un mens mensaj aje e para para busc buscar ar un método que no es soportado por la clase. La instancia de la clase busca en sí misma para saber si el método existe en ella. Si no, la búsq búsque ueda da se pasa pasa a la supe superc rcla lase se de la subc subcla lase se,, si tamp tampoc oco o lo encuentra busca en la superclase de su superclase y así continúa hasta llegar a Object , si no lo encuentra tampoco en Object envía un mensaje de error. Si el método es encontrado, entonces se hereda en la instancia de la subclase.
Herencia de Variables La jerarquía del lenguaje Smalltalk, ha sido diseñada para que las subclases hereden las variables de sus superclases. Las subclases también pueden poseer variables propias. Las variables de instancia se agregan a la clase colocándolas en la definición de clase. Las variables de instancia están definidas en la definición de la clase. Los datos de la instancia se mantienen en un área de datos creada por Smalltalk.
Página 38
Manual de Smalltalk - Ing. Lucas Spigariol
La vari variab able le Cliente tien tiene e las las vari variab able les s de inst instan anci cia: a: nombre, direccio direccion, n, telefono, telefono, y pedidosCliente. pedidosCliente. Estas Estas variab variables les inclu incluyen yen las variables de instancia heredadas de Persona. Persona. Cada instancia posee su propia copia de las variables de instancia, de esta forma hace a las variables de instancia propias de la instancia. Entonces, el nombre de la variable debe comenzar con una letra minúscula.
Variables de Clase Una variable de clase es una variable que es compartida por todos los objetos de la clase. Sólo existe una copia de la variable de clase en la jerarquía local de clases. Todos los objetos de la clase referencian a esta única copia de la variable. 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. Tienen las mismas convenciones de nombramiento que las variables de instancia, excepto que la primera letra de una variable de clase debe comenzar con mayúscula.
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, pero sólo los métodos de instancia pueden referirse a las variables de instancia. El siguiente diagrama muestra este hecho:
Página 39
Manual de Smalltalk - Ing. 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. Dado que es una variable privada, las variables de instancia de clase deben comenzar con con minú minúsc scul ula. a. Las Las vari variab able les s de inst instan anci cia a de clas clase e sopo soport rtan an el comportamiento de herencia, teniendo cada clase su propio estado de la variable.
Clases Abstractas Las clases clases abstrac abstractas tas prov provee een n de un comp compor orta tami mien ento to a sus sus subclases, 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.
Super y Self El uso de super provoca que la búsqueda del método comience en la superclase del objeto receptor. Super es la única forma en que la clase pueda agregar comportamiento a los métodos sin tener que reemplazarlos. Cuando super es encontrado en la ejecución de un programa, Smalltalk busca el método en la superclase del receptor. Super también es usado para crear variables de instancia por cada nueva eva instancia. Esto se hace ace por medio de un método de inicialización por por cada cada clas clase. e. Un ejem ejempl plo o para para crea crearr una una nuev nueva a instancia de una clase es: Private Class Methods new
Página 40
Manual de Smalltalk - Ing. Lucas Spigariol
^super new inicializar
Self hace Self hace que la búsqueda del método comience en el mismo objeto receptor. Cuando self es self es encontrado en la ejecución de un programa, Smalltalk busca el método en el receptor. Un ejemplo del uso del comando self es: self calcular calcular que que sign signif ific ica a envi enviar ar el mens mensaj aje e calcular a self .
Página 41
Manual de Smalltalk - Ing. Lucas Spigariol
Capítulo 6: Colecciones Presentación sintética: •
•
•
•
•
•
•
•
•
Una Bag (Bolsa) es una colección de tamaño variable, que guarda objetos en un orden al azar y que no es indexable. indexable. Un Set (Conjunto) es idéntica a una Bolsa excepto en que no permite objetos duplicados. Un Array (Vector o Arreglo) es una colección de tamaño fijo que es indexable. indexable. Una OrderedC OrderedCollect ollection ion (Colecció (Colección n Organizad Organizada) a) es una colección de tamaño variable que es indexable. indexable. Una So Sorte rtedCo dColle llecti ction on (Colec (Colecció ción n Ordena Ordenada) da) 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. Un String (Cadena) es similar a un vector excepto en que sólo contiene caracteres. Un Symbol (Símbolo) es similar a una cadena excepto en que no permite objetos Symbol duplicados con el mismo valor. Un Dictionary (Diccionario) administ administra ra pares pares clave/valo clave/valorr y permite acceder por clave a los objetos que contiene. Las Colecciones tien tienen en vari varios os mens mensaj ajes es que que sopo soport rtan an la administración de una colección. Esto incluye preguntar por su tamaño (size), (size), agregar (add) objetos a una colección, eliminar (remove) ítems, e iterar (do) a través de una colección.
¿Qué es una Colección? Una colección es una una estr estruc uctu tura ra de dato datos s que que refe refere renc ncia ia a un conjunto de objetos. objetos. Son objetos que contienen y manejan grupos de objetos
Página 42
Manual de Smalltalk - Ing. Lucas Spigariol
Small Smalltal talk k posee posee un número número de difer diferent entes es tipos tipos de colecc coleccion iones. es. 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é esté mane maneja jand ndo. o. Si se quis quisie iera ra,, cada cada elem elemen ento to en una una colección podría contener un objeto diferente de una clase diferente. Algunas colecciones son específicas respecto del tipo de objeto que manejan. Por ejempl ejemplo, o, la clase clase String es una colección que debe contener objetos del tipo Character (carácter). Character (carácter). Las colecciones varí varían an en las las capa capaci cida dade des s que que ofre ofrece cen. n. Algu Alguna nas s colecciones pueden crecer y decrecer en tamaño y son útiles para grup grupos os de objetos que que requ requie iere ren n de este este comp compor orta tami mien ento to.. Por Por ejem ejempl plo, o, si cada cada inst instan anci cia a de Cliente estu estuvi vier era a en una una list lista, a, el agre agrega gado do o elim elimin inac ació ión n de clie client ntes es podr podría ía hace hacerr que que esta esta list lista a incremente o decremente su número. Para implementar esta lista, se nece necesi sita tarí ría a una una cole colecc cció ión n de tama tamaño ño vari variab able le que que pose posea a este este comportamiento. Con una colección de tamaño variable, su tamaño inicial puede ser especificado, o por defecto, ser utilizado algún valor apropiado. Otras colecciones no pueden cambiar su tamaño y, como resultado, suelen tener un esquema de manejo más eficiente. Las colecciones de tama tamaño ño fijo fijo son son apro apropi piad adas as cuan cuando do el núme número ro de elementos en un grupo es conocido y estable.
Página 43
Manual de Smalltalk - Ing. Lucas Spigariol
Una colección org organi anizad zada tiene ene una una organ ganizaci zación ón sobr sobre e sus elementos. Esta organización puede ser un índice simple, como en un Array (vector), (vector), o una clave como en un Dictionary (diccionario), (diccionario) , o impu impues esta ta por por algú algún n orde orden n inte intern rno o como como en una una SortedCollection (colección ordenada). ordenada). La indexación permite referirse a un elemento en un lugar fijo. Por ejemplo, en un vector de tres cadenas: #('rojo' 'blanco' 'azul'), se puede solicitar el elemento en el índice (lugar) 1. Todos los índices com comienza enzan n en 1 y term erminan nan en el tam tamaño año de la colección. colección. Las colecciones indexadas siempre están organizadas y no cambian en forma arbitraria el orden de los elementos de la colección. colección. Un objeto permanece en el lugar que le fue asignado, hasta que sea explícitamente movido de lugar. Algunas colecciones tienen tienen caract caracterí erísti sticas cas adicio adicional nales, es, como como por ejemplo el self , que no permiten elementos duplicados dentro de la colección.
Colecciones Comunes Small Smalltal talk k tiene tiene varias varias colecciones comu comune nes. s. La sigu siguie ient nte e tabl tabla a muestra estas colecciones y sus comportamientos: comportamientos:
COLE COLECC CCIO IONE NES S Inde Indexa xaci ción ón
Tamaño Duplicado Orden variable s
Contenidos
Bag
N
S
S
N
Cualquier objeto, pero no nil
Set
N
S
N
N
Cualquier objeto, pero no nil
Array
S
N
S
N
Cualquier Objeto
OrderedCollectio n
S
S
S
N
Cualquier objeto
SortedCollection
S
S
S
S
Cualquier objeto
String
S
N
S
N
Caracteres
Symbol
S
N
N
N
Caracteres
Dictionary
N
S
N
N
Clave + Cualquier objeto
S = Comportamiento soportado, N = Comportamiento no soportado Las Clases de Colecciones tiene tiene varios varios comportami comportamiento entos s similares similares,, ellos son: •
representan un grupo de objetos llamados elementos Página 44
Manual de Smalltalk - Ing. Lucas Spigariol
• •
•
proveen un estructura de datos básica para la programación reem eemplaz plazan an cons consttrucci uccio ones nes iter terati ativas vas en los lengu enguaj ajes es tradicionales con los Mensajes a las Colecciones do:, do:, detect:, detect:, select:, select:, y collect:. collect:. soportan cuatro categorías de mensajes que agregarán nuevos elementos, elementos, eliminarán elementos, elementos, determinarán las ocurrencias de los elementos, elementos, and enumerarán los elementos. elementos.
Bag (Bolsa) Una Bag es una colecc colección ión desorg desorgani anizad zada a de elemen elementos tos que está está preparada para una búsqueda eficiente. Una Bolsa actúa como un cont conten ened edor or dent dentro ro del del cual cual se pued pueden en colo coloca carr y reti retira rarr cosa cosas. s. Guar Gu ard dan sus elem elemen ento tos s en un orden den al azar azar y no puede ueden n ser indexadas. Una Bolsa puede incrementar o decrementar su tamaño, y acepta elementos duplicados (puede contener el mismo objeto varias veces). Como ejemplo, unaBag es utilizada para determinar el número de ocurrencias de cada elemento: unaBag := #(1 2 3 3 3 3) asBag. unaBag size -> 6 unaBag occurrencesOf: 3 Salida: 4
Set (Conjunto) Un Set es similar a una Bolsa excepto porque no permite objetos duplicados. Un Set Set ignora cualquier petición que pudiera agregar un elemento duplicado a la colección. Por ejemplo, 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. En este caso un Conjunto es más apropiado que una Bolsa. Bolsa. Sin embargo, asegurarse que no hay duplicados agrega un costo cada vez que un objeto es añadido a la lista. Por ejemplo, unSet es unSet es utilizado para determinar elementos únicos: unSet := #(1 2 3 3 3 3) asSet. unSet size -> 3 unSet occurrencesOf: 3 Salida: 1
Página 45
Manual de Smalltalk - Ing. Lucas Spigariol
Array (Vector o Arreglo) Un Array es una colección, de tamaño fijo, de elementos que pueden ser indexados por claves de números enteros que comienzan en 1 y se incr increm emen enta tan. n. Un Vector no puede uede crec crecer er o dis disminu minuiir. Los elem elemen ento tos s de un Vector puede puede ser cualqu cualquier ier objeto objeto,, los objeto objetos s duplicados están permitidos, y los elementos se guardan según la posición. Un Vector es Vector es útil cuando se conoce el tamaño de la colección y ese tama tamaño ño camb cambia ia rara rarame ment nte. e. Por Por ejem ejempl plo, o, asum asumam amos os que que se está está dise diseña ñand ndo o una una apli aplica caci ción ón para para admi admini nist stra rarr habi habita taci cion ones es en un edificio. El número de habitaciones es fijo y se desea una manera rápida de indexar cada habitación para chequearlas por información, como como ocup ocupan ante te o núme número ro de telé teléfo fono no.. Un Vector es una una buen buena a elección para esta situación. Por ejemplo, unArray es un vector de 3 posiciones con 'hola' en la primera posició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 ofre ofrece ce el prot protoc ocol olo o más más comp comple leto to de cualquiera de las clases de colecciones, y es consecuentemente el "cab "cabal allo lo de bata batall lla" a" más más util utiliz izad ado o por por los los prog progra rama mado dore res. s. Un Una a Colección Organizada puede ser indexada por una clave de números ente enterros que com comien ienzan zan en 1 y crec crecen en.. Los elem elemen enttos de una una Colección Colección Organizada Organizada pueden pueden ser objeto objetos s de cualq cualquie uierr clase. clase. Un Una a Colección Organizada también permite objetos duplicados y guarda los elementos en un orden al azar. Esta Esta colecci colección ón es princi principal palmen mente te utili utilizad zada a para para lista listas s de tamaño tamaño vari variab able le que que requ requie iere ren n de un cont contro roll sobr sobre e la ubic ubicac ació ión n de los los elementos de la colección. Por ejemplo, una Colección Organizada es usualmente utilizada en las interfaces de usuario para mantener la info inform rmac ació ión n visi visibl ble e en una una caja caja de list listas as.. Esto Esto perm permit ite e que que la info inform rmac ació ión n sea sea agre agrega gada da o elim elimin inad ada a de la list lista. a. El sopo soport rte e de inde indexa xaci ción ón es útil útil cuan cuando do el usua usuari rio o sele selecc ccio iona na un elem elemen ento to en particular de la Colección Organizada. Organizada.
Página 46
Manual de Smalltalk - Ing. Lucas Spigariol
SortedCollection (Colección Ordenada) Una SortedCollection guarda objetos en el orden especificado por un bloque de código llamado sortBlock . El bloque sortBlock es un bloq bloque ue de dos dos argu argume ment ntos os que que indi indica ca el orde orden n en que que los los dos dos argumentos debieran ser almacenados en la colección respecto uno del del otro otro.. La cole colecc cció ión n guar guarda da el prim primer er argu argume ment nto o adel adelan ante te del del segundo argumento en la colección cuando la evaluación del bloque sortBlock es verdadera (true (true). ). El bloque sortBlock puede contener múltiples sentencias, pero debe retornar un valor de verdad: true o false. false. Por ejemplo, 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. Es bloque hace que la colección guarde sus elementos en orden ascendente. Este es el bloque de ordenamiento por omisión que utiliza la clase SortedCollection. SortedCollection. Esta colección utiliza el bloque sortBlock cada vez que un elemento es agre agrega gado do a la cole colecc cció ión. n. El prim primer er argu argume ment nto o en el bloq bloque ue sortBlock siempre apunta al nuevo objeto y el segundo argumento apunta a un objeto existente. La colección ejecuta el bloque sortBlock en forma forma iterat iterativa iva y secuen secuencia ciall recor recorri riend endo o todos todos los los elemen elementos tos existentes en la colección, hasta que el bloque devuelva true, true, 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. El método para escribir un nuevo bloque sortBlock es: 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. Sin embargo, esto agrega un significante costo adicional cada vez que un nuevo objeto es añadido a la colección, de manera que debe usarse prudentemente.
Mensajes a las Colecciones Las colecciones tienen una variedad de mensajes para administrarse:
Página 47
Manual de Smalltalk - Ing. Lucas Spigariol
new El mensaje new designa una colección con un tamaño por omisión, que que varí varía a depe depend ndie iend ndo o del del tipo tipo de la cole colecc cció ión. n. Este Este mens mensaj aje e devuelve devuelve la nueva colecc colecció ión. n. Por ejempl ejemplo, o, la sigui siguient ente e senten sentencia cia designa unaBag con el siguiente mensaje: |unaBag| unaBag := Bag new
Este mensaje puede ser inapropiado para colecciones de tamaño fijo dado dado que que desi design gna a una una cole colecc cció ión n vací vacía a (sin (sin elem elemen ento tos) s).. Se debe 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 dado por el argum argument ento o unNúmero. unNúmero . El mensaje devuelve la nueva colección. Para Para una una cole colecc cció ión n de tama tamaño ño fijo fijo,, el argu argume ment nto o espe especi cifi fica ca un número de elementos en la colección. Pruebe el siguiente ejemplo: Array new: 10
Esta expresión designa un vector de 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 elemen elemento to y coloca coloca unObjeto en esa esa ubic ubicaci ación ón de la cole colecc cció ión. 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, 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 cade cadena na 'aho 'ahora ra es el mome moment nto' o' y devo devolv lver erá á el valo valorr 8. Prue Pruebe be 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 Sea otro otro ejem ejempl plo, o, dond donde e se tien tiene e una una cole colecci cción ón de núme número ros, s, 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." |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." |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, objeto, especificado por el argumento unObjeto, unObjeto, a la colección. El mens ensaje 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áli válido do para para las las cole colecc ccio ione nes s que que pued pueden en crece crecerr o dism dismin inui uirr en tamaño. El mensaje devuelve el objeto eliminado. Si el objeto no es encontrad encontrado, o, será visualiz visualizada ada la ventana ventana de depuración depuración (debugger (debugger window). window) . |unaColeccion| unaColeccion := Bag new. unaColeccion add: 1. unaColeccion remove: 1.
at: unNúmero put: unObjeto
Página 50
Manual de Smalltalk - Ing. Lucas Spigariol
El mensaje at: put: coloca un objeto, objeto, especificado por el argumento unObjeto, unObjeto, en la colección en el índice especificado por el argumento unNúmero. unNúmero. El mensaje devuelve el objeto colocado en la colección. Es men mensaj saje sól sólo es váli álido para ara las col colecci eccio ones nes que pued pueden en ser ser indexadas. El índice debe ser un número válido. |unaColeccion| unaColeccion := Array new: 10. unaColeccion at: 5 put: 'cadena 5'. ^unaColeccion
at: unNúmero El mensaje at: devuelve el objeto en el índice especificado por el argumento unNúmero. unNúmero. El mensaje es válido para las colecciones que pueden ser indexadas. |unaColeccion| unaColeccion := Array new: 10. unaColeccion at: 5 put: 'cadena 5'. unaColeccion at: 5
, unaColección El mensa mensaje je comb combin ina a dos dos cole colecc ccio ione nes s para para forma formarr una una terc tercer era a colección por concatenación. El receptor del mensaje debe ser una colección que pueda ser indexada. El argumento unaColección puede ser ser cual cualqu quie ierr tipo tipo de cole colecc cció ión. n. El mens mensaj aje e devu devuel elve ve una una nuev nueva a colección de la misma clase que el receptor. Este mensaje es una buena forma de hacer crecer a una colección de tamaño tamaño fijo. fijo. Por ejemplo, ejemplo, al crear crear un vector y luego agregar un nuevo elemento al vector. vector. |unaColeccion| unaColeccion := Array new: 2. unaColeccion at: 1 put: 'cadena 1'. unaColeccion at: 2 put: 'cadena 2'. unaColeccion := unaColeccion, (Array with: 'cadena 3').
detect: unBloque Este mensaje devuelve el primer elemento en el receptor para el cual la evaluación del argumento unBloque es verdadera. #( 4 7 10 3 7) detect: [ :nro | nro > 7] ifNone: [^nil].
Esta sentencia devolverá el número 10.
Página 51
Manual de Smalltalk - Ing. Lucas Spigariol
select: unBloque Este Este mensaj mensaje e devuel devuelve ve un subcon subconju junto nto del recept receptor or conten contenien iendo do todos aquellos elementos para los cuales 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. o.
reject: unBloque Este Este mensaj mensaje e devuel devuelve ve un subcon subconju junto nto del recept receptor or conten contenien iendo do aquell aquellos os elemen elemento tos s para para los los cuale cuales s la evalua evaluació ción n del argume argumento nto unBloque es falsa. 'ahora es el momento' reject: [:letra | letra isVowel ]
Devuelve la colección formada por: h r s l m m n t .
collect: unBloque Este mensaje crea y devuelve una nueva colección del mismo tamaño que que la rece recept ptor ora. a. Los Los elem elemen ento tos s de la nuev nueva a cole colecc cció ión n son 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. false.
Resumen de colecciones y mensajes La siguiente tabla resume los métodos que cada colección soporta. COLECCIONES
do: add: remove: at:
at: put:
,
detect sele select ct:: reje reject ct:: coll collec ect: t: :
Bag
S
S
S
N
N
N
S
S
S
S
Set
S
S
S
N
N
N
S
S
S
S
Array
S
N
N
S
S
S
S
S
S
S
OrderedCollectio n
S
S
S
S
S
S
S
S
S
S
SortedCollection
S
S
S
S
N
S
S
S
S
S
Página 52
Manual de Smalltalk - Ing. Lucas Spigariol
Dictionary
S
S
N
S
S
N
S
S
S
S
String
S
N
N
N
S
S
S
S
S
S
Symbol
S
N
N
N
S
S
S
S
S
S
Colecciones Especiales Hay otras tres colecciones que son útiles pero que difieren bastante de las las otra otras s cole colecc ccio ione nes s ya vist vistas as,, lo que que amer amerit ita a una una disc discus usió ión n especial. Las tres clases son String, String, Symbol, Symbol, y Dictionary .
String Lógica Lógicamen mente te la clase clase String es idén idénti tica ca a la clas clase e Array con con la excepción que sólo puede contener caracteres. Por ejemplo, vea el siguiente diagrama de la cadena 'John':
Inspec Inspeccio cione, ne, con la herram herramien ienta ta Inspec Inspectt de Small Smalltal talk, k, la sigui siguient ente e cadena: cadena: 'Fernando'
La ventan ventana a de Inspec Inspecció ción n se abre abre y mues muestr tra a el cont conten enid ido o de la cadena. cadena. Note que la cadena está compuesta de ocho elementos, cada uno de ellos apuntando a un caracter. Una cadena no puede crecer o disminuir en tamaño, pero puede ser indexada. indexada. Por lo tanto, soporta los mensajes at: y at:put:, at:put:, pero no soporta los mensajes add: o remove:. remove:. Los mensajes que parecen hacer crecer a un objeto String crean un nuevo objeto String en vez de hacer crecer al objeto existente. Las cadenas tienen métodos adicionales que sólo tienen sentido para una cadena de caracteres. ' hola' hola' trimBl trimBlank anks s “Devue “Devuelve lve una cadena cadena sin los espaci espacios os iniciales." 'Marzo 'Marzo 10, 2000' 2000' upTo: upTo: $, "Devuelve "Devuelve una cadena cadena hasta hasta el primer caracter caracter ingresado." 'uno dos ' asArrayOfSubtrings asArrayOfSubtrings “Devuelve un vector vector de cadenas por cada palabra en la
Página 53
Manual de Smalltalk - Ing. Lucas Spigariol
cadena principal."
Symbol Los objeto objetos s Symbol son son usad usados os por por las clases para para defi defini nirr los los selectore selectores s para los métodos métodos definidos definidos por la clase. clase. Por ejemplo, ejemplo, si la clase Cliente tiene un método llamado nombre, nombre, entonces el símbolo para el selector es #nombre. #nombre. Los símbolos también son usados para obtener claves únicas en los diccionarios. diccionarios. Sin embargo, los átomos también pueden ser utilizados para esto. La clase Symbol es similar a la clase String, String, con algunas diferencias únicas. Posee el siguiente comportamiento: •
•
•
Un símbolo es un objeto de sólo lectura una vez que ha sido creado. Un símbolo es único. No pueden existir dos símbolos con el mismo valor. Un símbolo no vacío sólo puede ser creado utilizando un literal como: |unaColeccion| unaColeccion := #Simbolo.
Esto significa que no soporta los mensajes: new:, new:, with:, with:, with: with:, with:, with: with: with:, with:, y with: with: with: with:. with:. Sí soporta el mensaje , (coma) pero devuelve una nueva cadena, cadena, y no un nuevo símbolo. símbolo. #nombre1, #nombre2
Recuerde que un símbolo es precedido por el signo numeral. •
•
Un símbolo es fijo en tamaño. No puede crecer o decrecer. Esto significa que no soporta mensajes como add:. add:. Un símbolo es de sólo lectura; una vez creado no puede ser modificado. Esto significa que no soporta ningún método que pueda cambiar su valor como at:put:. at:put: .
Dictionary Un obje objeto to dictionary es com como una una base base de dato atos simpl imple. e. Los Los diccionarios son colecciones desorganizadas cuyos cuyos elemen elementos tos son accedidos por una clave externa explícitamente asignada. Las claves usualmente usualmente son cadenas o símbolos, símbolos, pero pero en prin princi cipi pio o cual cualqu quie ierr
Página 54
Manual de Smalltalk - Ing. Lucas Spigariol
objeto puede ser usado ado como una cla clave de diccionario. diccionario . Los diccionarios mantie mantienen nen un seguim seguimien iento to de las pareja parejas s clave/ clave/val valor or.. Cada ada par clav clave/ e/v valo alor es una una insta nstanc nciia de una cla clase llamad amada a Association. Association. Una instancia de asociación apunta a un objeto que es una clave y apunta a un objeto que es el valor. Un elemento en un diccionario contiene un puntero a una instancia de asociación. asociación. No hay restricciones sobre sobre los elementos que se guardan en un diccionario. diccionario.
Las claves deben ser únicas en un diccionario, diccionario, por lo que no habrá dos asociaciones en un diccionario que tengan claves con el mismo valor. El apar pareo de clav claves es para ara el alm almacen acenam amiiento ento o acce acceso so de los elementos está basado en la operación de igualdad =. =. Consecuentemente, las claves deben ser únicas con respecto a la operac operació ión n de iguald igualdad ad,, que que es, es, dos dos elem elemen ento tos s no pued pueden en esta estarr asociados a la misma clave ni dos claves pueden ser iguales. Por ejemplo, si un objeto String con el valor 'nombre' está actualmente almacenado como clave, otro objeto String con el mismo valor no puede ser agregado como clave. Debido a los pares clave/valor, varios de los métodos para la clase Dictionary son son un poco poco dife difere rent ntes es de los los métodos para para las otras otras colecc coleccio iones nes.. La clase clase Dictionary tambié también n ofrece ofrece varios varios métodos adicionales específicos para claves y valores. Los sigui siguient entes es párraf párrafos os brevem brevement ente e resume resumen n alguno algunos s de los los más comunes métodos para diccionarios. diccionarios. Algunos de los ejemplos necesitan que los inspeccione. Cuando se ejecuta el comando Show it sobre it sobre un objeto Dictionary sólo Dictionary sólo se ven sus valores y no sus claves. Una Ventana de Inspección se necesita para ver las claves y los valores. add: unaAsociacion El mensaje add: agrega el argumento unaAsociacion al diccionario. diccionario. Devuelve la asociación que fue agregada. Inspeccione el siguiente ejemplo: Dictionary new add: (Association key: '45841122'); '45841122'); yourself
Página 55
Manual de Smalltalk - Ing. Lucas Spigariol
removeKey: unaClave El mensaje removeKey:elimina removeKey:elimina una asociación del diccionario con la clave igual al argumento unaClave. unaClave. El mensaje devuelve el valor de la asociación que que fue fue elim elimin inad ada. a. Si el argu argume ment nto o unaClave no es encontrado en el diccionario se visualizará la ventana de depuración. depuración. Inspeccione el siguiente ejemplo: |unDiccionario| unDiccionario := Dictionary new. unDiccionario add: (Association key: '45841122' value: 'Rodríguez, Manuel'). unDiccionario removeKey: '45841122' '45841122'
at: unaClave El mensaje at: devuelve el valor asociado con el argumento unaClave. unaClave. Si unaClave no existe en el diccionario se visualizará la ventana de depuración. depuración. |unDiccionario| unDiccionario := Dictionary new. unDiccionario add: (Association key:'45841122' value:'Rodríguez, Manuel'). unDiccionario at:'45841122' at:'45841122'
keyAtValue: unValor El mensaj mensaje e keyAtValue: devu devuel elve ve la clav clave e del del prim primer er valo valorr que que encu encuen entr tra a que que es igua iguall al argu argume ment nto o unValor . Si el argu argume ment nto o unValor no se encuentra en el diccionario, diccionario, se visualizará la ventana de depuración. depuración. |unDiccionario| unDiccionario := Dictionary new. unDiccionario add: (Association key:'45841122' key:'45841122' value:'Manuel'). unDiccionario keyAtValue:'Manuel'
at:unaClave at:unaClave put:unValor put:unValor El mens mensaj aje e at: put: encu encuen entr tra a el argu argume ment nto o unaClave en el diccionario y reemplaza su valor por el argumento unValor . Si la clave no se encuentra, entonces se agrega al diccionario. diccionario. Este mensaje puede ser utilizado en lugar del mensaje add: para agregar una nueva asociación al diccionario. diccionario. Este mensaje devuelve unValor . |unDiccionario| unDiccionario := Dictionary new. unDiccionario add: (Association key:'45841122' key:'45841122' value:'Manuel'). unDiccionario at:'45841122' put:'Felipe'. unDiccionario at:'45820022' put:'Tía Claudia'. unDiccionario
Página 56
Manual de Smalltalk - Ing. 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. do: unBloque El mensaje do: realiza iteraciones a través de todos los elementos del diccionario, diccionario, ejecutando un bloque de código de un sólo argumento especi especific ficado ado por el argume argumento nto unBloque, unBloque , el argu argume ment nto o de dich dicho o bloque se corresponde con los valores de cada asociación. asociación. |unDiccionario unaColeccion| unDiccionario := Dictionary new. unaColeccion := OrderedCollection new. unDiccionario at:'45841122' put:'Manuel'. unDiccionario at:'45820022' put:'Tía Claudia'. unDiccionario do:[:nombre |unaColeccion add:'Nombre = ',nombre]. ^unaColeccion
Este Este ejem ejempl plo o devu devuel elve ve una una Colección Organizada dond donde e cada cada elemento apunta a un objeto String con el nombre de la persona precedido por la cadena 'Nombre = '. keysDo: unBloque El mens mensaj aje e keysDo: real realiz iza a iter iterac acio ione nes s a trav través és de todo todos s los los elementos del diccionario, diccionario, ejecutando un bloque de código de un sólo argume argumento nto especi especific ficado ado por el argume argumento nto unBloque, unBloque , dond donde e cada cada argumento de dicho bloque se corresponde con la clave de cada asociación. asociación. |unDiccionario unaColeccion| unDiccionario := Dictionary new. unaColeccion := OrderedCollection new. unDiccionario at:'45841122' put:'Manuel'. unDiccionario at:'45820022' put:'Tía Claudia'. unDiccionario keysDo:[:tel |unaColeccion add:'Teléfono = ',tel]. ^unaColeccion
Este Este ejem ejempl plo o crea crea una una Colección Ordenada con con cada cada elem elemen ento to apuntando a un objeto String con el teléfono precedido por la cadena 'Teléfono = '. keys El mensaj mensaje e keys devu devuel elve ve un conj conjun unto to con con toda todas s las las claves del diccionario. diccionario.
Página 57
Manual de Smalltalk - Ing. Lucas Spigariol
|unDiccionario| unDiccionario := Dictionary new. unaColeccion := OrderedCollection new. unDiccionario at:'45841122' put:'Manuel'. 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. diccionario . |unDiccionario| unDiccionario := Dictionary new. unaColeccion := OrderedCollection new. unDiccionario at:'45841122' put:'Manuel'. unDiccionario at:'45820022' put:'Tía Claudia'. unDiccionario values
¿Por qué el diccionario devuelve devuelve las claves en un Conjunto y los valores en una Bolsa? Bolsa? Un Conjunto no permite duplicados, mientras que una Bolsa sí lo hace. Un objeto Dictionary no puede tener claves duplicadas, entonces un Conjunto es una buena elección. Pero como un objeto Dictionary puede tener valores duplicados, se colocan en una Bolsa. Bolsa.
Página 58
Manual de Smalltalk - Ing. Lucas Spigariol
Glosario: Abstracción: Abstracción: Un Una a desc descri ripc pció ión n o vist vista a simp simpli lifi fica cada da de algo algo que que enfati enfatiza za las las caract caracterí erísti sticas cas o los los propó propósi sitos tos releva relevante ntes s al usuari usuario, o, mien mientr tras as que que supr suprim ime e los los det detalle alles s que que son son inma inmate teri rial ales es o de distracción. Argumento: Argumento : Es un dato incluido como parte de un mensaje. Los argume argumento ntos s propor proporcio cionan nan inform informaci ación ón adicio adicional nal que el recept receptor or puede utilizar utilizar para realizar la operación operación solicitada. solicitada. Los mensajes binarios y los mensajes de palabra clave toman argumentos. En un mensaje de palabra clave, los dos puntos ( : ) después de una palabra clave indican que se necesita un argumento. Clase: Clase: Una clase es un objeto que especi especific fica a las propi propieda edades des gene genera rale les s para para los los tipo tipos s espe especí cífi fico cos s de obje objeto tos. s. Esto Esto incl incluy uye e la desc descri ripc pció ión n de los los atri atribu buto tos, s, de los los comp compor orta tami mien ento tos, s, y de la implementación de un objeto. Los objetos representados por una clase se llaman instancias de la clase. Estas clases se disponen jerár jerárqui quicam cament ente e desde desde superclases meno menos s espe especí cífi fica cas s haci hacia a subclases más específicas. Las subclases heredan las propiedades de sus superclases. Toda Todas s las las acci accion ones es a las las cual cuales es un objeto responde se definen en la descripción de su clase. Clase abstracta: abstracta: Es una clase que proporciona un comportamiento común a sus subclases, pero no se diseña para generar instancias a partir de ella. Comportamiento: Comportamiento : (1) Es el conjunto externo de características que exhib exhibe e un objeto. (2) (2) Es la clas clase e abst abstra ract cta a que que prop propor orci cion ona a un comportamiento común para las clases y metaclases. Colección: Colección: Es un conjunto de elementos, donde cada elemento es un objeto. Comentario: Comentario: Es un conjunto de caracteres encerrados entre comillas dobles. Smalltalk ignora los comentarios y no los ejecuta. Definición de la clase: 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
Manual de Smalltalk - Ing. Lucas Spigariol
Diccionario: Diccionario: En Smal Smallt ltal alk, k, es una una cole colecc cció ión n deso desord rden enad ada a cuyo cuyos s elem elemen ento tos s son son acce accedi dido dos s por por una una clav clave e exte extern rna a expl explíc ícit itam amen ente te asi asignad gnada. a. Véase ase tambi ambién én pool dictionary (Diccionarios Compartidos). Diccionario Compartido (Pool Dictionary): Dictionary): Es un objeto del tipo dicc dicciionar nario cuya cuyas s clav clave es defi defin nen var variabl ables que que pued pueden en ser compartidas por múltiples clases. Todos los métodos para una clase pueden acceder a las variables que se encuentran en un Diccionario compartido como parte de su alcance. Encapsulamiento: Encapsulamiento: Oculta la representación de los datos internos de un objeto. El objeto prop propor orci cion ona a una una inte interf rfaz az que que cons consul ulta ta y mani manipu pula la los los dato datos s sin sin expo expone nerr su estr estruc uctu tura ra inte intern rna. a. El objeto solamente dice qué puede hacer pero no cómo lo hace. Herencia: Herencia: Es la relación entre las clases en las cuales una clase comparte su estructura y comportamiento de otra. Una subclase hereda todo de una superclase. Instancia: Instancia: Es un objeto que es una ocurrencia particular de una determinada clase. Una instancia existe en memoria o en un medio externo en forma permanente. Jerarquí Jerarquía a de clases clases: Es una una estr estruc uctu tura ra de árbo árboll que que defi define ne las las relaciones entre las clases. Una clase tiene subclases bajo ellas, y superclases por encima encima de ella, ella, jerárq jerárquic uicame amente nte hablan hablando do.. Los métodos y las variables de una una clase son son here hereda dado dos s por por sus sus subclases. Literal: Literal: Es un objeto creado creado por el compilado compilador. r. Un literal literal puede ser un número, una cadena de caracteres, un caracter, un símbolo, ó un vector. Todos los literales son únicos: dos literales con el mismo valor refere referenci ncian an al mismo mismo objeto. El objeto cread creado o por por un lite litera rall es inalterable: no puede ser modificado. Mensaje: Mensaje: Es la comunicación de un objeto a otro que solicita que el objeto recept receptor or ejecut ejecute e un método método.. Un mensaj mensaje e consis consiste te en una referencia al objeto receptor, seguido por un selector indicando el método solicitado, y (generalmente) los argumentos que son usados por el método. Hay tres tipos de mensajes: binarios, de palabra clave, y unarios. Tamb Tambié ién n pued puede e hace hacers rse e una una clas clasif ific icac ació ión n de acue acuerd rdo o al rece recept ptor or,, esta esta pued puede e ser ser mens mensaj ajes es de instancia ó mensajes de clase, según el receptor sea una instancia ó una clase. Mensaje Mensaje Binario Binario:: Un mens mensaj aje e que que espe especi cifi fica ca una una acci acción ón que que se realizará en el objeto receptor y un objeto adicional pasado como argumento. En Smalltalk se utiliza los mensajes binarios para la aritmética, las comparaciones y las operaciones lógicas. El nombre de
Página 60
Manual de Smalltalk - Ing. Lucas Spigariol
estos mensajes no debe tener ningún carácter alfanumérico. X + Y es un ejemplo de un mensaje binario con + como el selector binario. Mensaje de palabra clave: clave: Es un mensaje que recibe uno ó más argumentos. Una palabra clave es un identificador seguido por dos puntos ( : ). Cada palabra clave requiere un argumento, y el orden de las palabras claves es importante. 'hola' at:2 put: $H es un mensaje e de palabr palabra a clave clave ; at: y put: son los ejemplo de un mensaj selectores de la palabra clave, 2 y $H son los argumentos. Esto es lo que lo diferencia de los mensajes binarios y de los mensajes unarios. Véase también Mensaje. Mensaje unario: unario: Es un mensaje que no posee argumentos, size es un ejemplo de un mensaje unario. Metaclase: Metaclase: Es la espe especi cifi fica caci ción ón de una una clase; es la comp complleta eta descripción de los atributos, comportamiento e implementación de una clase. Toda clase tiene tiene una una metaclase de la cual es su instancia. Compare con clase Método: Método: Es el código ejecutable que implementa la lógica de un mensaje particular de una clase. Hay dos tipos de métodos: método de clase y método de instancia. Método de Clase: Clase: Es un método que proporciona el comportamiento para una clase. El mensaje para invocar métodos de clase se envía a la clase, y no a la instancia de la clase. Método de Instancia: Un método que proporciona el comportamiento para las instancias de la clase. Los mensajes que invocan métodos de instancia se envían a las instancias particulares y no a la clase. nil: nil: Es el objeto que en Small Smalltal talk k signi signific fica a "sin "sin valor" valor".. Todas Todas las variables en un principio son inicializadas a nil. Es la única instancia de la clase UndefinedObject . objeto: objeto: Es el bloq bloque ue de cons constr truc ucci ción ón bási básico co en el desa desarr rrol ollo lo de Small Smalltal talk. k. Un objeto es cual cualqu quie ierr cosa cosa que que pued puede e most mostra rarr un comportamiento, o sea, a la que se le puede asignar responsabilidades. Todo el código y los datos de Smalltalk deben ser parte de un objeto. Polimorfismo: Polimorfismo: Es la capacidad de los objetos que, siendo diferentes, pueden responder a un mismo mensaje de maneras diferentes. Esto significa que objetos diferentes pueden tener implementaciones de métodos diferentes para un mismo mensaje. Un objeto puede enviar un mensaje sin importarle como el receptor implementa el mensaje.
Página 61
Manual de Smalltalk - Ing. Lucas Spigariol
Progra Programa mació ción n Orient Orientada ada a Objet Objetos os:: Es una meto etodolo dologí gía a de prog progra rama maci ción ón cons constr trui uida da alre alrede dedo dorr de obje objeto tos s y se basa basa en la inte intera racc cció ión n de los los obje objeto tos s medi median ante te el enví envío o de mens mensaj ajes es.. Los Los concep conceptos tos básico básicos s de la progra programac mació ión n orien orientad tada a a objeto objetos s son son la encapsulamiento, encapsulamiento, herencia y polimorfismo. polimorfismo. Redefinición: Redefinición: Es cuando se vuelve a definir un método que ya existe en alguna clase superior (superclase). Self : Es una pseudovariable que hace referencia al receptor de un mensaje. Se utiliza dentro de un método de una clase para poder envi enviar ar un mens mensaj aje e al objeto rece recept ptor or del del mens mensaj aje e orig origin inal al.. La búsqueda de ese nuevo mensaje comienza a partir de la clase a la que pertenece el receptor. Subclase: Subclase : Es una clase que que here hereda da el comp compor orta tami mien ento to y las las especificaciones, es decir, los métodos y las variables, de otra clase. Super: Super: Es una pseudovariable que hace referencia al receptor de un mensaje. Se utiliza dentro de un método de una clase para poder envi enviar ar un mens mensaj aje e al objeto rece recept ptor or del del mens mensaj aje e orig origin inal al.. La diferencia con self es que con super la búsqueda comienza a partir de la superclase del objeto receptor. Con super podemos hacer referencia a métodos redefinidos en esa clase. Superclase: Superclase: Es una clase de la cual otra clase here hereda da el comp compor orta tami mien ento to y las esp especif ecific icac acio ione nes, s, o sea, sea, los los méto método dos s y variables. Variable: Variable: Un lugar de almacenamiento dentro de un objeto para un dato, donde el dato es un objeto. Variable de clase: clase: Son los datos compartidos por la clase que la define y sus subclases. Los métodos de instancia y los métodos de clase, de la clase y sus subclases, pued pueden en refe referi rirs rse e directamente a estos datos. Al cambiar el valor de una variable de clase en una clase, también cambia para todas las otras clases que hereden esta variable. Variable de instancia: instancia: Son los datos privados que pertenecen a una instancia de una clase, y están ocultos a los accesos directos por parte del resto de los objetos. Las variables de instancia pueden ser accedidas solamente por los métodos de instancia de la clase y sus subclases. El conj conjun unto to de vari variab able les s de inst instan anci cias as defi define ne las las características particulares de un objeto; o sea, si bien todos los obje objeto tos s de esa esa clase tien tienen en la mism misma a cant cantid idad ad de vari variab able les s de instancia, sus valores son diferentes. Variable de instancia de la clase: clase : Es la información privada que le pertenece a una clase. La clase que la define y cada una de sus Página 62
Manual de Smalltalk - Ing. Lucas Spigariol
subclases mantienen su propia copia de la información. Cambiar la información en una clase no la cambia en todas las clases de la jerarquía, a diferencia de lo que ocurre con las variables de clase Variable Temporal: Temporal: Es una variable cuyo alcance está limitado al método ó bloque donde está definida. Una variable temporal toma un valor asignado.
Página 63