43
Clase (construc (construc Carlos F cfontela@ 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. es cción) A3F cción) Fontela @fi.uba.ar

7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

Clases

(construcción)(construcción)

Carlos Fontela

[email protected]

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

[email protected]

Page 2: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 3: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 4: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 5: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 6: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 7: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 8: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 9: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 10: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 11: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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:

Page 12: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 13: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 14: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 15: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 16: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 17: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 18: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

¿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

Page 19: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 20: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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’

Page 21: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 22: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 23: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 24: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 25: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 26: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 27: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 28: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 29: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 30: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 31: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 32: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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’

Page 33: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 34: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 35: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 36: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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)

Page 37: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 38: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 39: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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”

Page 40: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 41: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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

Page 42: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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”

Page 43: 7507 02 clases.ppt [Modo de compatibilidad]materias.fi.uba.ar/.../2011-2/teoricas/7507_02_clases.pdfImplementación de clases (2) En UML: Lo que se indica con (-) está oculto: es

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