1 / 27

Smalltalk

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)

philomena
Download Presentation

Smalltalk

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Ejemplo Clase “Cuenta (1/3) Object subclass: #Cuenta instanceVariableNames: 'titular codigo saldo ultOper' classVariableNames: 'SaldoMinimo' poolDictionaries: '' "Metodos de Clase” abrirCuenta ^self new abrirCuenta saldoMinimo: cantidadPts SaldoMinimo:= cantidadPts

  3. Ejemplo Clase “Cuenta (2/3) “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" ^saldo

  4. Ejemplo Clase “Cuenta (3/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.

  5. titular J. Gomez nombre codigo 123456 87654321 dni 100000 saldo Objeto Persona ultOper -5000 10000 50000 Objeto Array Ejemplo: Objeto “Cuenta” • Un objeto es una entidad de tiempo de ejecución • Es una estructura de datos con tantos campos como atributos tenga definidos la clase Semántica referencia para todas las variables

  6. Sintaxis y semántica de los mensajes Donde: obj: Objeto receptor oper, operBin, part1: selector part1: part2: métodos arg, arg1, …: argumento 1) Unarios obj oper 2) Binarios obj operBin arg 3) Keyword obj part1:arg obj part1:arg1 part2: arg2 obj part1:argn .. partn: argn SINTAXIS 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. SEMÁNTICA

  7. Ejemplos UnariosBinarios 8 factorial 3+4 unaCuenta saldo 0@0 nombre tamaño saldo <=saldoMinimo Cuenta new Keyword unaCuenta reintegro:1000 conjCuentas at:10 conjCuentas at:10 put: cue1 unaCuenta titular: unaPersona codigo: 1234 saldo: 10000 self error:'Cantidad no valida'

  8. Acceso a variables de instancia • Acceso a las variables de instancia de la clase mediante métodos de instancia (set y get). c:= Cuenta new c reintegro: 10000 c ingreso: 20000 c verUltOperaciones “acceso al campo ultOper del objeto c”

  9. 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 abrirCuenta saldo := saldo - cantidadPtas. s:= c1 saldo rect := Rectangulo corner1: punto1 corner2: punto2. miObjeto:= otroObjeto • El operador := no hace una copia del objeto

  10. Bloques • Objeto que contiene código ejecutable unBloque:= [Cuenta abrirCuenta] • Representa una forma deejecució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ón unBloque value otroBloque value: Cuenta abrirCuenta yotroBloque value: 1000 value: cuenta1 unomasBloque valueWithArguments: argArray “mas de 3 arg”

  11. Ejemplos Bloques ifFalse: falseBlock ifTrue: trueBlock {clase Boolean} ^falseBlock value whileFalse: aBlock {clase Context} self value ifFalse: [ aBlock value. self whileFalse: aBlock]. ^nil

  12. Estructuras de Control: Condicional expresionBooleanaifTrue: [...] ifFalse [...] expresionBooleanaifTrue: [...] expresionBooleanaifFalse: [...] ifTrue [...] expresionBooleanaifFalse: [...] denotando [...] un bloque sin parámetros Ejemplo: (indice<=limite) ifTrue: [total:= total + (lista at:indice)] ifFalse:[self error: ‘limite excedido’)]

  13. Estructuras de Control: Iteraciones Bloque_expr_boolwhileTrue: [...] Bloque_expr_boolwhileFalse: [...] unEnterotimesRepeat:[...] unEnteroto: otroEnterodo: [: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]

  14. 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

  15. 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 receptory crea otra colección con los valores obtenidos.

  16. Object A B C D 2.5. Herencia en Smalltalk • 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 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

  17. Herencia. Ejemplo de jerarquía de clases Jerarquía de figuras

  18. 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

  19. 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 ... Ejemplo Clase Poligono (1/2)

  20. 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 Ejemplo Clase Poligono (2/2)

  21. “La clase Rectangulo hereda de Poligono: - redefiniendo la rutina perimetro - añadiendo variables de instancia” Poligono subclass: #Rectangulo instanceVariableNames: 'lado1lado2diagonal' classVariableNames: '' poolDictionaries: '' perimetro ^ 2 * ( lado1 + lado2 ) …. Ejemplo Clase Rectangulo

  22. 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:=r f perimetro {iii}

  23. Object C1 C2 C3 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 encuentrase produce un error en tiempo de ejecución. Búsqueda método ob:=C3 new ob met1

  24. 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: $z x between: 1 and: 100 x between: 2@4 and: 12@14

  25. 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: unConjunto x addAll: unaListaOrdenada

  26. 1 2 3 4 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. ConjFig

  27. 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]

More Related