capítulo 1. tipos de datos abstractos y programación orientada a objetos 1.1 concepto de tipo de...

68
Capítulo 1. Tipos de Datos Capítulo 1. Tipos de Datos Abstractos y Programación Abstractos y Programación Orientada a Objetos Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos. 1.2 Clasificación de Tipos de Datos Abstractos. 1.3 Especificación de Tipos de Datos Abstractos. 1.3 Especificación de Tipos de Datos Abstractos. 1.3.1 Especificaciones informales. 1.3.1 Especificaciones informales. 1.3.2 Especificaciones formales. 1.3.2 Especificaciones formales. 1.4 Programación Orientada a Objetos 1.4 Programación Orientada a Objetos 1.4.1 Clases y Objetos. 1.4.1 Clases y Objetos. 1.4.2 Propiedades y Métodos. 1.4.2 Propiedades y Métodos. 1.4.3 Herencia y Polimorfismo. 1.4.3 Herencia y Polimorfismo. 1.4.4 Pautas generales en diseño orientado a objetos. 1.4.4 Pautas generales en diseño orientado a objetos. 1.4.5 Técnicas de implementación 1.4.5 Técnicas de implementación 1.4.5.1 Implementaciones estáticas y dinámicas. 1.4.5.1 Implementaciones estáticas y dinámicas. 1.4.5.2 Representaciones contiguas y enlazadas. 1.4.5.2 Representaciones contiguas y enlazadas. 1.4.6 Utilización correcta de objetos. 1.4.6 Utilización correcta de objetos. 1.4.6.1 Privacidad de los objetos. 1.4.6.1 Privacidad de los objetos. 1.4.6.2 Previniendo efectos laterales. 1.4.6.2 Previniendo efectos laterales. 1.4.6.3 Comparación de objetos. 1.4.6.3 Comparación de objetos. 1.4.6.4 Tratamiento de excepciones. 1.4.6.4 Tratamiento de excepciones. 1.4.7 Ejemplos en Java. 1.4.7 Ejemplos en Java.

Upload: elvira-segura

Post on 23-Jan-2015

41 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

Capítulo 1. Tipos de Datos Abstractos y Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a ObjetosProgramación Orientada a Objetos

1.1 Concepto de Tipo de Datos Abstracto.1.1 Concepto de Tipo de Datos Abstracto.1.2 Clasificación de Tipos de Datos Abstractos.1.2 Clasificación de Tipos de Datos Abstractos.1.3 Especificación de Tipos de Datos Abstractos.1.3 Especificación de Tipos de Datos Abstractos.

1.3.1 Especificaciones informales.1.3.1 Especificaciones informales.1.3.2 Especificaciones formales.1.3.2 Especificaciones formales.

1.4 Programación Orientada a Objetos1.4 Programación Orientada a Objetos 1.4.1 Clases y Objetos.1.4.1 Clases y Objetos.

1.4.2 Propiedades y Métodos.1.4.2 Propiedades y Métodos.1.4.3 Herencia y Polimorfismo.1.4.3 Herencia y Polimorfismo.1.4.4 Pautas generales en diseño orientado a objetos.1.4.4 Pautas generales en diseño orientado a objetos.1.4.5 Técnicas de implementación1.4.5 Técnicas de implementación

1.4.5.1 Implementaciones estáticas y dinámicas.1.4.5.1 Implementaciones estáticas y dinámicas.1.4.5.2 Representaciones contiguas y enlazadas.1.4.5.2 Representaciones contiguas y enlazadas.

1.4.6 Utilización correcta de objetos.1.4.6 Utilización correcta de objetos.1.4.6.1 Privacidad de los objetos.1.4.6.1 Privacidad de los objetos.1.4.6.2 Previniendo efectos laterales.1.4.6.2 Previniendo efectos laterales.1.4.6.3 Comparación de objetos.1.4.6.3 Comparación de objetos.1.4.6.4 Tratamiento de excepciones.1.4.6.4 Tratamiento de excepciones.

1.4.7 Ejemplos en Java.1.4.7 Ejemplos en Java.

Page 2: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.1 Concepto y terminología1.1 Concepto y terminología

Tipos de Tipos de DDatos atos colección de valores + operaciones colección de valores + operaciones Enteros, reales, booleanos, caracteresEnteros, reales, booleanos, caracteres Enumerados, subrangoEnumerados, subrango Son opacosSon opacos

Tipos EstructuradosTipos Estructurados genericidad genericidad Riesgo de crear valores sin semánticaRiesgo de crear valores sin semántica

Tipos de Datos Abstractos (TDA)Tipos de Datos Abstractos (TDA) Tipos de datos creados por el programador, que deben ser Tipos de datos creados por el programador, que deben ser

opacosopacos

Page 3: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.1 Concepto y terminología1.1 Concepto y terminología

Tipos de Tipos de DDatos atos AAbstractos:bstractos: Colección de valores + operacionesColección de valores + operaciones Se definen mediante una especificación, que es Se definen mediante una especificación, que es

independiente de cualquier representación (abstracción)independiente de cualquier representación (abstracción) Acceso a los valores limitado al uso de las operaciones Acceso a los valores limitado al uso de las operaciones

(interfaz con el usuario limitada)(interfaz con el usuario limitada) Establecida la interfaz, el programador elige la Establecida la interfaz, el programador elige la

representación adecuada (implementación)representación adecuada (implementación) Los usuarios del TDA sólo conocen su nombre y la Los usuarios del TDA sólo conocen su nombre y la

especificación de las operacionesespecificación de las operaciones Cambios en la representación no afectarán al resto de Cambios en la representación no afectarán al resto de

programasprogramas

Page 4: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.1 Concepto y terminología1.1 Concepto y terminología

Tipos de Tipos de DDatos atos AAbstractos:bstractos: El lenguaje de programación trata a los TDA’s de igual El lenguaje de programación trata a los TDA’s de igual

forma que a sus propios tipos de datos, es decir, como forma que a sus propios tipos de datos, es decir, como tipos opacos:tipos opacos: Privacidad de la representaciónPrivacidad de la representación ProtecciónProtección

Para que esto sea posible, la implementación deberá Para que esto sea posible, la implementación deberá realizarse en un ámbito de declaración inaccesible al realizarse en un ámbito de declaración inaccesible al resto de los programasresto de los programas

Page 5: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.1 Concepto y terminología1.1 Concepto y terminología

Tipos de Tipos de DDatos atos AAbstractos:bstractos: El conjunto de operaciones ha de permitir generar cualquier El conjunto de operaciones ha de permitir generar cualquier

valor del tipovalor del tipo Existen dos piezas de documentación bien diferenciadas:Existen dos piezas de documentación bien diferenciadas:

Especificación del TDAEspecificación del TDA. Es lo . Es lo únicoúnico que conoce el usuario que conoce el usuario del TDA. Consiste en el nombre del TDA y la especificación de del TDA. Consiste en el nombre del TDA y la especificación de las operaciones. Tienen parte sintáctica y parte semánticalas operaciones. Tienen parte sintáctica y parte semántica

