Cap - PowerPoint PPT Presentation

1 / 68
About This Presentation
Title:

Cap

Description:

Title: Tipos de Datos Abstractos y Programaci n Orientada a Objetos Author: Fernando Jim nez, Gracia S nchez Last modified by: Fernando Jim nez Barrionuevo – PowerPoint PPT presentation

Number of Views:37
Avg rating:3.0/5.0
Slides: 69
Provided by: Fernand291
Category:

less

Transcript and Presenter's Notes

Title: Cap


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.
  • 1.3 Especificación de Tipos de Datos Abstractos.
  • 1.3.1 Especificaciones informales.
  • 1.3.2 Especificaciones formales.
  • 1.4 Programación Orientada a Objetos
  • 1.4.1 Clases y Objetos.
  • 1.4.2 Propiedades y Métodos.
  • 1.4.3 Herencia y Polimorfismo.
  • 1.4.4 Pautas generales en diseño orientado a
    objetos.
  • 1.4.5 Técnicas de implementación
  • 1.4.5.1 Implementaciones estáticas y dinámicas.
  • 1.4.5.2 Representaciones contiguas y enlazadas.
  • 1.4.6 Utilización correcta de objetos.
  • 1.4.6.1 Privacidad de los objetos.
  • 1.4.6.2 Previniendo efectos laterales.
  • 1.4.6.3 Comparación de objetos.
  • 1.4.6.4 Tratamiento de excepciones.
  • 1.4.7 Ejemplos en Java.

2
1.1 Concepto y terminología
  • Tipos de Datos ? colección de valores
    operaciones
  • Enteros, reales, booleanos, caracteres
  • Enumerados, subrango
  • Son opacos
  • Tipos Estructurados ? genericidad
  • Riesgo de crear valores sin semántica
  • Tipos de Datos Abstractos (TDA)
  • Tipos de datos creados por el programador, que
    deben ser opacos

3
1.1 Concepto y terminología
  • Tipos de Datos Abstractos
  • Colección de valores operaciones
  • Se definen mediante una especificación, que es
    independiente de cualquier representación
    (abstracción)
  • Acceso a los valores limitado al uso de las
    operaciones (interfaz con el usuario limitada)
  • Establecida la interfaz, el programador elige la
    representación adecuada (implementación)
  • Los usuarios del TDA sólo conocen su nombre y la
    especificación de las operaciones
  • Cambios en la representación no afectarán al
    resto de programas

4
1.1 Concepto y terminología
  • Tipos de Datos Abstractos
  • El lenguaje de programación trata a los TDAs de
    igual forma que a sus propios tipos de datos, es
    decir, como tipos opacos
  • Privacidad de la representación
  • Protección
  • Para que esto sea posible, la implementación
    deberá realizarse en un ámbito de declaración
    inaccesible al resto de los programas

5
1.1 Concepto y terminología
  • Tipos de Datos Abstractos
  • El conjunto de operaciones ha de permitir generar
    cualquier valor del tipo
  • Existen dos piezas de documentación bien
    diferenciadas
  • Especificación del TDA. Es lo único que conoce el
    usuario del TDA. Consiste en el nombre del TDA y
    la especificación de las operaciones. Tienen
    parte sintáctica y parte semántica
  • Implementación del TDA. Conocida sólo por el
    programador del TDA. Se realiza en un lenguaje de
    programación concreto. Consiste en la
    representación del tipo y en la realización de
    las operaciones

6
1.1 Concepto y terminología
  • Tipos de datos abstractos
  • Se destacan los detalles (normalmente pocos) del
    comportamiento observable del tipo, que es
    estable.
  • Se ocultan los detalles (normalmente numerosos)
    de la implementación, que es propensa a cambios.

