7507 02 clases.ppt [modo de...
TRANSCRIPT
Clases
(construcción)(construcción)
Carlos Fontela
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Clases
(construcción)
A3F
(construcción)
Carlos Fontela
Temario
Implementación de clases
Atributos
Métodos y propiedades
2c2011 2
Constructores
Excepciones
Diseño contractual
TDD o diseño guiado por las pruebas
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Temario
Implementación de clases
A3F
TDD o diseño guiado por las pruebas
Dijimos…
POO parte de las entidades del dominio del
problema
Que son objetos con comportamiento
¿Cómo?
2c2011 3
¿Cómo?
=> Implementando clases
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Dijimos…
POO parte de las entidades del dominio del
Que son objetos con comportamiento
A3F
=> Implementando clases
Implementación de clases (1)
Clase = tipo definido por el programador
No “abstractos”: en POO es otra cosa
Ampliar el lenguaje
Se definen estructura y operaciones
2c2011 4
Se definen estructura y operaciones
Ocultamiento: cliente necesita conocer interfaz
No necesita conocer aspectos internos (implementación)
Riesgos de la falta de ocultamiento
Impedir evolución
Violación de restricciones
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de clases (1)
Clase = tipo definido por el programador
No “abstractos”: en POO es otra cosa
Se definen estructura y operaciones
A3F
Se definen estructura y operaciones
Ocultamiento: cliente necesita conocer interfaz
No necesita conocer aspectos internos
Riesgos de la falta de ocultamiento
Implementación de clases (2)
En UML:
Lo que se indica con (-) está oculto: es “privado” de cada objeto
Lo que se indica con (+) lo pueden usar los clientes: es “público”
2c2011 5
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de clases (2)
) está oculto: es “privado”
Lo que se indica con (+) lo pueden usar los
A3F
Implementación de clases: ¿cómo?
Mensajes => Métodos u operaciones
Varios caminos de diseño
2c2011 6
Varios caminos de diseño
Modelo contractual
Desarrollo guiado por las pruebas
Son complementarios y no excluyentes
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de clases: ¿cómo?
Mensajes => Métodos u operaciones
Varios caminos de diseño
A3F
Varios caminos de diseño
Desarrollo guiado por las pruebas
Son complementarios y no excluyentes
Modelo contractual (1)
Una clase es provista por un proveedor a un
cliente en base a un “contrato”
Bertrand Meyer y “diseño por contrato”
2c2011 7
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Modelo contractual (1)
Una clase es provista por un proveedor a un
cliente en base a un “contrato”
Bertrand Meyer y “diseño por contrato”
A3F
Modelo contractual (2)
El contrato se evidencia por
Firmas de métodos
Precondiciones de métodos
Postcondiciones de métodos
2c2011 8
Postcondiciones de métodos
Incluyendo resultados obtenidos
Incluyendo casos de excepción
Invariantes de la clase
Restricciones que siempre cumplen todas las instancias
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Modelo contractual (2)
El contrato se evidencia por
Precondiciones de métodos
Postcondiciones de métodos
A3F
Postcondiciones de métodos
Incluyendo resultados obtenidos
Incluyendo casos de excepción
Restricciones que siempre cumplen todas las instancias
Firmas de métodos
Constructor: (para crear e inicializar) => ver luego
CuentaBancaria inicializarConNumero: numero conTitular: titular
Métodos (uso):
cuenta depositar: monto
2c2011 9
cuenta depositar: monto
cuenta extraer: monto
cuenta getSaldo
cuenta getTitular
cuenta getNumero
Ojo que en Smalltalk no se definen los tipos
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Firmas de métodos
Constructor: (para crear e inicializar) => ver luego
CuentaBancaria inicializarConNumero: numero conTitular: titular
A3F
Ojo que en Smalltalk no se definen los tipos
Cuenta bancaria: atributos
Son variables internas de cada objeto, que sirven
para mantener el estado de los mismos
Para una cuenta bancaria:
2c2011 10
Ojo que en Smalltalk no se define el tipo antes de
usarlos
Podría haber más, que descubramos más adelante
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Cuenta bancaria: atributos
Son variables internas de cada objeto, que sirven
para mantener el estado de los mismos
A3F
Ojo que en Smalltalk no se define el tipo antes de
Podría haber más, que descubramos más adelante
Cuenta bancaria: invariantes
Son las restricciones en los valores de los atributos, válidas para todas las instancias
Son postcondiciones de todos los métodos, incluyendo el constructor
Corolario: el constructor debe dejar a la instancia creada en un estado válido
2c2011 11
Corolario: el constructor debe dejar a la instancia creada en un estado válido
Invariantes de CuentaBancaria:
saldo >= 0
titular <> nil
titular <> ‘’
numero > 0
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Cuenta bancaria: invariantes
Son las restricciones en los valores de los atributos, válidas para todas las instancias
Son postcondiciones de todos los métodos, incluyendo el constructor
Corolario: el constructor debe dejar a la instancia creada en un estado válido
A3F
Corolario: el constructor debe dejar a la instancia creada en un estado válido
Invariantes de CuentaBancaria:
Cuenta bancaria: precondiciones
CuentaBancaria inicializarConNumero: numero conTitular: titular
Precondición 1: titular no debe valer nil ni referenciar una cadena vacía
Precondición 2: numero > 0
2c2011 12
cuenta depositar: monto
Precondición 1: cuenta no debe valer nil (debe referenciar
un objeto)
Precondición 2: monto > 0
Tarea: definir precondiciones para los otros métodos
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Cuenta bancaria: precondiciones
CuentaBancaria inicializarConNumero: numero conTitular:
Precondición 1: titular no debe valer nil ni referenciar una
A3F
Precondición 1: cuenta no debe valer nil (debe referenciar
Tarea: definir precondiciones para los otros métodos
Cuenta bancaria: postcondiciones
CuentaBancaria inicializarConNumero: numero conTitular: titular
Postcondición 1: se creó un objeto de la clase
CuentaBancaria, con el número y el titular indicados
Postcondición 2 (alternativa): si titular es nil o referencia
una cadena vacía, se arroja una excepción de tipo Error
2c2011 13
una cadena vacía, se arroja una excepción de tipo Error
cuenta depositar: monto
Postcondición 1: el saldo de la cuenta aumentó en el valor
del monto
Postcondición 2 (alternativa): si monto < 0 , se arroja una
excepción de tipo Error
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Cuenta bancaria: postcondiciones
CuentaBancaria inicializarConNumero: numero conTitular:
Postcondición 1: se creó un objeto de la clase
CuentaBancaria, con el número y el titular indicados
Postcondición 2 (alternativa): si titular es nil o referencia
una cadena vacía, se arroja una excepción de tipo Error
A3F
una cadena vacía, se arroja una excepción de tipo Error
Postcondición 1: el saldo de la cuenta aumentó en el valor
Postcondición 2 (alternativa): si monto < 0 , se arroja una
Modelo contractual en la práctica
Precondiciones
Si no se cumplen, lanzamos una excepción
Postcondiciones
Si no se cumplen, podríamos lanzar una
2c2011 14
Si no se cumplen, podríamos lanzar una
excepción
Pero la prueba unitaria es un mejor camino
Veremos más adelante
Invariantes: postcondiciones permanentes
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Modelo contractual en la práctica
Si no se cumplen, lanzamos una excepción
Si no se cumplen, podríamos lanzar una
A3F
Si no se cumplen, podríamos lanzar una
Pero la prueba unitaria es un mejor camino
postcondiciones permanentes
Excepciones: lanzamiento
Las excepciones son objetos
Se crean y se lanzan hacia el módulo invocante
Sintaxis:
ClaseException new signal.
2c2011 15
ClaseException new signal.
ClaseException new signal: ‘un texto’.
Ya vimos cómo capturarlas
El texto lo obtenemos con el método messageText
Veremos formalmente excepciones más adelante
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Excepciones: lanzamiento
Las excepciones son objetos
Se crean y se lanzan hacia el módulo invocante
A3F
ClaseException new signal: ‘un texto’.
El texto lo obtenemos con el método messageText
Veremos formalmente excepciones más adelante
Diseño guiado por pruebas
Test-Driven Development = Test
automatización + refactorización
Test-First:
Escribir código de pruebas antes del código productivo
2c2011 16
Automatización:
Las pruebas deben expresarse como código, que pueda
indicar si todo sale bien de manera simple y directa
El conjunto de pruebas debe poder ir creciendo
Las pruebas deben correrse por cada cambio
Refactorización: mejora de calidad del diseño sin
cambio de funcionalidad
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Diseño guiado por pruebas
Driven Development = Test-First +
automatización + refactorización
Escribir código de pruebas antes del código productivo
A3F
Las pruebas deben expresarse como código, que pueda
indicar si todo sale bien de manera simple y directa
El conjunto de pruebas debe poder ir creciendo
Las pruebas deben correrse por cada cambio
Refactorización: mejora de calidad del diseño sin
TDD: frameworks de pruebas automatizadas
Ejemplo de CuentaBancaria con SUnit
Llegamos a la misma clase
En Java existe JUnit
2c2011 17
En Java existe JUnit
En .NET , NUnit
Muy importantes en refactorización
Los van a ver en la práctica
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
TDD: frameworks de pruebas automatizadas
Ejemplo de CuentaBancaria con SUnit
Llegamos a la misma clase
A3F
Muy importantes en refactorización
Los van a ver en la práctica
¿Cómo implementamos las clases?
Ayudarse por los dos caminos
Modelo contractual
TDD
Pruebas automatizadas sirven para
TDD
2c2011 18
TDD
Invariantes y postcondiciones del modelo contractual
Otra herramienta: aserciones en el modelo contractual
Es redundante y preferimos las otras
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
¿Cómo implementamos las clases?
Ayudarse por los dos caminos
Pruebas automatizadas sirven para
A3F
Invariantes y postcondiciones del modelo
Otra herramienta: aserciones en el modelo
Es redundante y preferimos las otras
Procedimiento
2c2011 19
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
A3F
Pruebas unitarias (1)
Clase de la prueba: debe descender de TestCase
Métodos de prueba: deben empezar con “test” y no tener parámetros
2c2011 20
TestCase subclass: #PruebaCuentaBancaria
instanceVariableNames: ‘
classVariableNames: ‘’
poolDictionaries: ‘’
category: ‘MisPruebas’
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Pruebas unitarias (1)
Clase de la prueba: debe descender de
Métodos de prueba: deben empezar con “test”
A3F
TestCase subclass: #PruebaCuentaBancaria
instanceVariableNames: ‘cuenta’
Pruebas unitarias (2)
PruebaCuentaBancaria >> setUp
cuenta := CuentaBancaria new inicializarConNumero: 1234 conTitular:’Juan Pérez’
2c2011 21
Esto sirve para inicialización repetida: no es una prueba
Nota: la sintaxis “NombreClase >> método” es convencional en Smalltalk
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Pruebas unitarias (2)
PruebaCuentaBancaria >> setUp
cuenta := CuentaBancaria new inicializarConNumero: 1234 conTitular:’Juan Pérez’
A3F
Esto sirve para inicialización repetida: no es
Nota: la sintaxis “NombreClase >> método” es convencional en Smalltalk
Pruebas unitarias (3)
PruebaCuentaBancaria >> testDeposito
cuenta depositar: 500.
self assert: (cuenta getSaldo = 500)
PruebaCuentaBancaria >> testExtraccionConSaldo
cuenta depositar: 1200.
2c2011 22
cuenta depositar: 1200.
cuenta extraer: 500.
self assert: (cuenta getSaldo = 700)
PruebaCuentaBancaria >> testExtraccionSinSaldo
self should: [ cuenta extraer: 1000 ] raise: Error
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Pruebas unitarias (3)
PruebaCuentaBancaria >> testDeposito
self assert: (cuenta getSaldo = 500)
PruebaCuentaBancaria >> testExtraccionConSaldo
A3F
self assert: (cuenta getSaldo = 700)
PruebaCuentaBancaria >> testExtraccionSinSaldo
self should: [ cuenta extraer: 1000 ] raise: Error
Pruebas unitarias (4)
PruebaCuentaBancaria >> testTitularVacio
self should:
[cuenta := CuentaBancaria new inicializarConNumero: 1234 conTitular:’’]
raise: Error.
2c2011 23
raise: Error.
PruebaCuentaBancaria >> testNumeroNoPositivo
self should:
[cuenta := CuentaBancaria new inicializarConNumero:conTitular:’Juan Pérez’]
raise: Error.
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Pruebas unitarias (4)
PruebaCuentaBancaria >> testTitularVacio
[cuenta := CuentaBancaria new inicializarConNumero: 1234 conTitular:’’]
A3F
PruebaCuentaBancaria >> testNumeroNoPositivo
[cuenta := CuentaBancaria new inicializarConNumero:-2 conTitular:’Juan Pérez’]
Pruebas unitarias (5)
PruebaCuentaBancaria >> testTitularNil
self should:
[cuenta := CuentaBancaria new
inicializarConNumero: 1234 conTitular:nil]
raise: Error.
2c2011 24
raise: Error.
PruebaCuentaBancaria >> testNumeroNil
self should:
[cuenta := CuentaBancaria new
inicializarConNumero:nil
conTitular:’Juan Pérez’]
raise: Error.
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Pruebas unitarias (5)
PruebaCuentaBancaria >> testTitularNil
[cuenta := CuentaBancaria new
inicializarConNumero: 1234 conTitular:nil]
A3F
PruebaCuentaBancaria >> testNumeroNil
[cuenta := CuentaBancaria new
inicializarConNumero:nil
conTitular:’Juan Pérez’]
Implementación de la clase (1)
Object subclass: #CuentaBancaria
instanceVariableNames: ‘
classVariableNames: ‘’
poolDictionaries: ‘’
2c2011 25
poolDictionaries: ‘’
category: ‘Cuentas’
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de la clase (1)
Object subclass: #CuentaBancaria
instanceVariableNames: ‘numero titular saldo’
A3F
Implementación de la clase (2)
CuentaBancaria >> getSaldo
^saldo
CuentaBancaria >> getTitular
2c2011 26
^titular
CuentaBancaria >> getNumero
^numero
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de la clase (2)
CuentaBancaria >> getSaldo
CuentaBancaria >> getTitular
A3F
CuentaBancaria >> getNumero
Implementación de la clase (3)
CuentaBancaria >> depositar: monto
( monto < 0 ) ifTrue: [ Error new signal. ] .
saldo := saldo + monto
2c2011 27
CuentaBancaria >> extraer: monto
( monto > saldo ) ifTrue: [Error new signal. ] .
saldo := saldo - monto
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de la clase (3)
CuentaBancaria >> depositar: monto
( monto < 0 ) ifTrue: [ Error new signal. ] .
saldo := saldo + monto
A3F
CuentaBancaria >> extraer: monto
( monto > saldo ) ifTrue: [Error new signal. ] .
Referencia self
Objeto “self”
depositar: monto
( monto < 0 ) ifTrue: [ Error new signal. ] .
self saldo := self saldo + monto
El mensaje se envía al “receptor”
2c2011 28
El mensaje se envía al “receptor”
cuenta depositar: 2000.
Lo mismo pasaba con los assert y los should
de las pruebas
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Referencia self
( monto < 0 ) ifTrue: [ Error new signal. ] .
self saldo := self saldo + monto
El mensaje se envía al “receptor”
A3F
El mensaje se envía al “receptor”
“self referencia al receptor”
Lo mismo pasaba con los assert y los should
Implementación de la clase (4)
CuentaBancaria >>
inicializarConNumero: num conTitular: tit
( (num isNil) | (tit isNil) | (tit = '') | (num <= 0) )
2c2011 29
ifTrue: [Error new signal ] .
numero := numero.
titular := titular.
saldo := 0
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Implementación de la clase (4)
inicializarConNumero: num conTitular: tit
( (num isNil) | (tit isNil) | (tit = '') | (num <= 0) )
A3F
ifTrue: [Error new signal ] .
Los objetos deben saber cómo comportarse
Ya lo dijimos:
Diferencia más importante con programación estructurada
Corolarios:
Deben manejar su propio comportamiento
2c2011 30
Deben manejar su propio comportamiento
No debemos manipular sus detalles desde afuera
En vez de:
cuenta setSaldo: [ cuenta getSaldo + monto ].
Hacemos:
cuenta depositar: monto.
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Los objetos deben saber cómo comportarse
Diferencia más importante con programación
Deben manejar su propio comportamiento
A3F
Deben manejar su propio comportamiento
No debemos manipular sus detalles desde afuera
cuenta setSaldo: [ cuenta getSaldo + monto ].
Encapsulamiento
Alan Kay, creador de Smalltalk, y del término “Programación Orientada a Objetos” se basó en sus conocimientos de bacterias
La membrana de una bacteria nos aísla de la complejidad interna
La bacteria interactúa con el mundo a través
2c2011 31
La bacteria interactúa con el mundo a través de su interfaz
Respondiendo a estímulos
Realizando acciones
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Encapsulamiento
Alan Kay, creador de Smalltalk, y del término “Programación Orientada a Objetos” se basó en sus conocimientos de bacterias
La membrana de una bacteria nos aísla de la
La bacteria interactúa con el mundo a través
A3F
La bacteria interactúa con el mundo a través
Respondiendo a estímulos
Constructores o inicializadores
No existen en Smalltalk: sólo está el método de clase new
Debería dejar al objeto en un estado válido
=> debe cumplir con los invariantes
El “new” no es seguro
Hay un método “initialize”, que se puede redefinir
2c2011 32
De todas maneras, no tiene parámetros
⇒Tampoco es seguro
Por eso definimos el método:
CuentaBancaria >> inicializarConNumero: numero conTitular: titular
Se invoca
cuenta := CuentaBancaria new
inicializarConNumero: 1234 conTitular:’Juan’
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Constructores o inicializadores
No existen en Smalltalk: sólo está el método de clase new
Debería dejar al objeto en un estado válido
Hay un método “initialize”, que se puede redefinir
A3F
De todas maneras, no tiene parámetros
CuentaBancaria >> inicializarConNumero: numero conTitular: titular
inicializarConNumero: 1234 conTitular:’Juan’
Visibilidad (conceptos)
Importante para garantizar ocultamiento de
implementación
Atributos y métodos privados
Sólo los puede usar el objeto receptor en su clase
2c2011 33
Atributos y métodos públicos
Se los puede usar desde cualquier lado
Atributos y métodos protegidos
Sólo los puede usar el objeto receptor en su clase y en
las clases derivadas
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Visibilidad (conceptos)
Importante para garantizar ocultamiento de
Atributos y métodos privados
Sólo los puede usar el objeto receptor en su clase
A3F
Atributos y métodos públicos
Se los puede usar desde cualquier lado
Atributos y métodos protegidos
Sólo los puede usar el objeto receptor en su clase y en
Visibilidad en Smalltalk
Todos los métodos son públicos
Todos los atributos son protegidos
No privados, se pueden acceder desde una
subclase
2c2011 34
subclase
Aunque se recomienda considerarlos privados
Hay convenciones para hacer métodos y
atributos privados
Pero no se puede forzar
Sólo como aviso
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Visibilidad en Smalltalk
Todos los métodos son públicos
Todos los atributos son protegidos
No privados, se pueden acceder desde una
A3F
Aunque se recomienda considerarlos privados
Hay convenciones para hacer métodos y
Pero no se puede forzar
Atributos de clase
Supongamos que necesitamos que el número de cuenta fuera incremental
Solución:
Agregar un atributo “ultimoNumero” que mantenga un único valor para la clase y todas sus instancias
2c2011 35
único valor para la clase y todas sus instancias
En Smalltalk se declaran en “classVariableNames”
classVariableNames: ‘ultimoNumero’
OJO: no confundir con los atributos del objeto clase
Algo propio de Smalltalk, porque las clases son objetos
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Atributos de clase
Supongamos que necesitamos que el número de
umero” que mantenga un único valor para la clase y todas sus instancias
A3F
único valor para la clase y todas sus instancias
En Smalltalk se declaran en “classVariableNames”
umero’
OJO: no confundir con los atributos del objeto clase
Algo propio de Smalltalk, porque las clases son objetos
Ejercicio: número autoincremental
Hay que cambiar las pruebas de los inicializadores con número, eliminando dos de ellas
Y hay que agregar al menos una:
PruebaCuentaBancaria >> pruebaAutoIncremental
cuenta1 := CuentaBancaria new
2c2011 36
cuenta1 := CuentaBancaria new
inicializarConTitular:’Juan Pérez’.
cuenta2 := CuentaBancaria new
inicializarConTitular:’Ana García’.
assert: ( (cuenta2 getNumero)
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Ejercicio: número auto-incremental
Hay que cambiar las pruebas de los inicializadores con número, eliminando dos de ellas
Y hay que agregar al menos una:
PruebaCuentaBancaria >> pruebaAutoIncremental
cuenta1 := CuentaBancaria new
A3F
cuenta1 := CuentaBancaria new
inicializarConTitular:’Juan Pérez’.
cuenta2 := CuentaBancaria new
inicializarConTitular:’Ana García’.
assert: ( (cuenta2 getNumero) – (cuenta1 getNumero) = 1)
Caso de atributo de clase
Escribimos prueba
Nos aseguramos de que no pase
Implementamos la solución
Nos aseguramos de que corra
2c2011 37
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Caso de atributo de clase
Nos aseguramos de que no pase
Implementamos la solución
Nos aseguramos de que corra
A3F
Atributos y propiedades: ojo con las apariencias
No todos los atributos tienen “getters” y “setters”
Sólo los necesarios
≠
2c2011 38
Sólo los necesarios
Hay propiedades que no corresponden a atributos
unString size => ¿tiene que haber un atributo?
numeroComplejo getModulo => propiedad calculable
Noción: ( propiedad = “atributo conceptual” )
=> Los atributos conceptuales deberían estar implementados como propiedades
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Atributos y propiedades: ojo con las apariencias
No todos los atributos tienen “getters” y “setters”
A3F
Hay propiedades que no corresponden a atributos
unString size => ¿tiene que haber un atributo?
numeroComplejo getModulo => propiedad calculable
Noción: ( propiedad = “atributo conceptual” )
=> Los atributos conceptuales deberían estar implementados
Smalltalk: todo son objetos vivos y mensajes
No hay variables que no referencien objetos
Las clases son objetos
El IDE es un objeto, y sus partes también
2c2011 39
El IDE es un objeto, y sus partes también
No hay estructuras de control: son mensajes
=> Modelo de objetos “puro”
Sólo objetos y mensajes
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Smalltalk: todo son objetos vivos y mensajes
No hay variables que no referencien objetos
El IDE es un objeto, y sus partes también
A3F
El IDE es un objeto, y sus partes también
No hay estructuras de control: son mensajes
=> Modelo de objetos “puro”
Claves
Clases se implementan en base a un modelo cliente-proveedor
Las clases son tipos definidos por el programador
Que representan entidades del dominio del
2c2011 40
Que representan entidades del dominio del problema
Implementación con dos modelos
Contratos
TDD
Las pruebas deben ser automatizadas
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Claves
Clases se implementan en base a un modelo
Las clases son tipos definidos por el
Que representan entidades del dominio del
A3F
Que representan entidades del dominio del
Implementación con dos modelos
Las pruebas deben ser automatizadas
Lectura obligatoria
Apunte de Pruebas (ver sitio de la materia)
2c2011 41
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Lectura obligatoria
Apunte de Pruebas (ver sitio de la
A3F
Lecturas opcionales
Object-Oriented Software Construction, Bertrand Meyer
Está en la biblioteca
Especialmente capítulos 7, 8, 11 y 12
Test Driven Development: By Example, Kent Beck
No está en la Web ni en biblioteca
Code Complete, Steve McConnell, Capítulo 6: “Working
2c2011 42
Code Complete, Steve McConnell, Capítulo 6: “Working Classes”
No está en la Web ni en biblioteca
Implementation Patterns, Kent Beck, Capítulos 3 y 4: “A Theory of Programming” y “Motivation”
No está en la Web ni en biblioteca
Orientación a objetos, diseño y programación, Carlos Fontela 2008, capítulo 4 “Construcción de clases”
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Lecturas opcionales
Oriented Software Construction, Bertrand Meyer
Especialmente capítulos 7, 8, 11 y 12
Test Driven Development: By Example, Kent Beck
Code Complete, Steve McConnell, Capítulo 6: “Working
A3F
Code Complete, Steve McConnell, Capítulo 6: “Working
Implementation Patterns, Kent Beck, Capítulos 3 y 4: “A Theory of Programming” y “Motivation”
Orientación a objetos, diseño y programación, Carlos Fontela 2008, capítulo 4 “Construcción de clases”
Qué sigue
Delegación, herencia, polimorfismo
Excepciones y temas conceptuales
Temas varios
2c2011 43
No se puede mostrar la imagen. Puede que su equipo no tenga suficiente memoria para abrir la imagen o que ésta esté dañada. Reinicie el equipo y, a continuación, abra el archivo de nuevo. Si sigue apareciendo la x roja, puede que tenga que borrar la imagen e insertarla de nuevo.
Qué sigue
Delegación, herencia, polimorfismo
Excepciones y temas conceptuales
A3F