Implementación del TDAImplementación del TDA. Conocida sólo por el programador . Conocida sólo por el programador del TDA. Se realiza en un lenguaje de programación concreto. del TDA. Se realiza en un lenguaje de programación concreto. Consiste en la representación del tipo y en la realización de Consiste en la representación del tipo y en la realización de las operacioneslas operaciones

Page 6: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.1 Concepto y terminología1.1 Concepto y terminología

Tipos de datos abstractos:Tipos de datos abstractos: Se destacan los detalles (normalmente pocos) del Se destacan los detalles (normalmente pocos) del

comportamiento observable del tipocomportamiento observable del tipo, que, que es estable es estable.. Se ocultan los detalles (normalmente numerosos) de la Se ocultan los detalles (normalmente numerosos) de la

implementaciónimplementación, que es , que es propensa a cambiospropensa a cambios..

Page 7: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.2 Clasificación de Tipos de Datos Abstractos1.2 Clasificación de Tipos de Datos Abstractos

Tipos de Tipos de DDatos atos AAbstractos simples:bstractos simples: Cambian su valor pero no su estructura Cambian su valor pero no su estructura espacio de espacio de

almacenamiento constantealmacenamiento constante Enteros, reales, booleanos, carácter, enumerado, Enteros, reales, booleanos, carácter, enumerado,

subrango, etc.subrango, etc.

Tipos de Tipos de DDatos atos AAbstractos contenedores:bstractos contenedores: Cambian su valor y estructura (colecciones de elementos Cambian su valor y estructura (colecciones de elementos

de número variable) de número variable) espacio de almacenamiento variable espacio de almacenamiento variable Listas, colas, pilas, árboles, grafos, conjuntos, etc.Listas, colas, pilas, árboles, grafos, conjuntos, etc.

Page 8: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.2 Clasificación de Tipos de Datos Abstractos1.2 Clasificación de Tipos de Datos Abstractos

Tipos de datos abstractos inmutables:Tipos de datos abstractos inmutables: Sus casos no pueden modificarse (se crean y destruyen, Sus casos no pueden modificarse (se crean y destruyen,

pero no existen operaciones de modificación)pero no existen operaciones de modificación) Representación inmutable o mutableRepresentación inmutable o mutable

Tipos de datos abstractos mutableTipos de datos abstractos mutabless:: Sus casos pueden modificarse (existen operaciones de Sus casos pueden modificarse (existen operaciones de

modificación)modificación) Representación mutableRepresentación mutable

Page 9: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3 Especificación de Tipos de Datos Abstractos1.3 Especificación de Tipos de Datos Abstractos

ImplementaciónImplementacióndel TDAdel TDA

RepresentaciónRepresentaciónelegidaelegida

RepresentaciónRepresentaciónde las operacionesde las operaciones ++

EspecificaciónEspecificaciónUsuarioUsuario ImplementadorImplementador

TDA TDA Colección de valores + Operaciones Colección de valores + Operaciones

Page 10: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3 Especificación de Tipos de Datos Abstractos1.3 Especificación de Tipos de Datos Abstractos

Especificaciones informales:Especificaciones informales: Predomina el lenguaje natural Predomina el lenguaje natural Poco precisas y breves Poco precisas y breves ambigüedad ambigüedad Sencillas de escribir, leer y entenderSencillas de escribir, leer y entender

Especificaciones formales:Especificaciones formales: Lenguaje alLenguaje alggeebbraico raico verificación formal de programas verificación formal de programas Precisas y brevesPrecisas y breves Pueden resultar más complejas de escribir, leer y entenderPueden resultar más complejas de escribir, leer y entender

Page 11: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.1 Especificaciones informales1.3.1 Especificaciones informales

CabeceraCabecera: Aparece el nombre de las operaciones.: Aparece el nombre de las operaciones. DescripciónDescripción: Se describe de forma general en qué consiste la : Se describe de forma general en qué consiste la

abstracción, sin decir nada acerca de la implementación. Los casos abstracción, sin decir nada acerca de la implementación. Los casos del TDA pueden describirse en términos de otros tipos para los cuales del TDA pueden describirse en términos de otros tipos para los cuales se espera que el lector de la especificación esté más familiarizado. Se se espera que el lector de la especificación esté más familiarizado. Se pueden utilizar gráficos y abstracciones matemáticas. Se puede incluir pueden utilizar gráficos y abstracciones matemáticas. Se puede incluir en la descripción si el TDA es mutable o inmutableen la descripción si el TDA es mutable o inmutable

Especificación de las operacionesEspecificación de las operaciones: Para la especificación de una : Para la especificación de una abstracción operacional seguiremos el siguiente modelo:abstracción operacional seguiremos el siguiente modelo:

nombre de la operación (entrada) devuelve (salida)nombre de la operación (entrada) devuelve (salida) requerimientos: Esta cláusula muestra las restricciones de usorequerimientos: Esta cláusula muestra las restricciones de uso

modifica: Esta cláusula identifica las entradas que van a ser modificadasmodifica: Esta cláusula identifica las entradas que van a ser modificadas

efecto: Esta cláusula define el comportamientoefecto: Esta cláusula define el comportamiento

Page 12: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.1 Especificaciones informales1.3.1 Especificaciones informales

Observamos los siguientes componentes:Observamos los siguientes componentes: CabeceraCabecera: Es la información sintáctica. Se indica el nombre de la operación y el : Es la información sintáctica. Se indica el nombre de la operación y el

número, orden y tipos de sus entradas y salidas. Deben darse nombres para las número, orden y tipos de sus entradas y salidas. Deben darse nombres para las entradas y pueden darse para las salidasentradas y pueden darse para las salidas

CuerpoCuerpo: Es la información semántica. Consta de las siguientes cláusulas:: Es la información semántica. Consta de las siguientes cláusulas: RequerimientosRequerimientos: Restringen el dominio del procedimiento o función. Cuando introducimos : Restringen el dominio del procedimiento o función. Cuando introducimos

requerimientos, obtenemos una abstracción operacional parcial (en caso contario se dice requerimientos, obtenemos una abstracción operacional parcial (en caso contario se dice que la abstracción es total). El que use la abstracción es el responsable de que los que la abstracción es total). El que use la abstracción es el responsable de que los requerimientos se cumplan; si estos no se cumplen, los resultados pueden ser requerimientos se cumplan; si estos no se cumplen, los resultados pueden ser impredecibles. Si la abstracción es total, la cláusula de requerimientos puede omitirse. Se impredecibles. Si la abstracción es total, la cláusula de requerimientos puede omitirse. Se supone como requerimiento implícito (y por tanto no tiene que ser explicitado en la cláusula supone como requerimiento implícito (y por tanto no tiene que ser explicitado en la cláusula de requerimientos) que las entradas que figuran en la lista de parámetros de la abstracción de requerimientos) que las entradas que figuran en la lista de parámetros de la abstracción han sido correctamente construidas mediante algún constructor del tipohan sido correctamente construidas mediante algún constructor del tipo

ModificaModifica: Indica los argumentos de entrada que cambian de valor tras una llamada a la : Indica los argumentos de entrada que cambian de valor tras una llamada a la abstracción operacionalabstracción operacional

