smalltalk lenguaje + librería de clases + entorno de desarrollo lenguaje: –sintaxis muy simple,...
TRANSCRIPT
Smalltalk
Lenguaje + Librería de clases + Entorno de desarrollo
• Lenguaje:– Sintaxis muy simple, “English-based”– Todo es un objeto (incluso los números)– Todo proceso se hace enviando mensajes a objetos
(incluso las estructuras de control)– Sólo hay cinco palabras reservadas (false, true, nil, self,
super) y dos instrucciones (asignación y mensaje)– Tipado dinámicamente. – Soporta herencia simple– Soporta el concepto de metaclase
Eje
mpl
o C
lase
“C
uent
a (1
/3)
Object subclass: #Cuenta instanceVariableNames: 'titular codigo saldo
ultOper' classVariableNames: 'SaldoMinimo' poolDictionaries: ''
"Metodos de Clase”
abrirCuenta ^self new abrirCuenta
saldoMinimo: cantidadPtsSaldoMinimo:= cantidadPts
“Métodos de instancia”
ingreso: cantidadPts " Ingresa en la cuenta, cantidadPts"
saldo:=saldo+cantidadPts
reintegro: cantidadPts " Retira de la cuenta, si es posible, cantidadPts" ((saldo-cantidadPts)>SaldoMinimo)
ifTrue: [saldo:=saldo-cantidadPts] ifFalse: [^self invalidMessage]
saldo "Devuelve el saldo de la cuenta"
^saldoEje
mpl
o C
lase
“C
uent
a (2
/3)
abrirCuenta“Inicializamos un objeto cuenta”
|s res| titular := Persona new altaPersona. s:=0. [s<SaldoMinimo] whileTrue:[ res:=(Prompter prompt: '¿Saldo Inicial? 'default: ''). res isNil ifTrue: [^self error] ifFalse:[(res sonDigitos)
ifTrue: [s:=res asInteger] ifFalse: [s:=0]]]. saldo:=s. (codigo:= Prompter prompt: '¿Codigo de la cuenta? '
default: '') isNil ifTrue: [^self error].
ultOper:= Array new.
Eje
mpl
o C
lase
“C
uent
a (3
/3)
Ejemplo: Objeto “Cuenta”
123456
100000
titularcodigo
saldo
ultOper
-5000 10000
J. Gomez
87654321nombre
dni
50000
Objeto Persona
Objeto Array
Semántica referencia para todas las variables
• Un objeto es una entidad de tiempo de ejecución
• Es una estructura de datos con tantos campos como atributos tenga
definidos la clase
Sintaxis y semántica de los mensajes
1) Unarios
obj oper
2) Binarios
obj operBin arg
3) Keyword
obj part1:arg
obj part1:arg1 part2: arg2
obj part1:argn .. partn: argn
Donde:
obj: Objeto receptor
oper, operBin,
part1: selector
part1: part2: métodos
arg, arg1, …: argumento
Ejecutar el método de la clase del receptor con igual nombre al selector, aplicándose las operaciones sobre el objeto que especifica el receptor.
SIN
TA
XIS
SEM
ÁN
TIC
A
Ejemplos
Unarios Binarios8 factorial 3+4unaCuenta saldo 0@0nombre tamaño saldo
<=saldoMinimoCuenta new
KeywordunaCuenta reintegro:1000conjCuentas at:10conjCuentas at:10 put: cue1unaCuenta titular: unaPersona codigo: 1234 saldo: 10000self error:'Cantidad no valida'
Acceso a variables de instancia
• Acceso a las variables de instancia de la clase mediante métodos de instancia (set y get).
c:= Cuenta newc reintegro: 10000c ingreso: 20000c verUltOperaciones
“acceso al campo ultOper del objeto c”
Asignación
• Un objeto asociado a una variable cambia cuando se evalúa una expresión de asignación.
variable := expresión• Ejemplos:
c1:= Cuenta new abrirCuentasaldo := saldo - cantidadPtas.s:= c1 saldorect := Rectangulo corner1: punto1 corner2: punto2.miObjeto:= otroObjeto
• El operador := no hace una copia del objeto
Bloques• Objeto que contiene código ejecutable
unBloque:= [Cuenta abrirCuenta]
• Representa una forma de ejecución diferida.
• Puede tener argumentos
otroBloque:= [:c | c saldo]
yOtroBloque:= [:v :c | c reintegro:v.c saldo ]
• Puede recibir un mensaje que provoca su ejecuciónunBloque valueotroBloque value: Cuenta abrirCuentayotroBloque value: 1000 value: cuenta1unomasBloque valueWithArguments: argArray “mas de 3 arg”
Ejemplos Bloques
ifFalse: falseBlock ifTrue: trueBlock {clase Boolean}^falseBlock value
whileFalse: aBlock {clase Context} self value ifFalse: [ aBlock value. self whileFalse: aBlock]. ^nil
Estructuras de Control: Condicional
expresionBooleana ifTrue: [...] ifFalse [...]
expresionBooleana ifTrue: [...]
expresionBooleana ifFalse: [...] ifTrue [...]
expresionBooleana ifFalse: [...]
denotando [...] un bloque sin parámetros
Ejemplo:
(indice<=limite) ifTrue: [total:= total + (lista at:indice)]
ifFalse:[self error: ‘limite excedido’)]
Estructuras de Control: Iteraciones
Bloque_expr_bool whileTrue: [...]
Bloque_expr_bool whileFalse: [...]
unEntero timesRepeat:[...]
unEntero to: otroEntero do: [:i| ...]
Ejemplos: 1) indice:=1.[indice<=lista size] whileTrue: [ lista at: indice put: 0.
indice:= indice + 1]
2) 10 timesRepeat:[self add:unCaracter]
3) 1 to: 10 do:[:i | lista at: i put: 0]
Iteradores (I)
• Permiten recorrer una colección (array, conjunto, lista, string,...) realizando diversos tratamientos sobre los elementos
1) aplicar una misma operación a todos los elementos
2) seleccionar elementos que cumplen una condición
3) aplicar una misma operación a aquellos elementos que cumplen una condición
Iteradores (II)1) unaColeccion do: [...]
Ejecuta el bloque [...] para cada elemento en unaColeccion
2) unaColeccion select: [...]
Crea otra colección con todos los elementos del receptor que cumplen una condición expresada en el bloque [...].
3) unaColeccion reject: [...]
Crea otra colección con todos los elementos del receptor que no cumplen una condición expresada en el bloque [...].
4) unaColeccion collect: [...]
Ejecuta el bloque [...] para cada elemento del receptor y crea otra colección con los valores obtenidos.
2.5. Herencia en Smalltalk
• Herencia Simple
• Object es la clase raíz
• Object describe las propiedades comunes a todos los objetos
Terminología:
C y D son subclases de B
B es la superclase de C y D
Object
A B
C D
• Mecanismo que nos permite definir una clase en función de otra
• Organiza las clases en una estructura jerárquica: Jerarquía de clases
Herencia. Ejemplo de jerarquía de clases
Figura
FiguraAbierta
FiguraCerrada
Segmento Poligono Elipse
Triangulo Rectangulo Circulo
Cuadrado
Figura
FiguraAbierta
FiguraCerrada
Segmento Poligono Elipse
Triangulo Rectangulo Circulo
Cuadrado
Jerarquía de figuras
Clase Rectangulo
• Un rectángulo es un caso especial de polígono:– muchas de sus características son idénticas (traslación,
rotación)
• Sin embargo un rectángulo tiene– características especiales (diagonal)
– propiedades especiales (número de lados es cuatro,
ángulos rectos,..)
– Versiones especiales de algunas operaciones
Object subclass: #Poligono instanceVariableNames: 'vertices' classVariableNames: '' poolDictionaries: ''
traslacionHorizontal: unReal vertical: otroReal vertices inicio.[vertices esUltimo] whileFalse: [
vertices valor traslacionHorizontal: unReal
vertical: otroReal.vertices siguiente]
rotarConCentro: unPunto angulo: unReal ...
Eje
mpl
o C
lase
Pol
igon
o (
1/2)
visualizar ...
perimetro|actual, anterior, suma|
vertices inicio.actual := vertices valor.[vertices esUltimo] whileFalse: [
anterior := actual.vertices siguiente.actual := vertices valor.suma := suma + actual
distancia:anterior].suma := suma + actual distancia:vertices primero.^suma
Eje
mpl
o C
lase
Pol
igon
o (
2/2)
“La clase Rectangulo hereda de Poligono:- redefiniendo la rutina perimetro- añadiendo variables de instancia”
Poligono subclass: #Rectangulo instanceVariableNames: 'lado1 lado2
diagonal' classVariableNames: '' poolDictionaries: ''
perimetro ^ 2 * ( lado1 + lado2 )
….
Eje
mpl
o C
lase
Rec
tang
ulo
Polimorfismo y Ligadura Dinámica• Smalltalk es un lenguaje tipado dinámicamente, luego una variable o
parámetro puede ligarse en tiempo de ejecución a un objeto de cualquier clase.
¿Tiene sentido hablar de polimorfismo?
• La ligadura de un mensaje a un método concreto se realiza en tiempo de ejecución
• ¿Qué versión de perímetro se ejecuta en cada mensaje?
f:= Poligono new.f perimetro {i}r:= Rectangulo new.r perimetro {ii}f:=rf perimetro {iii}
Ligadura dinámica
¿Qué método se ejecuta cuando se envía un mensaje a un objeto?
1) Se busca en la clase del objeto receptor un método con el mismo identificador que el selector del mensaje.
2) Si lo encuentra lo ejecuta, sino busca en la
superclase.
3) Repite el proceso hasta encontrar el método en
alguna superclase o llegar a Object.
4) Si llega a Object y no lo encuentra se produce
un error en tiempo de ejecución.
ObjectObject
C1C1
C2C2
C3C3
Búsqueda método
ob:=C3 new
ob met1
Búsqueda método
ob:=C3 new
ob met1
Ejemplo código genérico (I)
En clase Cuenta:
saldoFinAño saldo:= (saldo) + (self intereses) - (self
costeTarjeta)
En clase Magnitud:
between: inf and: sup ^(inf <= self) and: (self <= sup)
USO: x between: $a and: $zx between: 1 and: 100x between: 2@4 and: 12@14
Ejemplo código genérico (II)
En clase Collection:
addAll: unaColeccion unaColeccion do: [:elem| self add: elem]. ^unaColeccion
Invocación:
x addAll : (10 20 30)x addAll: 'hola'x addAll: unConjuntox addAll: unaListaOrdenada
Estructuras de datos polimorfas
• Contiene objetos de diferentes clases
• Ejemplo: Array con cualquier variante de Figura
ConjFig: ARRAY new:10 {Variable global}
p: Poligono new. r: Rectangulo new. c: Circulo new.t:Triangulo new;
ConjFig at:1 put:p; at:2 put:r; at:3 put:c; at:4 put:t.
1
2
3
4
ConjFig
Estructuras de datos polimórficas y código genérico
dibujarFiguras
1 to: ConjFiguras size do: [:i|
(ConjFiguras at: i) dibujar]
dibujarFiguras
ConjFiguras do: [:figura| figura dibujar]