7
1.2 Clasificación de Tipos de Datos Abstractos
  • Tipos de Datos Abstractos simples
  • Cambian su valor pero no su estructura ? espacio
    de almacenamiento constante
  • Enteros, reales, booleanos, carácter, enumerado,
    subrango, etc.
  • Tipos de Datos Abstractos contenedores
  • Cambian su valor y estructura (colecciones de
    elementos de número variable) ? espacio de
    almacenamiento variable
  • Listas, colas, pilas, árboles, grafos, conjuntos,
    etc.

8
1.2 Clasificación de Tipos de Datos Abstractos
  • Tipos de datos abstractos inmutables
  • Sus casos no pueden modificarse (se crean y
    destruyen, pero no existen operaciones de
    modificación)
  • Representación inmutable o mutable
  • Tipos de datos abstractos mutables
  • Sus casos pueden modificarse (existen operaciones
    de modificación)
  • Representación mutable

9
1.3 Especificación de Tipos de Datos Abstractos
  • TDA ? Colección de valores Operaciones

Especificación
Usuario
Implementador
Implementación del TDA
Representación elegida
Representación de las operaciones
?

10
1.3 Especificación de Tipos de Datos Abstractos
  • Especificaciones informales
  • Predomina el lenguaje natural
  • Poco precisas y breves ? ambigüedad
  • Sencillas de escribir, leer y entender
  • Especificaciones formales
  • Lenguaje algebraico ? verificación formal de
    programas
  • Precisas y breves
  • Pueden resultar más complejas de escribir, leer y
    entender

11
1.3.1 Especificaciones informales
  • Cabecera Aparece el nombre de las operaciones.
  • Descripción Se describe de forma general en qué
    consiste la 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 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 en la descripción si el TDA es
    mutable o inmutable
  • Especificación de las operaciones Para la
    especificación de una abstracción operacional
    seguiremos el siguiente modelo
  • nombre de la operación (entrada) devuelve
    (salida)
  • requerimientos Esta cláusula muestra las
    restricciones de uso
  • modifica Esta cláusula identifica las entradas
    que van a ser modificadas
  • efecto Esta cláusula define el comportamiento

12
1.3.1 Especificaciones informales
  • Observamos los siguientes componentes
  • Cabecera 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 entradas y pueden darse para las
    salidas
  • Cuerpo Es la información semántica. Consta de
    las siguientes cláusulas
  • Requerimientos Restringen el dominio del
    procedimiento o función. Cuando introducimos
    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
    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 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 han sido
    correctamente construidas mediante algún
    constructor del tipo
  • Modifica Indica los argumentos de entrada que
    cambian de valor tras una llamada a la
    abstracción operacional
  • Efecto 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é
    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 dice nada sobre
    el efecto de la abstracción cuando dicha cláusula
    no se satisface

13
1.3 Especificación de Tipos de Datos Abstractos
  • El usuario de la abstracción es el responsable de
    que se cumplan los requerimientos
  • Implementaciones robustas se autoprotegen frente
    a valores inconsistentes
  • Mecanismos de protección frente a errores
  • Manejo de excepciones
  • Parámetros de salida de error en cada operación
  • Puesto que las especificaciones son
    independientes de las implementaciones, existen
    requerimientos de uso (información adicional de
    cara al usuario)

14
1.3.1 Especificaciones informales
  • Racional tipo de datos es crea, num, den, suma,
    resta, multiplica, divide, simplifica
  • DESCRIPCIÓN Los valores del TDA racional son
    números racionales. El TDA Racional es inmutable.
  • OPERACIONES
  • crea(a,bentero) devuelve (Racional)
  • requerimientos bltgt0.
  • efecto Devuelve un número racional cuyo
    numerador es a y cuyo denominador es b.
  • num(aRacional) devuelve (entero)
  • efecto Devuelve el numerador del número racional
    a.
  • den(aRacional) devuelve (entero)
  • efecto Devuelve el denominador del número
    racional a.
  • suma(a,bRacional) devuelve (Racional)
  • efecto Devuelve un número racional que es la
    suma de los números racionales a y b.
  • resta(a,bRacional) devuelve (Racional)
  • efecto Devuelve un número racional que es la
    resta de los números racionales a y b.
  • multiplica(a,bRacional) devuelve (Racional)
  • efecto Devuelve un número racional que es la
    multiplicación de los números racionales a y b.
  • divide(a,bRacional) devuelve (Racional)
  • efecto Devuelve un número racional que es la
    división de los números racionales a y b.
  • simplifica(aRacional) devuelve (Racional)