EfectoEfecto: Se indica el efecto que se produce al ejecutar la operación para las entradas que : Se indica el efecto que se produce al ejecutar la operación para las entradas que cumplen los requerimientos. Debe definir qué salidas son producidas y también qué cumplen los requerimientos. Debe definir qué salidas son producidas y también qué modificaciones son hechas en la lista de entradas de la cláusula modifica. La cláusula modificaciones son hechas en la lista de entradas de la cláusula modifica. La cláusula efecto se escribe bajo la asumpción de que se satisface la cláusula requerimientos, y no se efecto se escribe bajo la asumpción de que se satisface la cláusula requerimientos, y no se dice nada sobre el efecto de la abstracción cuando dicha cláusula no se satisfacedice nada sobre el efecto de la abstracción cuando dicha cláusula no se satisface

Page 13: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3 Especificación de Tipos de Datos Abstractos1.3 Especificación de Tipos de Datos Abstractos

El usuario de la abstracción es el responsable de El usuario de la abstracción es el responsable de que se cumplan los requerimientosque se cumplan los requerimientos

Implementaciones robustas: se autoprotegen frente Implementaciones robustas: se autoprotegen frente a valores inconsistentesa valores inconsistentes

Mecanismos de protección frente a errores:Mecanismos de protección frente a errores: Manejo de excepcionesManejo de excepciones Parámetros de salida de error en cada operaciónParámetros de salida de error en cada operación

Puesto que las especificaciones son independientes Puesto que las especificaciones son independientes de las implementaciones, existen requerimientos de de las implementaciones, existen requerimientos de uso (información adicional de cara al usuario)uso (información adicional de cara al usuario)

Page 14: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.1 Especificaciones informales1.3.1 Especificaciones informales

RacionalRacional = tipo de datos es = tipo de datos es crea, num, den, suma, resta, multiplica, divide, crea, num, den, suma, resta, multiplica, divide, simplificasimplifica

DESCRIPCIÓN: Los valores del TDA racional son números racionales. El TDA DESCRIPCIÓN: Los valores del TDA racional son números racionales. El TDA Racional es inmutable.Racional es inmutable.

OPERACIONES:OPERACIONES: crea(a,b:entero) devuelve (Racional)crea(a,b:entero) devuelve (Racional)

requerimientos: b<>0.requerimientos: b<>0.efecto: Devuelve un número racional cuyo numerador es a y cuyo denominador es b.efecto: Devuelve un número racional cuyo numerador es a y cuyo denominador es b.

num(a:Racional) devuelve (entero)num(a:Racional) devuelve (entero)efecto: Devuelve el numerador del número racional a.efecto: Devuelve el numerador del número racional a.

den(a:Racional) devuelve (entero)den(a:Racional) devuelve (entero)efecto: Devuelve el denominador del número racional a.efecto: Devuelve el denominador del número racional a.

suma(a,b:Racional) devuelve (Racional)suma(a,b:Racional) devuelve (Racional)efecto: Devuelve un número racional que es la suma de los números racionales a y b.efecto: Devuelve un número racional que es la suma de los números racionales a y b.

resta(a,b:Racional) devuelve (Racional)resta(a,b:Racional) devuelve (Racional)efecto: Devuelve un número racional que es la resta de los números racionales a y b.efecto: Devuelve un número racional que es la resta de los números racionales a y b.

multiplica(a,b:Racional) devuelve (Racional) multiplica(a,b:Racional) devuelve (Racional) efecto: Devuelve un número racional que es la multiplicación de los números racionales efecto: Devuelve un número racional que es la multiplicación de los números racionales

a y b.a y b. divide(a,b:Racional) devuelve (Racional)divide(a,b:Racional) devuelve (Racional)

efecto: Devuelve un número racional que es la división de los números racionales a y b.efecto: Devuelve un número racional que es la división de los números racionales a y b. simplifica(a:Racional) devuelve (Racional)simplifica(a:Racional) devuelve (Racional)

efecto: Devuelve un número racional que es la simplificación del número racional a.efecto: Devuelve un número racional que es la simplificación del número racional a.

Page 15: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.2 Especificaciones formales1.3.2 Especificaciones formales

Tipo: Nombre del TDATipo: Nombre del TDA

Sintasis: Forma de las operacionesSintasis: Forma de las operaciones

nombre de la función (tipo de los argumentos) nombre de la función (tipo de los argumentos) tipo del resultado tipo del resultado

Semántica: Significado de las operacionesSemántica: Significado de las operaciones

nombre de la función (valores particulares) nombre de la función (valores particulares) expresión del resultado expresión del resultado

Page 16: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.2 Especificaciones formales1.3.2 Especificaciones formales

No se definen reglas semánticas (se consideran axiomas) No se definen reglas semánticas (se consideran axiomas) para ciertas funciones, como son algunas funciones para ciertas funciones, como son algunas funciones constructoras o las funciones destructoras.constructoras o las funciones destructoras.

La expresión del resultado puede ser recursiva, conteniendo La expresión del resultado puede ser recursiva, conteniendo referencias a la misma función o a otras del TDA.referencias a la misma función o a otras del TDA.

Las expresiones pueden contener referencias a otros tipos Las expresiones pueden contener referencias a otros tipos que consideramos predefinidos. En particular es importante que consideramos predefinidos. En particular es importante considerar como predefinido el tipo booleano, con los valores considerar como predefinido el tipo booleano, con los valores ciertocierto y y falsofalso, o el valor predefinido , o el valor predefinido errorerror, para indicar los , para indicar los valores de los argumentos en los que ciertas funciones valores de los argumentos en los que ciertas funciones parciales no están definidas.parciales no están definidas.

Cualquier implementación del TDA deberá cumplir las Cualquier implementación del TDA deberá cumplir las condiciones impuestas por la semántica.condiciones impuestas por la semántica.

Las reglas han de intentar aplicarse en el orden indicado para Las reglas han de intentar aplicarse en el orden indicado para la verificación formal de programas.la verificación formal de programas.

Page 17: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.2 Especificaciones formales1.3.2 Especificaciones formales

Para facilitar la escritura de las expresiones en la parte de Para facilitar la escritura de las expresiones en la parte de semántica, se permite emplear expresiones condicionales, que semántica, se permite emplear expresiones condicionales, que adoptan la forma:adoptan la forma:

si condición si condición valor si cierto | valor si falso valor si cierto | valor si falso

La condición será una expresión que toma un valor booleano. La condición será una expresión que toma un valor booleano. Se considera como predefinida la comparación de igualdad Se considera como predefinida la comparación de igualdad entre valores del mismo tipo, escrita como valor1 = valor2.entre valores del mismo tipo, escrita como valor1 = valor2.

Otra ampliación de la notación es permitir la definición de TDA's Otra ampliación de la notación es permitir la definición de TDA's genéricos, que se expresan en base a otro u otros tipos sin genéricos, que se expresan en base a otro u otros tipos sin

especificar exactamente cuáles son.especificar exactamente cuáles son.

Page 18: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.3.2 Especificaciones formales1.3.2 Especificaciones formales

Tipo Tipo Bolsa (Elemento) Bolsa (Elemento) SintaxisSintaxis

