Tipos de Datos Abstractos (tda) y Orientación a Objetos (OO)



Descargar 53,61 Kb.
Fecha de conversión05.05.2017
Tamaño53,61 Kb.

Tipos de Datos Abstractos (TDA) y Orientación a Objetos (OO)

  • Francisco Bórquez
  • Departamento de Informática
  • Universidad Técnica Federico Santa María
  • 1er SEM,2010

Agenda

  • Introducción a TDAs y OO
  • Orientación a Objetos
  • Introducción al lenguaje Java
  • Variables, Constantes y Tipos Primitivos
  • Operadores
  • Clases y objetos
  • Tipos de datos frecuentes
  • Excepciones
  • Streams y archivos

Problemas de desarrollo

  • ¿Cómo organizar una pieza de software, de manera que sea fácil de mantener y administrar?
  • ¿Cómo evitar tener que recompilar todo un sistema, en vista de un pequeño cambio?

Modularidad y Reutilización de Software

  • Ideas:
  • Organizar el programa en grupos de subprogramas y datos, lógicamente relacionados, denominados módulos.
  • Agrupar en subprogramas que puedan ser compilados de forma independiente, sin necesidad de recompilar todo el sistema.

Modularidad y Reutilización de Software

  • El proceso de diseñar módulos o contenedores sintácticos se denomina modularización.
  • Una unidad de compilación es un conjunto de subprogramas que pueden compilarse de manera independiente al resto del sistema.

Encapsulación

  • Agrupar un conjunto de subprogramas junto a los datos que ellos manipulan. Esto permite resolver los dos problemaspresentados.
  • Ventajas:
  • Mayor modularidad
    • Facilita la mantención
    • Permite la reutilización
  • Ocultamiento de la información
    • Énfasis en la interfaz abstrae de la implementación
    • Permite la reutilización

Tipos de Datos Abstractos

  • Un TDA corresponde a una encapsulación que incluye:
  • Una instancia de un TDA se denomina objeto

Ocultamiento de la información

  • Mediante control de acceso, detalles innecesarios de la implementación de un TDA se ocultan a aquellas unidades fuera de la encapsulación.
  • Un cliente es una unidad de programa que hace uso de una instancia de un TDA.