15
1.3.2 Especificaciones formales
  • Tipo Nombre del TDA
  • Sintasis Forma de las operaciones
  • nombre de la función (tipo de los argumentos) ?
    tipo del resultado
  • Semántica Significado de las operaciones
  • nombre de la función (valores particulares) ?
    expresión del resultado

16
1.3.2 Especificaciones formales
  • No se definen reglas semánticas (se consideran
    axiomas) para ciertas funciones, como son algunas
    funciones constructoras o las funciones
    destructoras.
  • La expresión del resultado puede ser recursiva,
    conteniendo referencias a la misma función o a
    otras del TDA.
  • Las expresiones pueden contener referencias a
    otros tipos que consideramos predefinidos. En
    particular es importante considerar como
    predefinido el tipo booleano, con los valores
    cierto y falso, o el valor predefinido error,
    para indicar los valores de los argumentos en los
    que ciertas funciones parciales no están
    definidas.
  • Cualquier implementación del TDA deberá cumplir
    las condiciones impuestas por la semántica.
  • Las reglas han de intentar aplicarse en el orden
    indicado para la verificación formal de programas.

17
1.3.2 Especificaciones formales
  • Para facilitar la escritura de las expresiones en
    la parte de semántica, se permite emplear
    expresiones condicionales, que adoptan la forma
  • si condición ? valor si cierto valor si falso
  • La condición será una expresión que toma un
    valor booleano. Se considera como predefinida la
    comparación de igualdad entre valores del mismo
    tipo, escrita como valor1 valor2.
  • 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 especificar
    exactamente cuáles son.

18
1.3.2 Especificaciones formales
  • Tipo Bolsa (Elemento)
  • Sintaxis
  • bolsavacia ? Bolsa
  • poner(Bolsa,Elemento) ? Bolsa
  • esvacia(Bolsa) ? booleano
  • cuantos(Bolsa,Elemento) ? natural
  • Semántica ?b ? Bolsa, ?e,f ? Elemento
  • esvacia(bolsavacia) ? cierto
  • esvacia(poner(b,e)) ? falso
  • cuantos(bolsavacia,e) ? cero
  • cuantos(poner(b,f),e) ? si fe ?
    sucesor(cuantos(b,e)) cuantos(b,e)

19
1.4 Programación Orientada a Objetos
  • Características de la OO
  • Herencia
  • Polimorfismo
  • Objetivos conseguidos
  • Estructuración
  • Encapsulación

20
1.4 Programación Orientada a Objetos
  • Conceptos de la OO
  • Clase
  • Objeto
  • Propiedad
  • Método
  • Herencia
  • Polimorfismo

21
1.4 Programación Orientada a Objetos
  • Estudiaremos
  • Principales técnicas de implementación de TDAs
  • Realización de dichas técnicas mediante un
    lenguaje orientado a objetos, en concreto Java.

22
1.4 Programación Orientada a Objetos
  • Java
  • Diseñado desde el principio como un lenguaje
    orientado a objetos.
  • Integración en el ámbito de las
    telecomunicaciones, en concreto, internet.
  • Lenguaje de gran actualidad e interés.

23
1.4.1 Clases y Objetos
  • Clase Tipo de datos definido por el usuario.
  • Objeto Es un dato del tipo definido por su
    clase, es decir, es una instancia específica de
    su clase.

24
1.4.1 Clases y Objetos
  • Fases de la vida de un objeto
  • Creación del Objeto declaración instanciación
  • Objeto instanciado
  • Destrucción del Objeto