bolsavacia bolsavacia Bolsa Bolsaponer(Bolsa,Elemento) poner(Bolsa,Elemento) Bolsa Bolsaesvacia(Bolsa) esvacia(Bolsa) booleano booleanocuantos(Bolsa,Elemento) cuantos(Bolsa,Elemento) natural natural

SemánticaSemántica b b Bolsa, Bolsa, e,f e,f Elemento: Elemento:esvacia(bolsavacia) esvacia(bolsavacia) cierto ciertoesvacia(poner(b,e)) esvacia(poner(b,e)) falso falsocuantos(bolsavacia,e) cuantos(bolsavacia,e) cero cerocuantos(poner(b,f),e) cuantos(poner(b,f),e) si f=e si f=e sucesor(cuantos(b,e)) | sucesor(cuantos(b,e)) |

cuantos(b,e)cuantos(b,e)

Page 19: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4 Programación Orientada a 1.4 Programación Orientada a ObjetosObjetos

Características de la OO:Características de la OO:• HerenciaHerencia• PolimorfismoPolimorfismo

Objetivos conseguidos:Objetivos conseguidos:• EstructuraciónEstructuración• EncapsulaciónEncapsulación

Page 20: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4 Programación Orientada a 1.4 Programación Orientada a ObjetosObjetos

Conceptos de la OO:Conceptos de la OO:• ClaseClase• ObjetoObjeto• PropiedadPropiedad• MétodoMétodo• HerenciaHerencia• PolimorfismoPolimorfismo

Page 21: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4 Programación Orientada a 1.4 Programación Orientada a ObjetosObjetos

Estudiaremos:Estudiaremos:• Principales técnicas de implementación Principales técnicas de implementación

de TDA’sde TDA’s• Realización de dichas técnicas Realización de dichas técnicas

mediante un lenguaje orientado a mediante un lenguaje orientado a objetos, en concreto Java.objetos, en concreto Java.

Page 22: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4 Programación Orientada a 1.4 Programación Orientada a ObjetosObjetos

JavaJava::• Diseñado desde el principio como un Diseñado desde el principio como un

lenguaje orientado a objetos.lenguaje orientado a objetos.• Integración en el ámbito de las Integración en el ámbito de las

telecomunicaciones, en concreto, telecomunicaciones, en concreto, internet.internet.

• Lenguaje de gran actualidad e interés.Lenguaje de gran actualidad e interés.

Page 23: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.1 Clases y Objetos1.4.1 Clases y Objetos

ClaseClase: Tipo de datos definido por el : Tipo de datos definido por el usuario.usuario.

ObjetoObjeto: Es un dato del tipo definido por : Es un dato del tipo definido por su clase, es decir, es una instancia su clase, es decir, es una instancia específica de su clase.específica de su clase.

Page 24: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.1 Clases y Objetos1.4.1 Clases y Objetos

Fases de la vida de un objeto:Fases de la vida de un objeto:• Creación del Objeto: declaración + instanciaciónCreación del Objeto: declaración + instanciación• Objeto instanciadoObjeto instanciado• Destrucción del ObjetoDestrucción del Objeto

Creación del Objeto:Constructor

Objeto instanciadoDestrucción del Objeto:

Destructor

Page 25: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.1 Clases y Objetos1.4.1 Clases y Objetos

Declaración de una clase en Java:Declaración de una clase en Java:Class <nombre_de_la_clase> { }Class <nombre_de_la_clase> { }

Declaración de un Objeto:Declaración de un Objeto:<nombre_de_la_clase> <nombre_del_objeto><nombre_de_la_clase> <nombre_del_objeto>

Instanciación de un Objeto: mediante la palabra clave Instanciación de un Objeto: mediante la palabra clave newnew

Ejemplo:Ejemplo:Class Vehiculo{ }Class Vehiculo{ }

Vehiculo miVehiculo;Vehiculo miVehiculo;miVechiculo = new Vehiculo();miVechiculo = new Vehiculo();

O en una sola línea:O en una sola línea:Vehiculo miVehiculo = new Vehiculo();Vehiculo miVehiculo = new Vehiculo();

Page 26: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.2 Propiedades y Métodos1.4.2 Propiedades y Métodos

Campos de datos dentro de una clase: Campos de datos dentro de una clase: variables miembros o variables miembros o propiedades de la clasepropiedades de la clase..

Operaciones con los datos de una clase: Operaciones con los datos de una clase: funciones miembros o funciones miembros o métodos de la clasemétodos de la clase..

Los miembros de una clase (propiedades y métodos) pueden ser:Los miembros de una clase (propiedades y métodos) pueden ser:-PúblicosPúblicos; se puede acceder a ellos desde fuera de la clase; se puede acceder a ellos desde fuera de la clase-PrivadosPrivados; sólo se puede acceder a ellos desde dentro de la clase; sólo se puede acceder a ellos desde dentro de la clase

Para acceder a propiedades privadas de la clase se definen Para acceder a propiedades privadas de la clase se definen métodos métodos de accesode acceso..

Un miembro puede ser Un miembro puede ser estáticoestático, si pertenece a la clase en sí y no a los , si pertenece a la clase en sí y no a los objetos de la clase.objetos de la clase.

Page 27: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.2 Propiedades y Métodos1.4.2 Propiedades y Métodos

Definición en Java de una clase con sus propiedades y métodos:Definición en Java de una clase con sus propiedades y métodos:

<modificador> class <nombre_de_la_clase> {<modificador> class <nombre_de_la_clase> { private <tipo_de_dato> <nombre_del_dato>;private <tipo_de_dato> <nombre_del_dato>; public <nombre_de_la_clase> (<lista_de_argumentos>) {public <nombre_de_la_clase> (<lista_de_argumentos>) { <codigo_del_metodo_constructor><codigo_del_metodo_constructor> }} public <tipo_de_dato_devuelto> <nombre_del_metodo>public <tipo_de_dato_devuelto> <nombre_del_metodo> (<lista_de_argumentos>) {(<lista_de_argumentos>) { <codigo_del_metodo><codigo_del_metodo> }}}}

Page 28: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.2 Propiedades y Métodos1.4.2 Propiedades y Métodos

Palabras clave para restringir el acceso a los Palabras clave para restringir el acceso a los miembros de una clase:miembros de una clase:- publicpublic- privateprivate- protectedprotected

Miembro estático: Miembro estático: staticstatic

Page 29: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.2 Propiedades y Métodos1.4.2 Propiedades y Métodos

public class Vehiculo {public class Vehiculo {        private int numeroRuedas;private int numeroRuedas;        private double velocidadMaxima;private double velocidadMaxima;        public String nombrePropietario;public String nombrePropietario;        static private String nombreFabrica = "SEAT";static private String nombreFabrica = "SEAT";        public Vehiculo(int nRuedas) {public Vehiculo(int nRuedas) {                if (nRuedas<0) numeroRuedas=0;if (nRuedas<0) numeroRuedas=0;                else numeroRuedas = nRuedas;else numeroRuedas = nRuedas;        }}        public void estableceVelocidadMaxima(double vMaxima) {public void estableceVelocidadMaxima(double vMaxima) {                if (vMaxima<0) velocidadMaxima=0.0;if (vMaxima<0) velocidadMaxima=0.0;                else velocidadMaxima = vMaxima;else velocidadMaxima = vMaxima;        }}        public double recuperaVelocidadMaxima() {public double recuperaVelocidadMaxima() {                return velocidadMaxima;return velocidadMaxima;        }} static public String recuperaNombreFabrica() {static public String recuperaNombreFabrica() {                return nombreFabrica;return nombreFabrica;        }}}}

