Publicado el 9 de Agosto del 2020
1.513 visualizaciones desde el 9 de Agosto del 2020
68,6 KB
32 paginas
Creado hace 23a (19/03/2002)
Smalltalk
Smalltalk es un lenguaje orientado a objetos puro: todas las entidades
manipuladas son objetos.
Ej. la expresión
2 + 4
es el resultado de enviar el mensaje ‘+’ con argumento 4 al objeto 2.
Smalltalk Squeak es un entorno de desarrollo de aplicaciones orientadas a
objetos.
Incluye:
• Un lenguaje: Smalltalk.
• Un modelo de objetos, que define cómo se comportan los objetos.
• Un entorno de programación, que permite añadir, modificar y
borrar clases.
• Una jerarquía de clases, que pueden ser reutilizadas directamente y
de las que se puede consultar su código.
• Un entorno de ejecución interpretado.
Smalltalk-1
Objetos
Todo el procesamiento en Smalltalk se lleva a cabo mediante el envío
de mensajes a objetos. Los objetos son instancias de una clase concreta.
‘esto es una cadena’
1234
1.234e-5
$a
#( 1 2 3 )
#( ‘array’ ‘de’ 4 ‘elementos’ )
#( 1 ( ‘dos’ 3 ) ‘cuatro’ )
true
false
[ i := i + 1 ]
un número real
una cadena de caracteres
un número entero
un carácter
un array de tres elementos
un array de cuatro elementos
un array de tres elementos
el valor lógico verdadero
el valor lógico falso
un bloque de código
Smalltalk-2
Clases
Una clase define el comportamiento de sus instancias especificando
su estado (variables de instancia) y su comportamiento (métodos para
responder a los mensajes que se le envían).
Patrón para crear una nueva clase:
NombrePadre subclass: #NombreClase
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: ''
Todo objeto es instancia de una clase, y todo objeto conoce la
instancia a la que pertenece.
Ejemplos:
1234 class
#(Francesca Jackie Marisa Bree) class
'Rakesh Vijay Charles Daniel Tyler' class
Smalltalk-3
Jerarquía de clases de Smalltalk
Smalltalk-4
Navegador de la jerarquía de clases
Smalltalk-5
Mensajes
Todo el procesamiento en Smalltalk se lleva a cabo mediante el envío
de mensajes a objetos. El envío de mensajes es equivalente a la invocación
de funciones en los lenguajes procedimentales.
Un mensaje se compone de tres partes:
•
•
•
un objeto receptor,
un selector de mensaje, y
cero o más argumentos
Ejemplos:
‘este es el momento’ size
# ( 1 3 5 7 ) at: 2
20 factorial
Un mensaje siempre devuelve un único objeto como resultado.
Los mensajes a los que un objeto puede responder se definen en el
protocolo de su clase.
La forma en que el objeto responde a un mensaje se define en el
cuerpo de los métodos.
Los métodos
indican
la
implementación de
los mensajes y
representan el comportamiento de la clase.
Smalltalk-6
Tipos de mensajes
Mensajes unarios.
No tienen argumentos.
Ejemplos:
5 factorial
$A asciiValue
Mensajes con argumentos.
Mensajes con uno o más argumentos.
Ejemplos:
‘ejemplo de cadena’ at: 6
‘ejemplo de cadena’ at: 1 put: $E
# ( 9 8 7 6 5 ) at: 3
Mensajes binarios.
Mensajes con un argumento, y uno o varios caracteres especiales (ni
dígitos ni letras) como selectores.
Ejemplos:
3 + 4
5 * 7
5 // 2
2 / 6
suma
multiplicación
división entera
división real
Smalltalk evalúa las expresiones aritméticas de izquierda a derecha
estrictamente, sin precedencias entre operadores.
Ejemplo:
3 + 4 * 2
devuelve 14, no 11.
Es posible usar paréntesis para controlar el orden de precedencia.
Ejemplo:
3 + ( 4 * 2 )
devuelve 11.
Smalltalk-7
Creación de objetos
Ya hemos creado algunos objetos.
Ejemplos:
'bigger', ' string'
#(1 2 3)
Otra forma de crear objetos es enviando mensajes (constructores) a
las clases.
Ejemplos:
Array new: 10
Array new
Date today
Time now
Smalltalk-8
Referencias a objetos (variables)
En Smalltalk todas las variables son referencias (punteros) a objetos,
no estando asociadas a ningún tipo o clase en particular.
Existen varias categorías de variables, dependiendo de su ámbito.
Variables globales
Son variables persistentes, cuyo valor se guarda de una ejecución
para otra del entorno.
Ejemplos:
Display
Transcript
Disk
Las variables globales comienzan con una letra mayúscula y se
declaran de forma implícita.
Ejemplo:
Sammy := ‘Sammy Jones’
Variables de clase
Variables de clase son variables globales cuyo ámbito es una clase,
por lo que son accesibles por todas las instancias de una clase.
Object subclass: #Factura
instanceVariableNames: ''
classVariableNames: 'contador'
poolDictionaries: ''
Se usan para compartir información dentro de una clase.
Las variables de clase empiezan con una letra mayúscula.
Ejemplo: Número de instancias de una clase.
Smalltalk-9
Variables de instancia
Las variables de instancia de un objeto son las definidas en su clase.
El número de variables de instancia es el mismo para todas las instancias de
una misma clase.
Object subclass: #Fraction
instanceVariableNames: 'numerator denominator'
classVariableNames: ''
poolDictionaries: ''
Variables temporales
Se denominan variables temporales porque Smalltalk las descarta
cuando dejan de usarse.
Se declaran colocándolas entre barras verticales en la primera línea de
una serie de expresiones. Sus nombres han de empezar por minúscula.
Ejemplo
| temp index factorials |
factorials := #( 3 4 5 6 ).
index := 1.
factorials size timesRepeat: [
^factorials
temp := factorials at: index.
factorials at: index put: temp factorial.
index := index + 1].
Smalltalk-10
Métodos
Los métodos son el código en Smalltalk, indican los algoritmos que
determinan el comportamiento de un objeto.
Ejemplo:
(1/7) numerator
El método numerator está definido en la clase Fraction.
numerator
^numerator
Ejemplo:
( 2/3 ) * ( 5/7 )
El método * está definido en la clase Fraction.
* aNumber
^(numerator * aNumber numerator)
/ (denominator * aNumber denominator)
Smalltalk-11
self
self es una variable especial que representa el objeto que recibe el
mensaje. Podemos hacer referencia a self en el cuerpo de un método
Ejemplo:
fraction
"Answer the receiver minus its integral part."
^self - self truncated
Si ahora evaluamos
( 22/7 ) fraction
( 2/3 ) fraction
devuelve 1/7
devuelve 2/3
super es una variable similar a self, que también hace referencia al
objeto receptor y que está relacionada con la herencia.
Smalltalk-12
Expresiones de asignación
Asignan
objetos (punteros a objetos) a variables.
Ejemplos:
factorials := # ( 3 4 5 6 ).
index := 1.
asignación de objetos
asignación de resultados de mensajes (objetos)
temp := factorials at: index.
index := index + 1.
Expresiones de retorno (return)
El carácter ^ indica que lo que le sigue es el valor a ser devuelto como
resultado de la serie de expresiones.
Ejemplo:
^ factorials
Smalltalk-13
Expresiones compuestas
Anidamiento de mensajes
Siempre que aparezca un objeto en una expresión, podemos usar en
su lugar un mensaje que devuelva un objeto del mismo tipo.
Ejemplos:
‘hola’ size + 4
‘ahora’ size + # ( 1 2 3 4 ) size
# (1 12 24 36 ) includes: 4 factorial
4 factorial between: 3 + 4 and: ‘hola’ size * 7
Orden de evaluación:
• mensajes unarios,
• mensajes binarios
• mensajes con argumentos.
Es posible modificar el orden de evaluación usando paréntesis.
Ejemplos:
‘hola’ at: ( # ( 5 3 1 ) at: 2 )
‘hola’ at: # ( 5 3 1 ) at: 2
error: el objeto ‘hola’ no entiende el mensaje at:at:.
Smalltalk-14
Serie de expresiones
El punto es el separador de expresiones.
Turtle black.
Turtle home.
Turtle go: 100.
Turtle turn: 120.
Turtle go: 100.
Turtle turn: 120.
Turtle go: 100.
Turtle turn: 120
Ejemplo:
Los objetos tienen un estado.
Los mensajes cambian el estado de un objeto.
Mensajes en cascada
Un mensaje en cascada es una forma de escribir una serie de
mensajes que son enviados al mismo receptor.
Ejemplo:
Turtle
black;
home;
go: 100;
turn: 120;
go: 100;
turn: 120;
go: 100;
turn: 120
Smalltalk-15
Comparación de objetos
La comparación de objetos se realiza enviando mensajes.
Las comparaciones normales (<, <=, =, >=, > y se implementan
como mensajes
Ejemplos:
3 < 4
#( 1 2 3 4) = #(1 2 3 4)
Todos los objetos entienden el mensaje de igualdad ( = ). Muchos
objetos definen mensajes de ordenación (<=).
Ejemplo:
'hello' <= 'goodbye'
Existen mensajes que permiten comprobar el estado de un objeto.
Ejemplos:
$a isUpperCase
('hello' at: 1) isVowel
7 odd
Expresiones Booleanas
Los mensajes and: y or: son recibidos por los objetos true o false, y
como argumento tienen un bloque cuya última expresión también devuelve
true o false.
Ejemplos:
( c < $0 or: [ c > $9 ] )
( c > $0 and: [ c <= $9 ] )
( c isDigit or: [ c >= $A and: [ c <= $F ] ] )
Smalltalk-16
Expresiones condicionales
Utilizamos bloques y mensajes para ejecuciones condicionales.
Ejemplo:
| max a b |
a := 5 squared.
b := 4 factorial.
a < b
^max
ifTrue: [max := b]
ifFalse: [max := a].
Ejemplo:
3 < 4
ifTrue: ['the true block']
ifFalse: ['the false block']
Smalltalk-17
Recursión
Ejemplo:
factorial
self > 1
self < 0
^1
“Answer the factorial of the receiver”
ifTrue: [ ^(self - 1) factorial * self ]
ifTrue: [ ^self error: ‘negative factorial’ ].
“Answer
Comentarios de: Smalltalk (0)
No hay comentarios