Laboratorio 2: Smalltalk


 
 

1. Familiarizarse con el entorno (Transcript/ Class Browser, WorkSpace)

2. Entrada / Salida

 
Salida: 
Transcript show:'hola'.
Transcript cr.
(Evaluate it)

5 printOn:Transcript. 
(Evaluate it)

3+5
(Display it)
 

x = Prompter prompt:'mensaje' caption:'si o no'

 

3. Crear la primera clase con sus métodos y utilizarla desde el WorkSpace (crear una instancia e invocar a sus métodos)


En el Class Browser:

-------------------------------------------------
Object subclass: #Cosa
  instanceVariableNames:    'nombre '
  classVariableNames: ''
  poolDictionaries: ''

getNombre
    ^nombre

setNombre:name

        nombre := name.

--------------------------------------------------

En el Workspace:

 |x|
   x:= Cosa new.
   x setNombre:'BUBA'.
   Transcript show: x getNombre.
   Transcript cr.
 

Metodo con mas de una parametro:

Reina
 genera:a y:b
  uno := a.
  dos := b.

Desde el workspace
 r := Reina new.
 r genera:8 y:7.
 

Invocando otros metodos de la misma clase (utilizar self)
Reina
 imprime
 genera
  self imprime
 
 

}

 

Ejercicio 1: ¿ Se puede ahora modificar directamente la propiedad nombre sin utilizar el método setNombre ?

Ejercicio 2. Añadirle un metodo de inicialización a la clase Cosa.

Ejercicio 3. Añadirle a Cosa una propiedad de clase patas y dos métodos de clase de get y set de acceso a la propiedad patas. Mostrar su utilización desde el Workspace: Cosa setPatas:3.

Ejercicio 4. ¿ Podemos modificar la propiedad de instancia "nombre" desde el método de clase "setPatas" ? ¿ Por qué ?

4. Sistema de tipos

|x y|

x:= 'hola'.

x size.

x:= 25.

y := x+2

5. Asignación y cloning

y:= Cosa new setNombre:'pepe'.

z:=y.

z setNombre:'lola'.

Transcript show: y getEdad.


y:= Cosa new setNombre:'pepe'.

z:= y copy.

z setNombre:'lola'.

Transcript show: y getEdad.

6. Condicionales e iteradores


(1<2) ifTrue: [Transcript show:'MENOR']
ifFalse: [Transcript show:'MAYOR']

indice:=1.
[indice<=5] whileTrue: [
indice printOn: Transcript.
indice:= indice + 1]

5 timesRepeat:[Transcript show:'SI']

1 to: 10 do:[:i | i printOn:Transcript]

6. Herencia

Object subclass: #Animal
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''

habla
    ^'soy un animal'

---------
 

Animal subclass: #Perro
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''

habla
 ^'soy un perro'

-----------------------------
 

|a g p  tabla|

     a := Animal new.
     g := Gato new.
     p  := Perro new.

    tabla := Array new:3.
    tabla at:1 put: a.
    tabla at:2 put:g.
    tabla at:3 put: p.
 

    1 to:3 do:[:i |
            Transcript show: ((tabla at:i) habla).
            Transcript cr.
        ]


 
Ejercicio 5: Sustituid el metodo habla de la clase Animal por un método abstracto.¿ Cambia en algo ?

Ejercicio 6. Crear una nueva clase Loro que extienda el método habla para refinarlo ("Soy un animal" "y ademas soy un loro").

Pista: Concatenar cadenas se consigue con la coma: 'hola' , 'adios'

 

7. Utilizando colecciones en Smalltalk

 

Referencia: http://www.wi2.uni-erlangen.de/sw/smalltalk/chap7.html

aBag := #( 1 2 3 3 3 3) asBag.
aBag size.
aBag occurrencesOf: 3.

aSet := #( 1 2 3 3 3 3 ) asSet.
aSet size.
aSet occurrencesOf: 3


|tabla|

tabla := Array new:3.
tabla at:1 put: 'uno'.
tabla at:2 put:'dos'.
tabla at:3 put:'tres'.

        1 to:tabla size do:[ :c | Transcript show:(tabla at:c).
                                              Transcript cr.].
(Evaluate it)

#(1 2 3 4) at:2
(Display it)

'epepepep' at:4
(Display it)

cars := OrderedCollection new.
cars add: 'Cadillac'
cars addFirst: 'Lexus'
cars addLast: 'Corvette'

Output: ('Lexus' 'Cadillac' 'Corvette')

(4 3 5 2 1) asSortedCollection: [:a :b | a >= b]
( 'one' 'two' 'three' )asSortedCollection: [ :x :y | x size >= y size]
aSet := #( 1 2 3 3 3 3 ) asSet.

|aDictionary|
aDictionary := Dictionary new.
aDictionary add: (Association key:'27511' value:'Cary, NC').
aDictionary at:'27511'


8. Código genérico en Smalltalk.


Recorrido de una colección: do

|tabla|

tabla := Array new:3.
tabla at:1 put: 'k'.
tabla at:2 put:'pk'.
tabla at:3 put:'tpk'.

 tabla do: [:c| Transcript show:c].

Evaluación de bloque en una colección: select, reject

#(1 2 3 4 5 6 7) select: [:c | c odd]
 #(1 2 3 4 5 6 7) reject: [:c | c odd]
'aeiprprpr' select: [:c| c isVowel]
'aeiprprpr' reject: [:c| c isVowel]
  y:= (File find:'c:\*.*') collect: [:s | s fileName]

9. Manejo de excepciones

habla

Exception signal:'error'.


 [my code]
on: Exception
do: [:ex| ex return]

[ y:= Perro new. y habla.

] on: Exception

do: [ex: | Transcript show: ex description]

10. Bloques como objetos


Ejemplos:

y:= [Transcript show:'hola'].
y value

z:=[:x| Transcript show:x].
z value:'pepe'


 

11. Persistencia de la sesión

 

Ejercicio 7.  Problema del banco


Se trata de modelar el problema de un banco. El banco consta de una lista de cuentas y una lista de clientes. De los clientes tenemos su DNI, nombre y apellidos, dirección y telefono.
Sobre un banco podemos efectuar una revision de todas las cuentas del mismo.
En cada cuenta podemos ingresar dinero, sacar dinero, consultar saldo, cambiar el cliente, y efectuar una revisión mensual. Todas las cuentas tienen una comisión de 100 ptas que puede ser modificada. La revisión mensual hace lo siguiente:

saldo = saldo + saldo* interes_de_la_cuenta -comision

Hay tres tipos de cuenta: CuentaCorriente (CC), CuentaVivienda (CV) y FondoInversion (FI). La CuentaCorriente tiene un interes del 0.1, la CuentaVivienda de 0.2 y el FondoInversion de 0.3. De la CC no se puede sacar más dinero del que hay, del FI se pueden sacar hasta 100.000 ptas de numeros rojos, y de la CV no se puede sacar dinero. La revision mensual de la CV no paga comision bancaria. La revision mensual del FI quita ademas el dinero siguiente si se esta en numeros rojos: saldo_negativo * 0.2. Si se llega a 100.000 ptas de deuda la cuenta se bloquea y no se puede sacar dinero de ella.

Hay que implementar el problema en Java, y crear una clase de Test que compruebe la funcionalidad de las clases.
No es necesaria la creación de interfaz gráfica o textual.
Opcional: Incluir en el test un ejemplo de ordenación de cuentas por saldo o titular.
Localizar los conceptos de:


Se valorará la limpieza y elegancia del codigo y APIs.