Page 30: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.2 Propiedades y Métodos1.4.2 Propiedades y Métodos

Declaración e instanciación de un objeto:Declaración e instanciación de un objeto:Vehiculo miVehiculo = new Vehiculo(4);Vehiculo miVehiculo = new Vehiculo(4);

Acceso a un dato publico:Acceso a un dato publico:miVehiculo.nombrePropietario = “Cipriano López”;miVehiculo.nombrePropietario = “Cipriano López”;String nombre = miVehiculo.nombrePropietario;String nombre = miVehiculo.nombrePropietario;

Acceso a un dato privado:Acceso a un dato privado:miVehiculo.estableceVelocidadMaxima(200.0);miVehiculo.estableceVelocidadMaxima(200.0);Double velocidad = Double velocidad = miVehiculo.recuperaVelocidadMaxima();miVehiculo.recuperaVelocidadMaxima();

Acceso a un dato estático:Acceso a un dato estático:String nombre = Vehiculo.recuperaNombreFabrica();String nombre = Vehiculo.recuperaNombreFabrica();

Page 31: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.3 Herencia y Polimorfismo1.4.3 Herencia y Polimorfismo

La herencia permite la La herencia permite la reutilización de códigoreutilización de código..Las clases Las clases MotocicletaMotocicleta y y CocheCoche son son subclasessubclases de de VehiculoVehiculo, , mientras que mientras que VehiculoVehiculo es la es la superclasesuperclase de de MotocicletaMotocicleta y y CocheCoche..Las clases Las clases MotocicletaMotocicleta y y CocheCoche heredanheredan de la clase de la clase VehiculoVehiculo todas sus variables y métodos miembros.todas sus variables y métodos miembros.

Vehiculo

Motocicleta Coche

Page 32: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.3 Herencia y Polimorfismo1.4.3 Herencia y Polimorfismo

Herencia multinivelHerencia multinivel

Vehiculo

Motocicleta Coche

Compacto Monovolumen

Page 33: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.3 Herencia y Polimorfismo1.4.3 Herencia y Polimorfismo

Conceptos de Polimorfismo:Conceptos de Polimorfismo:

-SobreescrituraSobreescritura: reemplazar los métodos de : reemplazar los métodos de la superclase en las subclases.la superclase en las subclases.

-SobrecargaSobrecarga: varios métodos se llaman igual, : varios métodos se llaman igual, pero difieren en el número, tipo u orden de pero difieren en el número, tipo u orden de sus argumentos.sus argumentos.

Page 34: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.3 Herencia y Polimorfismo1.4.3 Herencia y Polimorfismo

Declaración de subclases en JavaDeclaración de subclases en Java

public public class Motocicleta extends Vehiculo {class Motocicleta extends Vehiculo {          public Motocicleta() {public Motocicleta() {                  super(2);super(2);          }}}}

Page 35: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.3 Herencia y Polimorfismo1.4.3 Herencia y Polimorfismo

public class Coche extends Vehiculo {public class Coche extends Vehiculo {          private int numeroPuertas;private int numeroPuertas;          public Coche(int nPuertas) {public Coche(int nPuertas) {                  super(4);super(4);                  numeroPuertas = nPuertas;numeroPuertas = nPuertas;          }}          public Coche() {public Coche() {                  super(4);super(4);                  numeroPuertas = 4;numeroPuertas = 4;          }}          public int recuperaNumeroPuertas() {public int recuperaNumeroPuertas() {                  return numeroPuertas;return numeroPuertas;          }}}}Constructores sobrecargadosConstructores sobrecargadosCoche miCoche = Coche miCoche = new new Coche(5);Coche(5);Coche miCoche = Coche miCoche = new new Coche();Coche();

Page 36: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.3 Herencia y Polimorfismo1.4.3 Herencia y Polimorfismo

public class Monovolumen extends Coche {public class Monovolumen extends Coche {          public Monovolumen() {public Monovolumen() {                  super(5);super(5);          }}}}

public class Compacto extends Coche {public class Compacto extends Coche {          public Compacto() {public Compacto() {                  super(2);super(2);          }}}}

Page 37: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.4 Pautas generales en diseño orientado a objetos1.4.4 Pautas generales en diseño orientado a objetos

• Hacer una lista de todas las propiedades y métodos que Hacer una lista de todas las propiedades y métodos que requiera el programa.requiera el programa.• Clasificar dichas propiedades y métodos dentro de clases.Clasificar dichas propiedades y métodos dentro de clases.• Examinar las clases para ver las posibles relaciones de Examinar las clases para ver las posibles relaciones de herencia.herencia.• Establecer los métodos necesarios para realizar la interface Establecer los métodos necesarios para realizar la interface entre las diversas clases.entre las diversas clases.• Comprobar que dentro de la estructura de clases todo encaja.Comprobar que dentro de la estructura de clases todo encaja.

Realizar un buen diseño supone:Realizar un buen diseño supone:• Ahorro e tiempo y esfuerzo en la fase de programarAhorro e tiempo y esfuerzo en la fase de programar• Código resultante de mayor calidad: más fácil de depurar y Código resultante de mayor calidad: más fácil de depurar y mantenermantener

Page 38: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5 Técnicas de implementación1.4.5 Técnicas de implementación

Implementaciones estáticas y dinámicasImplementaciones estáticas y dinámicas

Representaciones contiguas y enlazadasRepresentaciones contiguas y enlazadas

Page 39: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.1 Implementaciones estáticas y 1.4.5.1 Implementaciones estáticas y dinámicasdinámicas

Implementaciones estáticasImplementaciones estáticas asignación asignación de memoria en tiempo de compilaciónde memoria en tiempo de compilación

Implementaciones dinámicasImplementaciones dinámicas asignación asignación de memoria en tiempo de ejecuciónde memoria en tiempo de ejecución

Page 40: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.1 Implementaciones éstáticas y 1.4.5.1 Implementaciones éstáticas y dinámicasdinámicas

Variables dinámicas:Variables dinámicas: Variables cuyo espacio de almacenamiento requerido se Variables cuyo espacio de almacenamiento requerido se

asigna en tiempo de ejecuciónasigna en tiempo de ejecución Se accede a ellas por medio de Se accede a ellas por medio de apuntadoresapuntadores Podemos crear variables dinámicas asignándoles Podemos crear variables dinámicas asignándoles

memoriamemoria Podemos destruir variables dinámicas liberando memoriaPodemos destruir variables dinámicas liberando memoria Se alojan en el segmento montón (heap)Se alojan en el segmento montón (heap)

Page 41: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.1 Implementaciones éstáticas y 1.4.5.1 Implementaciones éstáticas y dinámicasdinámicas