25
1.4.1 Clases y Objetos
  • Declaración de una clase en Java
  • Class ltnombre_de_la_clasegt
  • Declaración de un Objeto
  • ltnombre_de_la_clasegt ltnombre_del_objetogt
  • Instanciación de un Objeto mediante la palabra
    clave new
  • Ejemplo
  • Class Vehiculo
  • Vehiculo miVehiculo
  • miVechiculo new Vehiculo()
  • O en una sola línea
  • Vehiculo miVehiculo new Vehiculo()

26
1.4.2 Propiedades y Métodos
  • Campos de datos dentro de una clase variables
    miembros o propiedades de la clase.
  • Operaciones con los datos de una clase funciones
    miembros o métodos de la clase.
  • Los miembros de una clase (propiedades y métodos)
    pueden ser
  • Públicos se puede acceder a ellos desde fuera de
    la clase
  • Privados sólo se puede acceder a ellos desde
    dentro de la clase
  • Para acceder a propiedades privadas de la clase
    se definen métodos de acceso.
  • Un miembro puede ser estático, si pertenece a la
    clase en sí y no a los objetos de la clase.

27
1.4.2 Propiedades y Métodos
  • Definición en Java de una clase con sus
    propiedades y métodos
  • ltmodificadorgt class ltnombre_de_la_clasegt
  • private lttipo_de_datogt ltnombre_del_datogt
  • public ltnombre_de_la_clasegt
    (ltlista_de_argumentosgt)
  • ltcodigo_del_metodo_constructorgt
  • public lttipo_de_dato_devueltogt
    ltnombre_del_metodogt
  • (ltlista_de_argumentosgt)
  • ltcodigo_del_metodogt

28
1.4.2 Propiedades y Métodos
  • Palabras clave para restringir el acceso a los
    miembros de una clase
  • public
  • private
  • protected
  • Miembro estático static

29
1.4.2 Propiedades y Métodos
  • public class Vehiculo
  •     private int numeroRuedas
  •     private double velocidadMaxima
  •     public String nombrePropietario
  •     static private String nombreFabrica "SEAT"
  •     public Vehiculo(int nRuedas)
  •         if (nRuedaslt0) numeroRuedas0
  •         else numeroRuedas nRuedas
  •    
  •     public void estableceVelocidadMaxima(double
    vMaxima)
  •         if (vMaximalt0) velocidadMaxima0.0
  •         else velocidadMaxima vMaxima
  •    
  •     public double recuperaVelocidadMaxima()
  •         return velocidadMaxima
  •    
  • static public String recuperaNombreFabrica()
  •         return nombreFabrica
  •    

30
1.4.2 Propiedades y Métodos
  • Declaración e instanciación de un objeto
  • Vehiculo miVehiculo new Vehiculo(4)
  • Acceso a un dato publico
  • miVehiculo.nombrePropietario Cipriano López
  • String nombre miVehiculo.nombrePropietario
  • Acceso a un dato privado
  • miVehiculo.estableceVelocidadMaxima(200.0)
  • Double velocidad miVehiculo.recuperaVelocidadMax
    ima()
  • Acceso a un dato estático
  • String nombre Vehiculo.recuperaNombreFabrica()

31
1.4.3 Herencia y Polimorfismo
  • La herencia permite la reutilización de código.
  • Las clases Motocicleta y Coche son subclases de
    Vehiculo, mientras que Vehiculo es la superclase
    de Motocicleta y Coche.
  • Las clases Motocicleta y Coche heredan de la
    clase Vehiculo todas sus variables y métodos
    miembros.

32
1.4.3 Herencia y Polimorfismo
  • Herencia multinivel

33
1.4.3 Herencia y Polimorfismo
  • Conceptos de Polimorfismo
  • Sobreescritura reemplazar los métodos de la
    superclase en las subclases.
  • Sobrecarga varios métodos se llaman igual, pero
    difieren en el número, tipo u orden de sus
    argumentos.

