Está en la página 1de 34

Clases (construccin)

Carlos Fontela cfontela@fi.uba.ar

A3F

Temario
Implementacin de clases
Atributos
Mtodos y propiedades Constructores Excepciones

Diseo contractual TDD o diseo guiado por las pruebas


2c2009

A3F

Dijimos
POO parte de las entidades del dominio del problema Que son objetos con comportamiento Cmo? => Implementando clases

2c2009

A3F

Implementacin de clases (1)


Clase = tipo definido por el programador
No los llamamos abstractos: en POO eso es otra cosa
Ampliar el lenguaje

Se definen estructura y operaciones

Ocultamiento: cliente necesita conocer interfaz


No necesita conocer aspectos internos (implementacin) Riesgos de la falta de ocultamiento
2c2009

Impedir evolucin 4 Violacin de restricciones

A3F

Implementacin 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 pblico

2c2009

A3F

Implementacin de clases: cmo?


Varios caminos de diseo
Modelo contractual
Desarrollo guiado por las pruebas

Son complementarios y no excluyentes

2c2009

A3F

Modelo contractual (1)


Una clase es provista por un proveedor a un cliente en base a un contrato Bertrand Meyer y diseo por contrato

2c2009

A3F

Modelo contractual (2)


El contrato se evidencia por
Firmas de mtodos y propiedades
Precondiciones de mtodos y propiedades Postcondiciones de mtodos y propiedades
Incluyendo resultados obtenidos Incluyendo casos de excepcin

Invariantes de la clase
Restricciones que siempre cumplen todas las instancias

2c2009

A3F

Cuenta bancaria: firmas de mtodos


Constructor: (para crear e inicializar) => ver luego
CuentaBancaria inicializarConNumero: numero conTitular: titular

Mtodos (y propiedades):
cuenta depositar: monto

cuenta extraer: monto


cuenta getSaldo

cuenta getTitular
cuenta getNumero

Ojo que en Smalltalk no se definen los tipos


2c2009

A3F

Cuenta bancaria: atributos


Son variables internas de cada objeto, que sirven para mantener el estado de los mismos Para una cuenta bancaria:

Ojo que en Smalltalk no se define el tipo antes de usarlos Podra haber ms, que descubramos ms 2c2009 10 adelante

A3F

Cuenta bancaria: precondiciones


CuentaBancaria inicializarConNumero: numero conTitular: titular Precondicin 1: titular no debe valer nil ni referenciar una cadena vaca Precondicin 2: numero > 0

cuenta depositar: monto Precondicin 1: cuenta no debe valer nil (debe referenciar un objeto) Precondicin 2: monto > 0

Tarea: definir precondiciones para los otros mtodos


2c2009

11

A3F

Cuenta bancaria: postcondiciones


CuentaBancaria inicializarNumero: numero titular: titular Postcondicin 1: se cre un objeto de la clase CuentaBancaria, con el nmero y el titular indicados
Postcondicin 2 (alternativa): si titular es nil o referencia una cadena vaca, se arroja una excepcin de tipo Error cuenta depositar: monto Postcondicin 1: el saldo de la cuenta aument en el valor del monto Postcondicin 2 (alternativa): si monto < 0 , se arroja una excepcin de tipo Error

2c2009

12

A3F

Cuenta bancaria: invariantes


Son las restricciones en los valores de los atributos, vlidas para todas las instancias Son postcondiciones de todos los mtodos, incluyendo el constructor Corolario: el constructor debe dejar a la instancia creada en un estado vlido Invariantes de CuentaBancaria:
saldo >= 0 titular <> nil titular <> numero > 0
2c2009

13

A3F

Implementacin de la clase (1)


Object subclass: # CuentaBancaria instanceVariableNames: numero titular saldo classVariableNames:

poolDictionaries: category: nil !

2c2009

14

A3F

Implementacin de la clase (2)


! CuentaBancaria methodsFor: consulta ! getSaldo ^saldo ! getTitular ^titular ! getNumero ^numero !!
2c2009

15

A3F

Implementacin de la clase (3)


! CuentaBancaria methodsFor: operaciones !

depositar: monto
( monto < 0 ) ifTrue: [ Error new signal. ] .

saldo := saldo + monto


! extraer: monto

( monto > saldo ) ifTrue: [Error new signal. ] .


saldo = saldo - monto !!
2c2009

16

A3F

Implementacin de la clase (4)


! CuentaBancaria methodsFor: inicializar !

CuentaBancaria inicializarNumero: n titular: t (numero <= 0 | titular = nil | titular = ) ifTrue: [Error new signal ] . | cuentaNueva | cuentaNueva := CuentaBancaria new. cuentaNueva numero := n.
cuentaNueva titular := t. cuentaNueva saldo := 0;

^ cuentaNueva.
!!
2c2009

17

A3F

Referencia self
Objeto self
depositar: monto ( monto < 0 ) ifTrue: [ Error new signal. ] . self saldo := self saldo + monto !

Invocacin con el objeto actual


cuenta depositar: 2000.

self referencia al objeto actual


2c2009

18

A3F

Modelo contractual en la prctica


Precondiciones
Si no se cumplen, lanzamos una excepcin