En Programación Orientada a Objetos:En Programación Orientada a Objetos: Un Objeto es internamente un apuntador a los datos que lo Un Objeto es internamente un apuntador a los datos que lo

componen.componen. Cuando se crea un objeto mediante su constructor, la reserva Cuando se crea un objeto mediante su constructor, la reserva

de memoria se hace de forma dinámica.de memoria se hace de forma dinámica. La liberación de memoria se realiza mediante el destructor del La liberación de memoria se realiza mediante el destructor del

objeto; en Java esto se realiza de forma automática mediante objeto; en Java esto se realiza de forma automática mediante el Garbaje Collector. el Garbaje Collector.

El uso de objetos abstrae al programador del manejo directo El uso de objetos abstrae al programador del manejo directo de apuntadores y ofrece mecanismos para conseguir de apuntadores y ofrece mecanismos para conseguir privacidad y protección. privacidad y protección.

Page 42: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.2 Representaciones contiguas y 1.4.5.2 Representaciones contiguas y enlazadasenlazadas

En la representación de TDA’s formados por En la representación de TDA’s formados por colecciones de elementos, nos encontramos las colecciones de elementos, nos encontramos las siguientes situaciones:siguientes situaciones:

1.1. La cantidad de elementos de los casos del TDA es La cantidad de elementos de los casos del TDA es fija y conocida a priori (en tiempo de compilación)fija y conocida a priori (en tiempo de compilación)

2.2. La cantidad de elementos de los casos del TDA es La cantidad de elementos de los casos del TDA es fija, pero se conoce en tiempo de ejecuciónfija, pero se conoce en tiempo de ejecución

3.3. La cantidad de elementos de los casos del TDA es La cantidad de elementos de los casos del TDA es variable en tiempo de ejecuciónvariable en tiempo de ejecución

Page 43: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.2 Representaciones contiguas y 1.4.5.2 Representaciones contiguas y enlazadasenlazadas

Ante la situación (1) probablemente la mejor opción es Ante la situación (1) probablemente la mejor opción es representar los casos del TDA representar los casos del TDA mediante unmediante un array. array.