34
1.4.3 Herencia y Polimorfismo
  • Declaración de subclases en Java
  • public class Motocicleta extends Vehiculo
  •      public Motocicleta()
  •          super(2)
  •     

35
1.4.3 Herencia y Polimorfismo
  • public class Coche extends Vehiculo
  •      private int numeroPuertas
  •      public Coche(int nPuertas)
  •          super(4)
  •          numeroPuertas nPuertas
  •     
  •      public Coche()
  •          super(4)
  •          numeroPuertas 4
  •     
  •      public int recuperaNumeroPuertas()
  •          return numeroPuertas
  •     
  • Constructores sobrecargados
  • Coche miCoche new Coche(5)
  • Coche miCoche new Coche()

36
1.4.3 Herencia y Polimorfismo
  • public class Monovolumen extends Coche
  •      public Monovolumen()
  •          super(5)
  •     
  • public class Compacto extends Coche
  •      public Compacto()
  •          super(2)
  •     

37
1.4.4 Pautas generales en diseño orientado a
objetos
  • Hacer una lista de todas las propiedades y
    métodos que requiera el programa.
  • Clasificar dichas propiedades y métodos dentro
    de clases.
  • Examinar las clases para ver las posibles
    relaciones de herencia.
  • Establecer los métodos necesarios para realizar
    la interface entre las diversas clases.
  • Comprobar que dentro de la estructura de clases
    todo encaja.
  • Realizar un buen diseño supone
  • Ahorro e tiempo y esfuerzo en la fase de
    programar
  • Código resultante de mayor calidad más fácil de
    depurar y mantener

38
1.4.5 Técnicas de implementación
  • Implementaciones estáticas y dinámicas
  • Representaciones contiguas y enlazadas

39
1.4.5.1 Implementaciones estáticas y dinámicas
  • Implementaciones estáticas ? asignación de
    memoria en tiempo de compilación
  • Implementaciones dinámicas ? asignación de
    memoria en tiempo de ejecución

40
1.4.5.1 Implementaciones éstáticas y dinámicas
  • Variables dinámicas
  • Variables cuyo espacio de almacenamiento
    requerido se asigna en tiempo de ejecución
  • Se accede a ellas por medio de apuntadores
  • Podemos crear variables dinámicas asignándoles
    memoria
  • Podemos destruir variables dinámicas liberando
    memoria
  • Se alojan en el segmento montón (heap)

41
1.4.5.1 Implementaciones éstáticas y dinámicas
  • En Programación Orientada a Objetos
  • Un Objeto es internamente un apuntador a los
    datos que lo componen.
  • Cuando se crea un objeto mediante su constructor,
    la reserva de memoria se hace de forma dinámica.
  • La liberación de memoria se realiza mediante el
    destructor del objeto en Java esto se realiza de
    forma automática mediante el Garbaje Collector.
  • El uso de objetos abstrae al programador del
    manejo directo de apuntadores y ofrece mecanismos
    para conseguir privacidad y protección.

42
1.4.5.2 Representaciones contiguas y enlazadas
  • En la representación de TDAs formados por
    colecciones de elementos, nos encontramos las
    siguientes situaciones
  • La cantidad de elementos de los casos del TDA es
    fija y conocida a priori (en tiempo de
    compilación)
  • La cantidad de elementos de los casos del TDA es
    fija, pero se conoce en tiempo de ejecución
  • La cantidad de elementos de los casos del TDA es
    variable en tiempo de ejecución

43
1.4.5.2 Representaciones contiguas y enlazadas
  • Ante la situación (1) probablemente la mejor
    opción es representar los casos del TDA mediante
    un array.
  • public class Estructura
  •     public Object dato
  •     static private int longitud 10
  •     public Estructura()
  •     dato new Objectlongitud
  •    
  •     // resto de métodos de la clase
  • // fin class Estructura
  • Estructura estructura
  • estructura new Estructura()
  • estructura.datoix
  • yestructura.datoi