Ejemplo

  • import java.util.LinkedList;
  • public class EjemploTDA {
  • public static void main (String[] args) {
  • LinkedList lista = new LinkedList();
  • lista.add(new String("EjemploTDA"));
  • lista.addFirst(new Integer(42));
  • lista.addLast(new Character('e'));
  • for(Object o:lista)
  • System.out.println(o.toString());
  • System.out.println(lista.size());
  • }
  • }
  • Problemas de Reuso

    • Los TDAs son las unidades a reutilizar, pero:
      • Generalmente requieren ser adaptadas para el nuevo uso
      • Hacer las modificaciones implicaría entender los detalles de implementación del TDA reutilizado
      • De aquí surge la necesidad de establecer relaciones entre distintos TDAs, tales como padre-hijo o similitud de roles

    Visión Orientada a Objetos

    • Un programa es un conjunto de objetos (instancias de alguna clase), que corresponden a abstracción del mundo real (problema)
    • Un objeto se comunica con otro mediante paso de mensajes
    • Un objeto puede alterar su estado a causa del procesamiento de mensajes u otros eventos.

    Niveles de OO en los Leguajes

    • Lenguajes OO puros
      • Realmente consideran que todo es un objeto. Ejemplos: Smalltalk, Eiffel, Ruby.
    • Lenguajes OO no puros
      • Diseñados para programación OO, pero mantienen algunas características de otros paradigmas. Ejemplos: Java mantiene tipos de datos primitivos (i.e. no-objetos); Python tiene elementos de la programación funcional y la programación orientada a aspectos.
    • Lenguajes extendidos a OO
      • Históricamente han seguido otro paradigma pero se han extendido para soportar características de la OO. Ejemplos: C++,Fortran 2003, Perl.

    Soporte para Programación OO

    • Tipos de datos abstractos
      • Soporte para clases y objetos.
    • Herencia
      • Puede ser simple o múltiple.
    • Polimorfismo
      • Con especie particular de ligado de métodos a su implementación (clases y métodos virtuales en C++, interfaces en Java).

    Objetos

    • Un objeto tiene estado y comportamiento
    • El estado se mantiene con variables
    • El comportamiento se implementa mediante métodos
    • Un objeto encapsula su estado a través de sus métodos
    • Con esto también controla la manipulación de su estado

    Idea General de O.O.

    Ejemplo de Objeto: LinkedList

    Mensajes

    • Objetos interactúan intercambiando mensajes
    • Un mensaje consiste en:
      • Identificador del objeto
      • Identificador del método
      • Parámetros, si aplica
    • Los objetos no requieren estar en el mismo proceso o máquina

    Mensajes (1)

    Mensajes (2)

    Mensajes: ejemplo en Java

    •  public class EjemploTDA {
    •  
    • public static void main (String[] args) {
    • LinkedList lista = new LinkedList();
    •  
    • lista.add(new String("EjemploTDA"));
    • lista.addFirst(new Integer(42));
    • lista.addLast(new Character('e'));
    • for(Object o:lista)
    • System.out.println(o.toString());
    • System.out.println(lista.size());
    • }
    • }
    • Clases

      • Introducidas en SIMULA 67
      • Una clase representa un conjunto de objetos con características comunes
      • Se puede interpretar como una plantilla de objetos
      • Un objeto es una instancia de una clase
      • Una clase puede tener variables de clase (o campos de clase) como también métodos de clase; estos son comunes para todos los objetos de la misma clase

      Clases vs. Objetos

      • Una clase define un tipo abstracto de datos
      • Los objetos son instancias de una clase y, por lo tanto, ocupan memoria
      • Se les puede instanciar de forma estática, dinámica de stack o dinámica de heap (C++ permite las tres formas)
      • Se crean en el heap su destrucción puede ser explícita o implícita (en C++ es explícita, en Java es implícita)

      Clases: ejemplo en C++

      • #include "clases.h"
      •  
      • complex::complex(double re, double im)
      • {
      • real = re;
      • imaginary = im;
      • }
      •  
      •  
      • double complex::getRealPart()
      • {
      • return real;
      • }
      •  
      • double complex::getImaginaryPart()
      • {
      • return imaginary;
      • }

      Clases: ejemplo en C++

      • using namespace std;
      •  
      • #include
      • #include "clases.h"
      •  
      • int main() {
      • complex com(1.3, 2.0);
      •  
      • cout << com.getRealPart() << ' '
      • << com.getImaginaryPart() << endl;
      • return 0;
      • }

      Clases: ejemplo en Java (ListaEnlazada.java)

      • public class ListaEnlazada {
      • private int dato, tam;
      • private ListaEnlazada sgte;
      •  
      • public ListaEnlazada (int dato) {
      • this.dato=dato;
      • sgte=null; tam=1;
      • }
      •  
      • public void add(int dato) {
      • if (sgte==null)
      • sgte=new ListaEnlazada(dato);
      • else
      • sgte.add(dato);
      • tam++;
      • }
      • public int get(int index) {
      • if (index==0)
      • return dato;
      • return (sgte.get(--index));
      • }
      • public int getFirst() { return dato; }
      • public int getLast() { return get(tam - 1); }
      • public int size() { return tam; }
      • }

      Clases: ejemplo en Java

      • public class EjemploListaEnlazada {
      • public static void main(String[] args) {
      • ListaEnlazada lista=new ListaEnlazada(6);
      • lista.add(5); lista.add(4); lista.add(3);
      • lista.add(2); lista.add(1); lista.add(0);
      •  
      • System.out.println(lista.getFirst());
      • System.out.println(lista.getLast());
      • System.out.println(lista.get(3));
      • System.out.println(lista.size());
      • }
      • }

      Herencia

      • Permite reusar tipos de datos abstractos ya definidos, sin alterarlos
      • La reutilización se realiza definiendo nuevos TDAs que modifican o extienden la funcionalidad del TDA base
      • De este modo se permite adaptar un TDA a las condiciones particulares de un problema con menos esfuerzo

      Jerarquía de Herencia

      • Una clase que hereda de otra se denomina clase derivada o subclase
      • La clase superior se denomina clase padre o superclase

      Jerarquía de Herencia: ejemplo

      Jerarquía de Herencia: ejemplo en Java

      • public class Persona {
      • private String rut;
      • private String nombre;
      •  
      • public Persona (String rut, String nombre) {
      • this.rut=rut;
      • this.nombre=nombre;
      • }
      •  
      • public String getRut() {
      • return rut;
      • }
      •  
      • public String getNombre(){
      • return nombre;
      • }
      •  
      • public String toString(){
      • return nombre+"("+rut+")";
      • }
      • }

      Jerarquía de Herencia: ejemplo en Java

      • public class Estudiante extends Persona {
      • private String rol;
      •  
      • public Estudiante (String rut, String rol) {
      • super(rut,"Jorge");
      • this.rol=rol;
      • }
      •  
      • public String getRol() {
      • return rol;
      • }
      • }

      Jerarquía de Herencia: ejemplo en Java

      • public class EjemploHerencia {
      •  
      • public static void main (String[] args) {
      • Persona profesor = new Persona("12.345.678-9","profe");
      • Estudiante estudiante = new Estudiante("13.456.789-2",
      • "2405063-1");
      •  
      • System.out.println(profesor.getRut());
      • System.out.println(estudiante.getRut() +
      • " <-> " + estudiante.getRol());
      • // profesor.getRol() /* Error */
      • /* Se puede? */
      • Persona x = new Estudiante("14.567.892-3",
      • "2391505-7");
      • System.out.println(x.getRut());
      • System.out.println("La persona " + x);
      • // System.out.println(x.getRol()); /* Error */
      • }
      •  
      • }

      Herencia: Relaciones entre Clases

      • El mecanismo de herencia permite extender una clase (agregar variables o métodos)
      • Si B extiende a A, entonces B (subclase) hereda todo lo de A (superclase)
      • Una subclase heredera tiene la opción de reimplementar a su modo algun método heredado (override)

      Ventajas de la Herencia

      • Subclases pueden proveer un comportamiento especializado basado en la superclase
      • Los programadores pueden definir clases abstractas, que definen un comportamiento genérico y que debe ser definido por las clases herederas
      • En resumen, representa un mecanismo de reutilización de interfaces y código

      Herencia Múltiple: ejemplo

      • La nueva clase hereda a partir de dos o más clases:

      Problemas con la Herencia Múltiple

      • Colisión de nombres
      • Pérdida de eficiencia dada su complejidad (sobretodo en el ligado de métodos)
      • No es claro que su uso mejore el diseño y la facilidad en la mantención de sistemas, teniendo en cuenta el aumento en la complejidad de la organización de la jerarquía

      Polimorfismo

      • Permite tratar a objetos como si fueran del tipo de la superclase
      • Las subclases implementan métodos que llevan el mismo nombre que tienen en la superclase, cambiando su comportamiento
      • Cuando se invoca a uno de estos métodos se debe hacer un ligado dinámico a la implementación que corresponda

      Polimorfismo: ejemplo

      Clases y Métodos Virtuales

      • A veces no tiene sentido la instanciación de objetos de determinadas clases, dependiendo de la abstracción realizada
      • En estos casos la clase puede implementar un grupo de métodos y definir un prototipo de los métodos que deben implementar sus subclases
      • Los estos prototipos de métodos se llaman métodos virtuales; toda clase que tenga al menos un método virtual se denomina clase virtual

      Clases y Métodos Virtuales: ejemplo en C++

      • using namespace std;
      •  
      • class figura {
      • public:
      • virtual double getArea() = 0;
      • virtual double getPerimetro() = 0;
      • };

      Clases y Métodos Virtuales: ejemplo en C++

      • using namespace std;
      •  
      • class cuadrado: public figura {
      • private:
      • double lado;
      •  
      • public:
      • cuadrado(double l) { lado = l; }
      • double getArea() { return lado * lado; }
      • double getPerimetro() { return 4.0 * lado; }
      • };

      Clases y Métodos Virtuales: ejemplo en C++

      • class circulo: public figura {
      • private:
      • double radio;
      • static const double pi = 3.14159265358979323846;
      •  
      • public:
      • circulo(double r) { radio = r; }
      • double getArea() { return pi * radio * radio; }
      • double getPerimetro() { return 2 * pi * radio; }
      • };

      Clases y Métodos Virtuales: ejemplo en C++

      • #include
      • #include "figura"
      • #include "cuadrado"
      • #include "circulo"
      •  
      • using namespace std;
      •  
      • int main ()
      • {
      • figura *fig[2];
      • fig[0] = new cuadrado(2.3); fig[1] = new circulo(3.0);
      •  
      • for(int i = 0; i < 2; i++)
      • cout << fig[i]->getArea() << ' '
      • << fig[i]->getPerimetro() << endl;
      • return 0;
      • }

      Interfaces

      • Definen un protocolo para la interacción entre objetos sin necesidad de conocer su clase
      • Una o más clases pueden implementar una misma interfaz
      • Una clase que implemente a una interfaz debe necesariamente implementar cada uno de sus métodos

      Interfaces: ejemplo en Java (Ejecutable.java)

      • public interface Ejecutable {
      • public void ejecutar();
      • }

      Interfaces: ejemplo en Java (Tarea.java)

      • public class Tarea implements Ejecutable {
      •  
      • private int n;
      • private String mensaje;
      •  
      • public Tarea(int n, String mensaje) {
      • this.n=n;
      • this.mensaje=mensaje;
      • }
      •  
      • public void ejecutar() {
      • for (int i=0; i
      • System.out.println(mensaje);
      • }
      • }

      Interfaces: ventajas

      • Capturan similitudes entre clases no relacionadas, sin forzar una relación artificial entre ellas
      • Permiten declarar métodos que se espera que implementen las clases que responden a la interfaz
      • Permiten establecer un contrato de programación, sin revelar la implementación

      Historia

      • 1991: James Gosling inicia un proyecto para escribir código independiente de la arquitectura para sistemas empotrados. Intenta con C++ pero no le satisface.
      • 1993: Desarrolla un nuevo lenguaje llamado OAK, similar a C++ pero más seguro y portable.
      • 1994: Aparece la World Wide Web y Mosaic.
      • 1995: Sun anuncia la disponibilidad del lenguaje Java y el browser HotJava con soporte para applets
      • En la actualidad se reconoce al leguaje Java por ser una tecnología clave en la explosión de la WWW.

      Tecnología Java

      • Leguaje de Programación
        • Especificado por Sun Microsystems, orientado a objetos, con sintaxis similar a la de C++.
      • Plataforma
        • Incluye a la Java Virtual Machine y la especificación de una extensa API.
      • Tres sabores...
        • Se distribuye, según la necesidad, en al menos tres ediciones:
          • JSE: Java Standard Edition
          • JME: Java Micro Edition
          • JEE: Java Enterprise Edition

      Características

      • Leguaje simple, orientado a objetos, sintaxis similar a C++.
      • Facilidades para distribución de componentes (RMI, integración CORBA).
      • Soporte multihebra en la JVM, con tipos de dato thread-safe para concurrencia.
      • Robusto y seguro, diseñado para producir software confiable. Realiza revisiones en tiempo de compilación y ejecución.
      • Portable, neutro de la arquitectura.
      • Alto rendimiento, con posibilidad de compilar parte de un programa a código de máquina.

      API Java

      • java.applet: Desarrollo de applets
      • java.awt: Interfaces gráficas de usuario (GUIs)
      • java.io: Entrada/salida en general; archivos, consola, streams, etc.
      • java.lang: Tipos de datos fundamentales del lenguaje; strings, fecha, hora, propiedades del sistema, etc.
      • java.math: Clases utilitarias para matemáticas
      • java.net: Redes, sockets, streams, etc.
      • java.rmi: Remote Method Invocation

      API Java

      • java.security: Encriptación, control de acceso, autenticación, políticas de seguridad, etc.
      • java.sql: Java DataBase Conectivity (JDBC)
      • java.text: Procesamiento de textos
      • java.util: Utilidades varias como el Collection
      • Framework (colecciones, listas, pilas, colas, vectores, matrices, etc.), internacionalización (i18n, l10n), eventos, etc.
      • javax: contiene paquetes adicionales con clases para accessibilidad, funciones criptográficas, manejo de imágenes, servicios de nombres, impresión, sonido, SWING, transacciones, XML, CORBA, Java2D, Java3D, extensiones a la API de red, rmi, seguridad, etc.

      ¿Dónde aprender sobre Java?

      • Java 2: Bruce Eckel, Thinking in Java, 3rd Edition, Prentice Hall, http://www.mindview.net/Books/TIJ/.
      • Java 5/6:
        • Bruce Eckel, Thinking in Java, 4th Edition, Prentice Hall,
        • http://mindview.net/Books/TIJ4.
        • Sun’s Java Tutorials:
        • http://java.sun.com/docs/books/tutorial/.
        • Java API Specification:
        • http://java.sun.com/javase/6/docs/api/.
        • Java Language Specification:
        • http://java.sun.com/docs/books/jls/index.html.

      Ciclo de un programa Java

      Ejecución de un programa Java

      • Para ejecutar un programa se debe iniciar la Máquina Virtual Java (JVM), indicándole el nombre de la clase cuyo método main será ejecutado.
      • Esta clase no es instanciada.
      • Este método main es el encargado de instanciar los objetos que compondrán el programa y hacerlos interactuar.

      ¡Hola Mundo!

      • public class HolaMundoApp {
      • public static void main(String[] args) {
      • System.out.println("Hola Mundo!");
      • }
      • }

      Applets

      • Significa “aplicacioncita”.
      • Su uso normal es a través de la Web.
      • Difiere de un programa normal en su modelo de ejecución.
      • El browser es el encargado de iniciar una máquina virtual que no correrá un método main, sino que instanciará la clase especificada y la dibujará con ayuda de la API AWT.

      Applets: modelo de ejecución

      Applets: ejemplo

      • import java.util.*;
      • import java.sql.*;
      •  
      • /**
      • * la clase HolaMundo implementa una applet que
      • * simplemente despliega "Hola Mundo!".
      • */
      • public class HolaMundoApplet extends java.applet.Applet {
      • public void paint(java.awt.Graphics g) {
      • java.util.Date fecha;
      • g.drawString("Hola Curso Dormido!", 50, 25);
      • }
      • }

      Applets: ejemplo

      •  
      • Un Programa Simple con Applet
      •  
      • Aqui viene la salida del programa:
      • WIDTH=150 HEIGHT=25>


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal