smalltalk lenguaje + librería de clases + entorno de desarrollo lenguaje: –sintaxis muy simple,...

27
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

Upload: rita-canez

Post on 06-Jan-2015

42 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 2: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 3: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

“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)

Page 4: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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)

Page 5: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 6: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 7: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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'

Page 8: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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”

Page 9: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 10: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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”

Page 11: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

Ejemplos Bloques

ifFalse: falseBlock ifTrue: trueBlock {clase Boolean}^falseBlock value

whileFalse: aBlock {clase Context} self value ifFalse: [ aBlock value. self whileFalse: aBlock]. ^nil

Page 12: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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’)]

Page 13: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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]

Page 14: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 15: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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.

Page 16: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 17: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 18: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 19: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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)

Page 20: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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)

Page 21: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

“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

Page 22: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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}

Page 23: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 24: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 25: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 26: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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

Page 27: Smalltalk Lenguaje + Librería de clases + Entorno de desarrollo Lenguaje: –Sintaxis muy simple, English-based –Todo es un objeto (incluso los números)

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]