44
1.4.5.2 Representaciones contiguas y enlazadas
  • Para la situación (2), Java permite la siguiente
    forma de representación contigua
  • public class Estructura
  •     public Object dato
  •     private int longitud
  •     public Estructura(int n)
  •     longitud n
  •     dato new Objectn
  •    
  •     // resto de métodos de la clase
  • // fin class Estructura
  • Estructura estructura
  • estructura new Estructura(10)

45
1.4.5.2 Representaciones contiguas y enlazadas
  • Para la situación (3) disponemos de varias
    alternativas. Si sabemos en tiempo de compilación
    el número aproximado de elementos, se puede
    establecer una cantidad máxima maxLongitud de
    elementos que podrán contener los casos del TDA
  • public class Estructura
  •     public Object dato
  •     static private int maxLongitud 100
  •     private int longitud 0
  •     public Estructura()
  •     dato new ObjectmaxLongitud
  •    
  •     // resto de métodos de la clase
  • // fin class Estructura

46
1.4.5.2 Representaciones contiguas y enlazadas
  • Cuando en tiempo de compilación no sabemos ni
    siquiera de forma aproximada el número de
    elementos es conveniente utilizar una
    representación enlazada
  • public class Estructura
  •     class Celda
  •         Object dato
  •         Celda siguiente
  •    
  •     private Celda inicio
  •     // métodos de la clase Estructura
  • // fin class Estructura

47
1.4.6 Utilización correcta de objetos
  • Privacidad de los objetos
  • Prevención de efectos laterales
  • Comparación de objetos
  • Tratamiento de excepciones

48
1.4.6.1 Privacidad de los Objetos
  • Declarar los campos de los objetos como privados
  • Ofrecer métodos públicos para su acceso
  • public class Elemento
  •     private int dato
  •     public Elemento(int valor)
  •         dato valor
  •    
  •     public int valor()
  •         return dato
  •    
  • // fin class Elemento
  • Elemento elemento new Elemento(10)
  • int n elemento.valor()

49
1.4.6.2 Previniendo efectos laterales
  • Utilización del método clone
  • public class Elemento implements Cloneable
  •     private int dato
  • public Elemento(int valor)
  • dato valor
  •     public Object clone()
  •         return new Elemento(dato)
  •    
  •   // fin class Elemento
  • elemento1 (Elemento)elemento2.clone()

50
1.4.6.3 Comparación de objetos
  • Utilización del método equals
  • public class Elemento
  •     private int dato
  • public Elemento(int valor)
  • dato valor
  •     public Object clone()
  •         return new Elemento(dato)
  •    
  •     public boolean equals(Object elemento)
  •         if (elementonull) return false
  •         Elemento e (Elemento)elemento
  •         return (datoe.dato)
  •    
  • // fin class Elemento
  • if (elemento1.equals(elemento2))
  •    // cuerpo de la sentencia condicional

51
1.4.6.3 Comparación de objetos
  • Utilización del método toString
  • public class Elemento
  •     private int dato
  • public Elemento(int valor)
  • dato valor
  •     public Object clone()
  •         return new Elemento(dato)
  •    
  •     public boolean equals(Object elemento)
  •         if (elementonull) return false
  •         Elemento e (Elemento)elemento
  •         return (datoe.dato)
  •    
  •     public toString()
  •         return ""dato
  •    
  • // fin class Elemento

52
1.4.6.3 Comparación de objetos
  • import java.io.
  • public class Util
  •     static public int leeEntero() throws
    IOException
  •         BufferedReader br new
    BufferedReader(new InputStreamReader(System.in))
  •         int i Integer.valueOf(br.readLine().trim
    ()).intValue()
  •         return i
  •    
  •     static public double leeDoble() throws
    IOException
  •         BufferedReader br new
    BufferedReader(new InputStreamReader(System.in))
  •         double d Double.valueOf(br.readLine().tr
    im()).doubleValue()
  •         return d
  •    
  •     static public String leeString() throws
    IOException
  •         BufferedReader br new
    BufferedReader(new InputStreamReader(System.in))
  •         String s br.readLine()
  •         return s
  •    

53
1.4.6.3 Comparación de objetos
  • Interface Comparable
  • public interface Comparable
  •     public boolean mayorQue(Object elemento)
  •     public boolean mayorIgualQue(Object
    elemento)  
  •     public boolean menorQue(Object elemento)
  •     public boolean menorIgualQue(Object
    elemento)
  • // fin interface Comparable
  • Interface Valuable
  • public interface Valuable
  •     public int valor()
  • // fin interface Valuable
  •  

54
1.4.6.3 Comparación de objetos
  • public class Elemento implements Cloneable,
    Comparable, Valuable
  •     private int dato
  •     public Elemento(int valor)
  •         dato valor
  •    
  •     public int valor()
  •         return dato
  •    
  •   public Object clone()
  •         return new Elemento(dato)
  •    

55
1.4.6.3 Comparación de objetos
  •     public boolean equals(Object elemento)
  •         if (elementonull) return false
  •         Elemento e (Elemento)elemento
  •         return (datoe.dato)
  •    
  •     public toString()
  •         return ""dato
  •    
  •      public boolean mayorQue(Object elemento)
  •         Elemento e (Elemento)elemento
  •         return (datogte.dato)
  •    

56
1.4.6.3 Comparación de objetos
  •     public boolean mayorIgualQue(Object elemento)
  •         Elemento e (Elemento)elemento
  •         return (datogte.dato)
  •    
  •     public boolean menorQue(Object elemento)
  •         Elemento e (Elemento)elemento
  •         return (datolte.dato)
  •    
  •     public boolean menorIgualQue(Object elemento)
  •         Elemento e (Elemento)elemento
  •         return (datolte.dato)
  •    
  • // fin class Elemento

57
1.4.6.4 Tratamiento de excepciones
  • Java posee un mecanismo propio para el manejo de
    errores mediante excepciones
  • 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 Estructura vista en la sección anterior, el
    acceso a los datos del array debe hacerse
    mediante métodos de interface, y dentro de estos
    métodos, el acceso a una posicion no correcta
    puede traducirse en una excepción
  • public class Estructura
  •     private Object dato
  •     private int longitud
  •     public Estructura(int n) throws
    LongitudNoValidaException
  •         if (nlt0) throw new LongitudNoValidaExcept
    ion("Longitud
  •             no válida. Debe ser positiva")
  •         longitud n
  •     dato new Objectn
  •    
  •    

58
1.4.6.4 Tratamiento de excepciones
  •    public Object recuperaDato(int i) throws
    IndiceNoValidoException
  •         if ((ilt0)(igtlongitud)) throw new
    IndiceNoValidoException("Indice
  •             no válido. Debe estar entre 0 y
    "longitud-1)
  •         return datoi
  •    
  •     public void estableceDato(int i, Object
    valor)
  •         throws IndiceNoValidoException
  •         if ((ilt0)(igtlongitud)) throw new
    IndiceNoValidoException("Indice
  •             no válido. Debe estar entre 0 y
    "longitud-1)
  •         datoi valor
  •    
  • // fin class Estructura

59
1.4.6.4 Tratamiento de excepciones
  • Podemos crear nuevas excepciones como clases que
    heredan de la clase Exception
  • public class LongitudNoValidaException extends
    Exception
  •     public LongitudNoValidaException() super()
  •     public LongitudNoValidaException(String s)
    super(s)
  • public class IndiceNoValidoException extends
    Exception
  •     public IndiceNoValidoException() super()
  •     public IndiceNoValidoException(String s)
    super(s)

60
1.4.6.4 Tratamiento de excepciones
  • Para utilizar las llamadas a métodos con
    excepciones, se deben manejar dichas excepciones
    mediante bloques try catch
  • try
  •     Estructura estructura new Estructura(10)
  •     estructura.estableceDato(0,elemento)
  •     elemento estructura.recuperaDato(0)
  • catch (LongitudNoValidaException e)
  •     System.err.println(e)
  • catch (IndiceNoValidoException e)
  •     System.err.println(e)

61
1.4.7 Ejemplos en Java
  • Para terminar este capítulo mostraremos la
    implementación en Java de los TDAs racional y
    bolsa.
  • El TDA racional es un TDA simple que se ha
    definido como inmutable.
  • El TDA bolsa es un TDA contenedor que se ha
    definido como mutable y se ha implementado
    utilizando representación enlazada.
  • Para el TDA racional se ha incluido manejo de
    excepciones, así como las operaciones toString,
    equals y clone.
  • En el caso del TDA bolsa no se ha incluido manejo
    de excepciones porque no se ha contemplado
    ninguna situación de error.

62
1.4.7 Ejemplos en Java
  • public class Racional implements Cloneable
  •     private int num, den
  •     public Racional(int n, int d)
  •     if (d0) throw new DenominadorCeroException(
    "El
  • denominador no puede ser cero")
  •         num n
  •         den d
  •    
  •     static private int mcd(int m, int n)
  •         int t
  •         while(mgt0)
  •             tm
  •             mnm
  •             nt
  •        
  •         return n
  •    

63
1.4.7 Ejemplos en Java
  •     public int numerador()
  •         return num
  •    
  •     public int denominador()
  •         return den
  •    
  •     static public Racional suma(Racional a,
    Racional b)
  •         int n (a.numb.den)(b.numa.den)
  •         int d a.denb.den
  •         return new Racional(n,d)
  •    
  •     static public Racional resta(Racional a,
    Racional b)
  •         int n (a.numb.den)-(b.numa.den)
  •         int d a.denb.den
  •         return new Racional(n,d)
  •    
  •    

64
1.4.7 Ejemplos en Java
  •      static public Racional multiplica(Racional
    a, Racional b)
  •         int n a.numb.num
  •         int d a.denb.den
  •         return new Racional(n,d)
  •    
  •     static public Racional divide(Racional a,
    Racional b)
  •         int n a.numb.den
  •         int d a.denb.num
  •         return new Racional(n,d)
  •    
  •     static public Racional simplifica(Racional a)
  •         int x mcd(Math.abs(a.num),Math.abs(a.den
    ))
  •         int n a.num/x
  •         int d a.den/x
  •         return new Racional(n,d)
  •    
  •    

65
1.4.7 Ejemplos en Java
  •    public String toString()
  •         return (num"/"den)
  •        
  •     public boolean equals(Object o)
  •         Racional r1 simplifica(this)
  •         Racional r2 simplifica((Racional)o)
  •         return ((r1.numr2.num)(r1.denr2.den)
    )
  •    
  •     public Object clone()
  •         Racional r new Racional(num,den)
  •         return r
  •    
  • // fin class Racional

66
1.4.7 Ejemplos en Java
  • public class DenominadorCeroException extends
    RuntimeException    
  •     public DenominadorCeroException()
    super()
  •     public DenominadorCeroException(String s)
    super(s)

67
1.4.7 Ejemplos en Java
  • public class Bolsa
  •     class Celda
  •         Object dato
  •         Celda siguiente
  •    
  •     private Celda inicio
  •     public Bolsa()
  •         inicio null
  •    
  •     public void poner(Object elemento)
  •         Celda aux new Celda()
  •         aux.dato elemento
  •         aux.siguiente inicio
  •         inicio aux
  •    

68
1.4.7 Ejemplos en Java
  •     public boolean esVacia()
  •         return (inicionull)
  •    
  •     public int cuantos(Object elemento)
  •         Celda aux inicio
  •         int cont 0
  •         while (aux!null)
  •             if (elemento.equals(aux.dato))
    cont
  •             aux aux.siguiente
  •        
  •         return cont
  •    
  • // fin class Bolsa
Write a Comment
User Comments (0)
About PowerShow.com