Postcondiciones
Si no se cumplen, podramos lanzar una excepcin Pero la prueba unitaria es un mejor camino
Veremos ms adelante

Invariantes
2c2009

Son postcondiciones permanentes


19

A3F

Excepciones: lanzamiento
Las excepciones son objetos

Se crean y se lanzan hacia el mdulo invocante


Sintaxis:
ClaseException new signal. ClaseException new signal: un texto.

Ya vimos cmo capturarlas


El texto lo obtenemos con el mtodo messageText

Veremos formalmente excepciones ms adelante


2c2009

20

A3F

Los objetos deben saber cmo comportarse


Ya lo dijimos:
Diferencia ms importante con programacin estructurada

Corolarios:
Deben manejar su propio comportamiento No debemos manipular sus detalles desde afuera

En vez de:
cuenta setSaldo: [ cuenta getSaldo + monto ].

Hacemos:
cuenta depositar: monto.
2c2009

21

A3F

Encapsulamiento
Alan Kay, creador de Smalltalk, y del trmino Programacin Orientada a Objetos se bas en sus conocimientos de bacterias La membrana de una bacteria nos asla de la complejidad interna La bacteria interacta con el mundo a travs de su interfaz
Respondiendo a estmulos Realizando acciones

2c2009

22

A3F

Constructores o inicializadores
No existen en Smalltalk: slo est el mtodo de clase new
Debera dejar al objeto en un estado vlido
=> debe cumplir con los invariantes El new no es seguro

Hay un mtodo initialize, que se puede redefinir


Nos falta ver herencia para entenderlo De todas maneras, no tiene parmetros
Tampoco es seguro

Por eso definimos el mtodo:


CuentaBancaria inicializarNumero: n titular: t

Se invoca
cuenta := CuentaBancaria new inicializarNumero: 1234 titular:Juan
2c2009

23

A3F

Visibilidad
Importante para garantizar ocultamiento de implementacin

Atributos, propiedades y mtodos privados


Slo se pueden usar desde dentro de la clase en que estn

definidos

Atributos, propiedades y mtodos pblicos


Se los puede usar desde cualquier lado

Smalltalk
Todos los mtodos son pblicos Todos los atributos son protegidos (semi-privados)
2c2009

Veremos luego

24

A3F

Diseo guiado por pruebas


Test-Driven Development = Test-First + automatizacin + refactorizacin Test-First:
Escribir cdigo de pruebas antes del cdigo productivo

Automatizacin:
Las pruebas deben expresarse como cdigo, 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

Refactorizacin: mejora de calidad del diseo 2c2009sin cambio de funcionalidad 25

A3F

TDD: frameworks de pruebas automatizadas


Ejemplo de CuentaBancaria con SUnit
Llegamos a la misma clase

En Java existe JUnit En .NET , NUnit Muy importantes en refactorizacin Los van a ver en la prctica
2c2009

26

A3F

Cmo implementamos las clases?


Ayudarse por los dos caminos
Modelo contractual TDD

Pruebas automatizadas sirven para


TDD Invariantes y postcondiciones del modelo contractual

Otra herramienta: aserciones en el modelo contractual


Es redundante y preferimos las otras
2c2009

27

A3F

Procedimient o

2c2009

28

A3F

Atributos y propiedades: ojo con las apariencias

No todos los atributos tienen getters y setters


Slo los necesarios

Hay propiedades que no corresponden a atributos


unString size => tiene que haber un atributo?

numeroComplejo getModulo => propiedad calculable

Nocin: ( propiedad = atributo conceptual )

=> Los atributos conceptuales deberan estar implementados como propiedades


2c2009

29

A3F

Atributos de clase
Supongamos que necesitamos que el nmero de cuenta fuera incremental Solucin:
Agregar un atributo numeroAcumulado que mantenga un nico valor para la clase

Eso es un atributo de clase En Smalltalk de clase se declaran en classVariableNames


classVariableNames: numeroAcumulado

Ejercicio: cambiar CuentaBancaria para que nmero de cuenta sea incremental

2c2009

30

A3F

Smalltalk: todo son objetos y mensajes


No hay variables que no referencien objetos Las clases son objetos Los mtodos son objetos

Las estructuras de control son mtodos


=> Modelo de objetos puro
Slo objetos y mensajes
2c2009

31

A3F

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 problema

Diseo con dos modelos


Contratos TDD

Las pruebas deben ser automatizadas


2c2009

32

A3F

Lecturas opcionales
Object-Oriented Software Construction, Bertrand Meyer
Est en la biblioteca

Especialmente captulos 7, 8, 11 y 12

Test Driven Development: By Example, Kent Beck


No est en la Web ni en biblioteca

Code Complete, Steve McConnell, Captulo 6: Working Classes


No est en la Web ni en biblioteca

Implementation Patterns, Kent Beck, Captulos 3 y 4: A Theory of Programming y Motivation


No est en la Web ni en biblioteca

Orientacin a objetos, diseo y programacin, Carlos Fontela 2008, captulo 4 Construccin de clases
2c2009

33

A3F

Qu sigue
Delegacin, herencia

Polimorfismo, construccin de excepciones


POO en Java y C#

2c2009

34

A3F

También podría gustarte