Académique Documents
Professionnel Documents
Culture Documents
Desarrollo y ejemplificación
de los conceptos
del Paradigma de Objetos
Paradigmas de Programación
Facultad Regional Buenos Aires
Universidad Tecnológica Nacional
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 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 un Objeto?
Página 3
Manual de Smalltalk - Ing. Lucas Spigariol
Página 4
Manual de Smalltalk - Ing. Lucas Spigariol
Operación Secuencial
Método
Página 5
Manual de Smalltalk - Ing. Lucas Spigariol
Los métodos que operan sobre objetos específicos son los métodos
de instancias, y los mensajes que invocan métodos de instancia se
llaman mensajes de instancia.
Datos de un Objeto
Página 6
Manual de Smalltalk - Ing. Lucas Spigariol
Página 7
Manual de Smalltalk - Ing. Lucas Spigariol
Abstracción de Datos
Encapsulamiento
Página 8
Manual de Smalltalk - Ing. Lucas Spigariol
Polimorfismo
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
significado del timbre. Cuando el timbre (mensaje) suena, sin
embargo, tiene su propio significado para cada alumno (objeto).
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.
Página 9
Manual de Smalltalk - Ing. Lucas Spigariol
Herencia
Smalltalk
Smalltalk es un modelo puro orientado a objetos lo que significa que
todo, en el entorno, es tratado como un objeto. Entre todos 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.
Página 10
Manual de Smalltalk - Ing. Lucas Spigariol
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. Los tres tipos de mensajes son: unarios,
binarios, y de palabra 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 en el nombre
del objeto que recibe el mensaje, seguido del nombre del
mensaje y sus argumentos (si los tuviera).
Objetos y Clases
Existen muchos objetos en el entorno Smalltalk. Los objetos 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. Es la Clase la que determina como
es y cómo actúa cada objeto. Todo Objeto es instancia de alguna
clase en particular.
Página 12
Manual de Smalltalk - Ing. Lucas Spigariol
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. 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.
Por convención, todos los nombres de clases comienzan con una letra
en mayúscula, como por ejemplo "Alumno". Los nombres de
mensajes comienzan con una letra en minúscula y pueden tener
cualquier combinación de letras y números sin espacios en blanco.
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" o "miDirección."
Formato de un Mensaje
Por ejemplo:
unObjeto unMensaje
Página 14
Manual de Smalltalk - Ing. Lucas Spigariol
Mensajes Unarios
Mensajes Binarios
+/\*~<>=@%|&?!,
Página 15
Manual de Smalltalk - Ing. Lucas Spigariol
Los dos puntos (:) son una parte esencial del nombre del mensaje.
Cuando hay más de un parámetro, el nombre del mensaje debe
aparecer para cada parámetro.
Por ejemplo:
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
mismas convenciones de nombramiento que los métodos de
instancia.
Alumno new
Por ejemplo:
Self
Considere la siguiente sentencia:
Página 17
Manual de Smalltalk - Ing. Lucas Spigariol
nombre: unNombre
nombre := unNombre
direccion: unaDireccion
direccion := unaDireccion
nombre: nombreAlumno
nombre := nombreAlumno
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 escritas las instrucciones de Smalltalk. Una instrucción de
Smalltalk, además de contener mensajes, puede contener una
instrucción de asignación (determinar el contenido específico de una
variable dada), o devolver una expresión.
Instrucciones
En Smalltalk, el código ejecutable está formado por instrucciones.
Cada instrucción tendrá una o más expresiones Smalltalk. Una
expresión válida de Smalltalk puede ser cualquiera de las siguientes:
• Un nombre de variable
• Una literal
• Un envío de mensajes
Página 19
Manual de Smalltalk - Ing. Lucas Spigariol
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. Se
dice que una variable contiene al identificador del objeto.
variable := instrucción
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
(^) adelante de una instrucción. Cuando se encuentra 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
Por Ejemplo:
y := y + 7.
^y "devuelve el valor de y"
(a < b)
ifTrue: [^a]
ifFalse:[^b]
Página 21
Manual de Smalltalk - Ing. Lucas Spigariol
Por ejemplo:
Comentarios
En Smalltalk, los comentarios se encierran entre comillas dobles, tal
como:
Por ejemplo:
nombre
"Devuelve el nombre del alumno receptor."
^nombre
Variables Temporales
Página 22
Manual de Smalltalk - Ing. Lucas Spigariol
Por ejemplo:
Por ejemplo:
| nuevoNombre nuevaDireccion |
unMetodoEjemplo: algunaEntrada
"Esto es un ejemplo de un método."
| nuevoValor |
nuevoValor := algunaEntrada * 2.
^nuevoValor
Página 23
Manual de Smalltalk - Ing. Lucas Spigariol
unMétodoEjemplo: algunaEntrada
"Esto es un ejemplo de un método."
^algunaEntrada * 5
Bloques
Los bloques son corchetes que contienen ninguna o muchas
expresiones, y un código que realiza iteraciones o ejecuciones
condicionales. Por ejemplo, un bloque de código es utilizado para
especificar qué ejecutar como resultado de una condición verdadera o
falsa:
ifTrue: [x := 2]
ifFalse: [x := 5]
ifTrue: [x := 2]
Página 24
Manual de Smalltalk - Ing. Lucas Spigariol
[:variable1 | código]
[:variable1 :variable2 | código]
Por ejemplo:
[:unNumero | x * unNumero]
Mensajes en cascada
Algunas veces es necesario enviar a un objeto varios mensajes
consecutivos. Como ejemplo, revea el siguiente código:
Página 25
Manual de Smalltalk - Ing. Lucas Spigariol
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”, es por esto que Smalltalk implementa todos los tipos de
datos como clases de Smalltalk, y las operaciones sobre datos como
los métodos de estas clases.
Literales
Smalltalk provee soporte para los literales como instancias de cinco
clases: String (cadena), Number (número), Character
(carácter), Symbol (símbolo) y Array (vector).
Página 27
Manual de Smalltalk - Ing. Lucas Spigariol
Number
Character
String
Symbol
Página 28
Manual de Smalltalk - Ing. Lucas Spigariol
Array
Operaciones Aritméticas
Una instrucción que realiza una operación aritmética en Smalltalk
tiene la siguiente forma:
número operación número
|xy|
x := 2.
y := 6.
x*y "devuelve 12"
Nil
En Smalltalk, nil es un objeto que significa "nada". Inicialmente todas
las variables apuntan a 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 operación no fue exitosa. Por ejemplo, la siguiente lógica
devuelve nil si un argumento es no positivo, caso contrario devuelve
el resultado de la operación aritmética:
True y false
En Smalltalk los valores true y false son provistos por las clases True
y False, respectivamente y representan los valores booleanos
utilizados en toda expresión condicional y comparación lógica.
Comparaciones Lógicas
Una instrucción de comparación tiene el siguiente formato:
|ij|
i := 3.
Página 30
Manual de Smalltalk - Ing. Lucas Spigariol
j := 7.
i == j "devuelve false"
|xyz|
x := 3.
y := 5.
z := 7.
(x > 0) & (y < 0) | (x > y) & (y = z)
Existe una diferencia entre los mensajes binarios & y |, y los mensajes
de palabra clave and: y or:, respectivamente. Los mensajes de
palabra clave son considerados caminos cortos porque utilizan
evaluación 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
|xyz|
x := 3.
y := 5.
z := 7.
(((x > 0) and: [y < 0]) or: [x > y]) and: [y = z]
Not
booleano not
El siguiente es un ejemplo:
Lógica Condicional
La lógica condicional permite la ejecución del código dependiendo de
un valor booleano. Existen varios mensajes de palabra clave que
proveen esta función, por ejemplo:
booleano
ifTrue: [código]
ifFalse: [código].
| 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
Iteraciones
Smalltalk soporta cuatro tipos tradicionales de iteraciones. Ellos son:
timesRepeat:
El resultado es 5.
whileTrue: y whileFalse:
Página 33
Manual de Smalltalk - Ing. Lucas Spigariol
to:do:
"Ejecuta este bloque 3 veces con i referenciado 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 especialmente importante en cuanto que dota al lenguaje
Smalltalk de las características de reusabilidad y extensibilidad.
¿Qué es la Herencia?
Un ejemplo de herencia es cuando alguien tiene un programa y desea
que su programa realice más de una función. La herencia permite que
el usuario extienda el programa existente para que realice la función
que se necesite. El siguiente diagrama muestra un ejemplo de
herencia:
Página 35
Manual de Smalltalk - Ing. Lucas Spigariol
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
Página 37
Manual de Smalltalk - Ing. Lucas Spigariol
Redefinición de Métodos
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.
Página 38
Manual de Smalltalk - Ing. Lucas Spigariol
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.
Página 39
Manual de Smalltalk - Ing. Lucas Spigariol
Clases Abstractas
Las clases abstractas proveen de un comportamiento a 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.
Página 40
Manual de Smalltalk - Ing. Lucas Spigariol
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.
• 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.
• Una OrderedCollection (Colección Organizada) es una
colección de tamaño variable que es indexable.
• Una SortedCollection (Colección Ordenada) es una
colección de tamaño variable que guarda objetos en un orden
específico por medio de un bloque de ordenamiento de dos
argumentos.
• 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) administra pares clave/valor y
permite acceder por clave a los objetos que contiene.
• Las Colecciones tienen varios mensajes que soportan la
administración de una colección. Esto incluye preguntar por su
tamaño (size), agregar (add) objetos a una colección, eliminar
(remove) ítems, e iterar (do) a través de una colección.
Página 42
Manual de Smalltalk - Ing. Lucas Spigariol
Página 43
Manual de Smalltalk - Ing. Lucas Spigariol
Colecciones Comunes
Smalltalk tiene varias colecciones comunes. La siguiente tabla
muestra estas colecciones y sus comportamientos:
Tamaño Duplicado
COLECCIONES Indexación Orden Contenidos
variable s
Cualquier objeto, pero
Bag N S S N
no nil
Cualquier objeto, pero
Set N S N N
no nil
Array S N S N Cualquier Objeto
OrderedCollectio
S S S N Cualquier objeto
n
SortedCollection S S S S Cualquier objeto
String S N S N Caracteres
Symbol S N N N Caracteres
Clave + Cualquier
Dictionary N S N N
objeto
Página 44
Manual de Smalltalk - Ing. Lucas Spigariol
Bag (Bolsa)
Set (Conjunto)
Página 45
Manual de Smalltalk - Ing. Lucas Spigariol
Página 46
Manual de Smalltalk - Ing. Lucas Spigariol
[:a :b | a <= b]
"devuelve true cuando a es menor o igual a b"
Página 47
Manual de Smalltalk - Ing. Lucas Spigariol
new
new: unNúmero
Array new: 10
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
Página 48
Manual de Smalltalk - Ing. Lucas Spigariol
size
do: unBloque
Página 49
Manual de Smalltalk - Ing. Lucas Spigariol
add: unObjeto
remove: unObjeto
Página 50
Manual de Smalltalk - Ing. Lucas Spigariol
at: unNúmero
, unaColección
|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
Página 51
Manual de Smalltalk - Ing. Lucas Spigariol
select: unBloque
reject: unBloque
collect: unBloque
Este mensaje crea y devuelve una nueva colección del mismo tamaño
que la receptora. Los elementos de la nueva colección son el
resultado de ejecutar el argumento unBloque en cada uno de los
elementos del receptor.
#('ahora' 'es' 'el' 'momento' 123) collect: [:elemento | elemento isString ]
at: detect
COLECCIONES do: add: remove: at: , select: reject: collect:
put: :
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
S S S S S S S S S S
n
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 otras colecciones ya vistas, lo que amerita una discusión
especial. Las tres clases son String, Symbol, y Dictionary.
String
Las cadenas tienen métodos adicionales que sólo tienen sentido para
una cadena de caracteres.
' hola' trimBlanks “Devuelve una cadena sin los espacios
iniciales."
'Marzo 10, 2000' upTo: $, "Devuelve una cadena hasta el primer caracter
ingresado."
'uno dos ' asArrayOfSubtrings “Devuelve un vector de cadenas por cada palabra en
la
Página 53
Manual de Smalltalk - Ing. Lucas Spigariol
cadena principal."
Symbol
Los objetos Symbol son usados por las clases para definir los
selectores para los métodos definidos por la clase. Por ejemplo, si la
clase Cliente tiene un método llamado nombre, entonces el símbolo
para el selector es #nombre. Los símbolos también son usados para
obtener claves únicas en los diccionarios. Sin embargo, los átomos
también pueden ser utilizados para esto.
|unaColeccion|
unaColeccion := #Simbolo.
Esto significa que no soporta los mensajes: new:, with:, with: with:,
with: with: with:, y with: with: with: with:.
#nombre1, #nombre2
Dictionary
Página 54
Manual de Smalltalk - Ing. Lucas Spigariol
add: unaAsociacion
Página 55
Manual de Smalltalk - Ing. Lucas Spigariol
removeKey: unaClave
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key: '45841122' value: 'Rodríguez, Manuel').
unDiccionario removeKey: '45841122'
at: unaClave
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key:'45841122' value:'Rodríguez, Manuel').
unDiccionario at:'45841122'
keyAtValue: unValor
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association key:'45841122' value:'Manuel').
unDiccionario keyAtValue:'Manuel'
at:unaClave put:unValor
|unDiccionario|
unDiccionario := Dictionary new.
unDiccionario add: (Association 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
do: unBloque
|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
keysDo: unBloque
|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
keys
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
|unDiccionario|
unDiccionario := Dictionary new.
unaColeccion := OrderedCollection new.
unDiccionario at:'45841122' put:'Manuel'.
unDiccionario at:'45820022' put:'Tía Claudia'.
unDiccionario values
Página 58
Manual de Smalltalk - Ing. Lucas Spigariol
Glosario:
• 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
Página 60
Manual de Smalltalk - Ing. Lucas Spigariol
Página 61
Manual de Smalltalk - Ing. Lucas Spigariol
Página 62
Manual de Smalltalk - Ing. Lucas Spigariol
Página 63