public class Estructura {public class Estructura {        public Object dato[];public Object dato[];        static private int longitud = 10;static private int longitud = 10;        public Estructura() {public Estructura() {        dato = new Object[longitud];dato = new Object[longitud];        }}        // resto de métodos de la clase// resto de métodos de la clase} // fin class Estructura} // fin class Estructura

Estructura estructura;Estructura estructura;estructura = new Estructura();estructura = new Estructura();

estructura.dato[i]=x;estructura.dato[i]=x;y=estructura.dato[i];y=estructura.dato[i];

Page 44: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.2 Representaciones contiguas y 1.4.5.2 Representaciones contiguas y enlazadasenlazadas

Para la situación (2), Java permite la siguiente forma de Para la situación (2), Java permite la siguiente forma de representación contigua:representación contigua:

public class Estructura {public class Estructura {        public Object dato[];public Object dato[];        private int longitud;private int longitud;        public Estructura(int n) {public Estructura(int n) {        longitud = n;longitud = n;        dato = new Object[n];dato = new Object[n];        }}        // resto de métodos de la clase// resto de métodos de la clase} // fin class Estructura} // fin class Estructura

Estructura estructura;Estructura estructura;estructura = new Estructura(estructura = new Estructura(1010););

Page 45: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.2 Representaciones contiguas y 1.4.5.2 Representaciones contiguas y enlazadasenlazadas

Para la situación (3) disponemos de varias alternativas. Para la situación (3) disponemos de varias alternativas. Si sabemos en Si sabemos en tiempo de compilación el número aproximado de elementos, se puedetiempo de compilación el número aproximado de elementos, se puede establecer una cantidad máxima establecer una cantidad máxima maxLongitudmaxLongitud de elementos que de elementos que podrán contener los casos del TDApodrán contener los casos del TDA

public class Estructura {public class Estructura {        public Object dato[];public Object dato[];        static private int maxLongitud = 100;static private int maxLongitud = 100;        private int longitud = 0;private int longitud = 0;        public Estructura() {public Estructura() {        dato = new Object[maxLongitud];dato = new Object[maxLongitud];        }}        // resto de métodos de la clase// resto de métodos de la clase} // fin class Estructura} // fin class Estructura

Page 46: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.5.2 Representaciones contiguas y 1.4.5.2 Representaciones contiguas y enlazadasenlazadas

Cuando en tiempo de compilación no sabemos ni siquiera de Cuando en tiempo de compilación no sabemos ni siquiera de forma aproximada el número de elementos es conveniente forma aproximada el número de elementos es conveniente utilizar una representación enlazada:utilizar una representación enlazada:

public class Estructura {public class Estructura {        class Celda {class Celda {                Object dato;Object dato;                Celda siguiente;Celda siguiente;        }}        private Celda inicio;private Celda inicio;        // métodos de la clase Estructura// métodos de la clase Estructura} // fin class Estructura} // fin class Estructura

Page 47: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6 Utilización correcta de objetos1.4.6 Utilización correcta de objetos

Privacidad de los objetosPrivacidad de los objetos Prevención de efectos lateralesPrevención de efectos laterales Comparación de objetosComparación de objetos Tratamiento de excepcionesTratamiento de excepciones

Page 48: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.1 Privacidad de los Objetos1.4.6.1 Privacidad de los Objetos

Declarar los campos de los objetos como privadosDeclarar los campos de los objetos como privadosOfrecer métodos públicos para su accesoOfrecer métodos públicos para su acceso

public class Elemento {public class Elemento {        private int dato;private int dato;        public Elemento(int valor) {public Elemento(int valor) {                dato = valor;dato = valor;        }}        public int valor() {public int valor() {                return dato;return dato;        }}} // fin class Elemento} // fin class Elemento

Elemento elemento = new Elemento(10);Elemento elemento = new Elemento(10);int n = elemento.valor();int n = elemento.valor();

Page 49: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.2 Previniendo efectos laterales1.4.6.2 Previniendo efectos laterales

Utilización del método Utilización del método cloneclone

public class Elemento implements Cloneable {public class Elemento implements Cloneable {        private int dato;private int dato; public Elemento(int valor) {public Elemento(int valor) { dato = valor; dato = valor; }}        public Object clone() {public Object clone() {                returnreturn new new ElementoElemento((datodato););        }}}  // fin class Elemento}  // fin class Elemento

elemento1 = (Elemento)elemento2.clone(); elemento1 = (Elemento)elemento2.clone();

Page 50: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

Utilización del método Utilización del método equalsequals

public class Elemento {public class Elemento {        private int dato;private int dato; public Elemento(int valor) {public Elemento(int valor) { dato = valor; dato = valor; }}        public Object clone() {public Object clone() {                returnreturn new new ElementoElemento((datodato););        }}        public boolean equals(Object elemento) {public boolean equals(Object elemento) {                if (elemento==null) return false;if (elemento==null) return false;                Elemento e = (Elemento)elemento;Elemento e = (Elemento)elemento;                return (dato==e.dato);return (dato==e.dato);        }}} // fin class Elemento} // fin class Elemento

if (elemento1.equals(elemento2)) {if (elemento1.equals(elemento2)) {      // cuerpo de la sentencia condicional// cuerpo de la sentencia condicional}}

Page 51: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

Utilización del método Utilización del método toStringtoString

public class Elemento {public class Elemento {        private int dato;private int dato; public Elemento(int valor) {public Elemento(int valor) { dato = valor; dato = valor; }}        public Object clone() {public Object clone() {                returnreturn new new ElementoElemento((datodato););        }}        public boolean equals(Object elemento) {public boolean equals(Object elemento) {                if (elemento==null) return false;if (elemento==null) return false;                Elemento e = (Elemento)elemento;Elemento e = (Elemento)elemento;                return (dato==e.dato);return (dato==e.dato);        }}        public toString(){public toString(){                return ""+dato;return ""+dato;        }}} // fin class Elemento} // fin class Elemento

System.out.println(elemento);System.out.println(elemento);

Page 52: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

import java.io.*;import java.io.*;public class Util {public class Util {        static public int leeEntero() throws IOException {static public int leeEntero() throws IOException {                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                int i = Integer.valueOf(br.readLine().trim()).intValue();int i = Integer.valueOf(br.readLine().trim()).intValue();                return i;return i;        }}        static public double leeDoble() throws IOException {static public double leeDoble() throws IOException {                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                double d = Double.valueOf(br.readLine().trim()).doubleValue();double d = Double.valueOf(br.readLine().trim()).doubleValue();                return d;return d;        }}        static public String leeString() throws IOException {static public String leeString() throws IOException {                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                String s = br.readLine();String s = br.readLine();                return s;return s;        }}}}

Page 53: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

Interface Interface ComparableComparablepublic interface Comparable {public interface Comparable {        public boolean mayorQue(Object elemento);public boolean mayorQue(Object elemento);        public boolean mayorIgualQue(Object elemento);   public boolean mayorIgualQue(Object elemento);  

        public boolean menorQue(Object elemento);public boolean menorQue(Object elemento);        public boolean menorIgualQue(Object elemento);public boolean menorIgualQue(Object elemento);} // fin interface Comparable} // fin interface Comparable

Interface Interface ValuableValuablepublic interface Valuable {public interface Valuable {        public int valor();public int valor();} // fin interface Valuable} // fin interface Valuable  

Page 54: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

public class Elemento implements Cloneable, public class Elemento implements Cloneable, Comparable, Valuable {Comparable, Valuable {

        private int dato;private int dato;        public Elemento(int valor) {public Elemento(int valor) {                dato = valor;dato = valor;        }}        public int valor() {public int valor() {                return dato;return dato;        }}

    public Object clone() {public Object clone() {                returnreturn new new ElementoElemento((datodato););        }}

Page 55: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

        public boolean equals(Object elemento) {public boolean equals(Object elemento) {                if (elemento==null) return false;if (elemento==null) return false;                Elemento e = (Elemento)Elemento e = (Elemento)elementoelemento;;                return (dato==e.dato);return (dato==e.dato);        }}        public toString() {public toString() {                return ""+dato;return ""+dato;        }}          public boolean mayorQue(Object elemento) {public boolean mayorQue(Object elemento) {                Elemento e = (Elemento)elemento;Elemento e = (Elemento)elemento;                return (dato>e.dato);return (dato>e.dato);        }}

Page 56: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.3 Comparación de objetos1.4.6.3 Comparación de objetos

        public boolean mayorIgualQue(Object elemento) {public boolean mayorIgualQue(Object elemento) {                Elemento e = (Elemento)elemento;Elemento e = (Elemento)elemento;                return (dato>=e.dato);return (dato>=e.dato);        }}        public boolean menorQue(Object elemento) {public boolean menorQue(Object elemento) {                Elemento e = (Elemento)elemento;Elemento e = (Elemento)elemento;                return (dato<e.dato);return (dato<e.dato);        }}        public boolean menorIgualQue(Object elemento) {public boolean menorIgualQue(Object elemento) {                Elemento e = (Elemento)elemento;Elemento e = (Elemento)elemento;                return (dato<=e.dato);return (dato<=e.dato);        }}} // fin class Elemento} // fin class Elemento

Page 57: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.4 Tratamiento de excepciones1.4.6.4 Tratamiento de excepciones

- Java posee un mecanismo propio para el manejo de errores mediante Java posee un mecanismo propio para el manejo de errores mediante excepcionesexcepciones

- Cuando va a producirse una situación de error, ésta se traduce una excepción.Cuando va a producirse una situación de error, ésta se traduce una excepción.- Por ejemplo, para la segunda definición de la clase Por ejemplo, para la segunda definición de la clase EstructuraEstructura vista en la vista en la

secciónsección anterior, el acceso a los datos del array debe hacerse mediante anterior, el acceso a los datos del array debe hacerse mediante métodos de interface, y dentro de estos métodos, elmétodos de interface, y dentro de estos métodos, el acceso a unaacceso a una posicion no posicion no correcta puede traducirse en una excepción correcta puede traducirse en una excepción

public class Estructura {public class Estructura {        private Object dato[];private Object dato[];        private int longitud;private int longitud;        public Estructura(int n) throws LongitudNoValidaException {public Estructura(int n) throws LongitudNoValidaException {                if (n<0) throw new LongitudNoValidaException("Longitud if (n<0) throw new LongitudNoValidaException("Longitud                         no válida. Debe ser positiva");no válida. Debe ser positiva");                longitud = n;longitud = n;        dato = new Object[n];dato = new Object[n];        }}

      

Page 58: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.4 Tratamiento de excepciones1.4.6.4 Tratamiento de excepciones

      public Object recuperaDato(int i) throws IndiceNoValidoException {public Object recuperaDato(int i) throws IndiceNoValidoException {                if ((i<0)||(i>=longitud)) throw new IndiceNoValidoException("Indiceif ((i<0)||(i>=longitud)) throw new IndiceNoValidoException("Indice                        no válido. Debe estar entre 0 y "+longitud-1);no válido. Debe estar entre 0 y "+longitud-1);                return dato[i];return dato[i];        }}        public void estableceDato(int i, Object valor) public void estableceDato(int i, Object valor)                 throws IndiceNoValidoException {throws IndiceNoValidoException {                if ((i<0)||(i>=longitud)) throw new IndiceNoValidoException("Indiceif ((i<0)||(i>=longitud)) throw new IndiceNoValidoException("Indice                        no válido. Debe estar entre 0 y "+longitud-1);no válido. Debe estar entre 0 y "+longitud-1);                dato[i] = valor;dato[i] = valor;        }}} // fin class Estructura} // fin class Estructura

Page 59: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.4 Tratamiento de excepciones1.4.6.4 Tratamiento de excepciones

Podemos crear nuevas excepciones como clases Podemos crear nuevas excepciones como clases que heredan de la clase que heredan de la clase ExceptionException

public class LongitudNoValidaException extends Exception {public class LongitudNoValidaException extends Exception {        public LongitudNoValidaException() { super(); };public LongitudNoValidaException() { super(); };        public LongitudNoValidaException(String s) { super(s); public LongitudNoValidaException(String s) { super(s);

};};} } public class IndiceNoValidoException extends Exception {public class IndiceNoValidoException extends Exception {        public IndiceNoValidoException() { super(); };public IndiceNoValidoException() { super(); };        public IndiceNoValidoException(String s) public IndiceNoValidoException(String s)

{ super(s); };{ super(s); };}}

Page 60: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.6.4 Tratamiento de excepciones1.4.6.4 Tratamiento de excepciones

Para utilizar las llamadas a métodos con Para utilizar las llamadas a métodos con excepciones, se deben manejar dichas excepciones, se deben manejar dichas excepciones mediante bloques excepciones mediante bloques try catchtry catch

try {try {        Estructura estructura = new Estructura(10);Estructura estructura = new Estructura(10);        estructura.estableceDato(0,elemento);estructura.estableceDato(0,elemento);        elemento = estructura.recuperaDato(0);elemento = estructura.recuperaDato(0);} catch (LongitudNoValidaException e) {} catch (LongitudNoValidaException e) {        System.err.println(e);System.err.println(e);} catch (IndiceNoValidoException e) {} catch (IndiceNoValidoException e) {        System.err.println(e);System.err.println(e);}}

Page 61: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

Para terminar este capítulo mostraremos la implementación Para terminar este capítulo mostraremos la implementación en Java de los TDA’s racional y bolsa.en Java de los TDA’s racional y bolsa.

El TDA racional es un TDA simple que se ha definido como El TDA racional es un TDA simple que se ha definido como inmutable.inmutable.

El TDA bolsa es un TDA contenedor que se ha definido como El TDA bolsa es un TDA contenedor que se ha definido como mutable y se ha implementado utilizando representación mutable y se ha implementado utilizando representación enlazada.enlazada.

Para el TDA racional se ha incluido manejo de excepciones, Para el TDA racional se ha incluido manejo de excepciones, así como las operaciones toString, equals y clone.así como las operaciones toString, equals y clone.

En el caso del TDA bolsa no se ha incluido manejo de En el caso del TDA bolsa no se ha incluido manejo de excepciones porque no se ha contemplado ninguna situación excepciones porque no se ha contemplado ninguna situación de error.de error.

Page 62: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

public class Racional implements Cloneable {public class Racional implements Cloneable {        private int num, den;private int num, den;        public Racional(int n, int d) {public Racional(int n, int d) {        if (d==0) throw new DenominadorCeroException("El if (d==0) throw new DenominadorCeroException("El denominador no puede ser cero");denominador no puede ser cero");                num = n;num = n;                den = d;den = d;        }}        static private int mcd(int m, int n) {static private int mcd(int m, int n) {                int t;int t;                while(m>0) {while(m>0) {                        t=m;t=m;                        m=n%m;m=n%m;                        n=t;n=t;                }}                return n;return n;        }}

Page 63: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

        public int numerador() {public int numerador() {                return num;return num;        }}        public int denominador() {public int denominador() {                return den;return den;        }}        static public Racional suma(Racional a, Racional b) {static public Racional suma(Racional a, Racional b) {                int n = (a.num*b.den)+(b.num*a.den);int n = (a.num*b.den)+(b.num*a.den);                int d = a.den*b.den;int d = a.den*b.den;                return new Racional(n,d);return new Racional(n,d);        }}        static public Racional resta(Racional a, Racional b) {static public Racional resta(Racional a, Racional b) {                int n = (a.num*b.den)-(b.num*a.den);int n = (a.num*b.den)-(b.num*a.den);                int d = a.den*b.den;int d = a.den*b.den;                return new Racional(n,d);return new Racional(n,d);        }}

      

Page 64: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

          static public Racional multiplica(Racional a, Racional b) static public Racional multiplica(Racional a, Racional b) {{

                int n = a.num*b.num;int n = a.num*b.num;                int d = a.den*b.den;int d = a.den*b.den;                return new Racional(n,d);return new Racional(n,d);        }}        static public Racional divide(Racional a, Racional b) {static public Racional divide(Racional a, Racional b) {                int n = a.num*b.den;int n = a.num*b.den;                int d = a.den*b.num;int d = a.den*b.num;                return new Racional(n,d);return new Racional(n,d);        }}        static public Racional simplifica(Racional a) {static public Racional simplifica(Racional a) {                int x = mcd(Math.abs(a.num),Math.abs(a.den));int x = mcd(Math.abs(a.num),Math.abs(a.den));                int n = a.num/x;int n = a.num/x;                int d = a.den/x;int d = a.den/x;                return new Racional(n,d);return new Racional(n,d);        }}

      

Page 65: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

      public String toString() {public String toString() {

                return (num+"/"+den);return (num+"/"+den);

        }    }   

        public boolean equals(Object o) {public boolean equals(Object o) {

                Racional r1 = simplifica(this);Racional r1 = simplifica(this);

                Racional r2 = simplifica((Racional)o);Racional r2 = simplifica((Racional)o);

                return ((r1.num==r2.num)&&(r1.den==r2.den));return ((r1.num==r2.num)&&(r1.den==r2.den));

        }}

        public Object clone() {public Object clone() {

                Racional r = new Racional(num,den);Racional r = new Racional(num,den);

                return r;return r;

        }}

} // fin class Racional} // fin class Racional

Page 66: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

public class DenominadorCeroException extends RuntimeException public class DenominadorCeroException extends RuntimeException {    {   

        public DenominadorCeroException() { super(); };public DenominadorCeroException() { super(); };

        public DenominadorCeroException(String s) { super(s); };public DenominadorCeroException(String s) { super(s); };

}}

Page 67: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

public class Bolsa {public class Bolsa {        class Celda {class Celda {                Object dato;Object dato;                Celda siguiente;Celda siguiente;        }}        private Celda inicio;private Celda inicio;        public Bolsa() {public Bolsa() {                inicio = null;inicio = null;        }}        public void poner(Object elemento) {public void poner(Object elemento) {                Celda aux = new Celda();Celda aux = new Celda();                aux.dato = elemento;aux.dato = elemento;                aux.siguiente = inicio;aux.siguiente = inicio;                inicio = aux;inicio = aux;        }}

Page 68: Capítulo 1. Tipos de Datos Abstractos y Programación Orientada a Objetos 1.1 Concepto de Tipo de Datos Abstracto. 1.2 Clasificación de Tipos de Datos Abstractos

1.4.7 Ejemplos en Java1.4.7 Ejemplos en Java

        public boolean esVacia() {public boolean esVacia() {

                return (inicio==null);return (inicio==null);

        }}

        public int cuantos(Object elemento) {public int cuantos(Object elemento) {

                Celda aux = inicio;Celda aux = inicio;

                int cont = 0;int cont = 0;

                while (aux!=null) {while (aux!=null) {

                        if (elemento.equals(aux.dato)) cont++;if (elemento.equals(aux.dato)) cont++;

                        aux = aux.siguiente;aux = aux.siguiente;

                }}

                return cont;return cont;

        }}

} // fin class Bolsa} // fin class Bolsa