La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Técnicas Avanzadas de Programación. Contenido Conceptos generales de programación orientada a objetos  Concepto de clase, método, mensaje, objeto  Ejemplo:

Presentaciones similares


Presentación del tema: "Técnicas Avanzadas de Programación. Contenido Conceptos generales de programación orientada a objetos  Concepto de clase, método, mensaje, objeto  Ejemplo:"— Transcripción de la presentación:

1 Técnicas Avanzadas de Programación

2 Contenido Conceptos generales de programación orientada a objetos  Concepto de clase, método, mensaje, objeto  Ejemplo: un programa para manejo de Pozos  Ocultamiento de información  Algunos lenguajes orientados a objeto Diseño orientado a objetos  Diseño dirigido por responsabilidades  UML (Lenguaje de modelado unificado - unified modeling language)‏

3 Contenido Mecanismos de reutilización de código  Herencia  Composición  Delegación  Tipos parametrizados Enlace estático y dinámico  Asignación estática y dinámica de tipos  Enlace estático y dinámico de métodos

4 Contenido Herencia y tipos  Distribución de la memoria  Asignación y Equivalencia  Conversión de tipos  Herencia de clases y herencia de interfaces Ocultamiento de información  Acoplamiento y cohesión  Control de acceso y visibilidad

5 Contenido Polimorfismo  Objetos polimórficos  Sobrecarga  Interfaces Patrones de diseño  Estructura de un patrón de diseño  Patrones creacionales  Patrones estructurales  Patrones de comportamiento

6 Contenido Programación con hilos  Concurrencia y paralelismo  Hilos y procesos  Modelos de programación multihilos  Ciclo de vida de un hilo  Prioridades  Sincronización  Prácticas recomendadas Acceso a bases de datos  JDBC

7 Conceptos Generales

8 Programación Orientada a Objetos Los especialistas ven la P.O.O. desde dos puntos de vista El primero sostiene que la POO es una nueva forma de programar. Un nuevo paradigma El segundo sostiene que la POO es simplemente una evolución de técnicas de programación ya existentes (tipos de dato abstractos)‏

9 Programación Orientada a Objetos La programación orientada a objetos como un nuevo paradigma de programación

10 Programación Orientada a Objetos Clase Aplicación Clase Menú Clase Factura AppMenuFactura EmisorReceptor Mensaje mostrar Acción: muestra las opciones del menu Acción: Imprime los datos de la factura

11 Programación Orientada a Objetos Algunos conceptos básicos Mensaje. Un mensaje es una solicitud de que se realice una acción. Se acompaña de cualquier información adicional (argumentos) necesaria para llevar a cabo la acción Método. Es la acción que realiza el receptor de un mensaje para satisfacer la solicitud (un procedimiento)‏ Diferencias entre llamar a un procedimiento y pasar un mensaje:  Los mensajes tienen un receptor, los procedimientos no  La acción que se realiza en respuesta a un mensaje depende de quien recibe el mensaje

12 Programación Orientada a Objetos La acción realizada en respuesta a un mensaje depende del receptor del mensaje Menú Nuevo Abrir Guardar Guardar como Mostrar Factura Fecha: 12/03/00 Cliente: Pedro Pérez Cant. Descrip. Monto 1 Lavadora 5000,00 2... Mostrar

13 Programación Orientada a Objetos Clases. Son categorías de objetos  Todos los objetos son ejemplares de una clase  El método invocado por un objeto en respuesta a un mensaje queda determinado por la clase del receptor  Todos los objetos de una clase usan un mismo método en respuesta a un mismo mensaje Objetos. Son entes capaces de responder a un mensaje ejecutando una acción (método)‏  Los objetos tienen variables internas que determinan su estado. Las variables que tiene un objeto dependen de la clase pero los valores son particulares de cada objeto

14 Programación Orientada a Objetos Para programar en forma orientada a objetos es necesario:  Decidir que objetos se necesitan para resolver un problema  Determinar que métodos implementa cada clase Si las clases requeridas no están disponibles será necesario diseñarlas Diseñar una clase consiste en:  Establecer los métodos de la clase  Definir las variables internas o variables de estado que tendrán los objetos

15 Programación Orientada a Objetos Ejemplo: un programa de manejo de cuentas de banco En este ejemplo se presenta una clase Cuenta que puede ser el fundamento para un programa de manejo de cuentas En primer lugar se presenta la definición de la clase, incluyendo la implementación de los métodos. Luego se presenta la forma de utilizar la clase, es decir:  Como crear una Cuenta  Como pasar mensajes a una Cuenta El ejemplo está implementado en Java

16 Programación Orientada a Objetos Declaración de la clase Cuenta package cuentas; public class Cuenta { private int id; private String nombre; private double saldo; public Cuenta() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNombre() { return nombre; } setNombre(String nombre) { this.nombre = nombre; } public double getSaldo(){ return saldo; } public void depositar(double cantidad) { this.saldo += cantidad; } public boolean retirar(double cantidad) { if (cantidad > this.saldo) { saldo -= cantidad; return true; } return false; }

17 Programación Orientada a Objetos Elementos que constituyen una clase Declaración de la clase  Contiene el nombre de la clase y otros atributos Variables  Las variables definen el estado del objeto Métodos  Los métodos son procedimientos que se ejecutan cuando se pasa un mensaje a la clase Constructores  Son procedimientos que permiten inicializar el objeto

18 Programación Orientada a Objetos Como usar la clase Cuenta // Como crear una cuenta Cuenta c; c = new Cuenta(3); // Como pasar mensajes a una cuenta c.depositar(10000); int saldo = c.getSaldo(); System.out.printlnSystem.out.println(saldo);

19 Programación Orientada a Objetos Estructura de un mensaje c.setId(2); mensajereceptor del mensaje argumentos

20 Programación Orientada a Objetos public class Carta { public static final int ROJO=0; public static final int NEGRO=1; private int pinta; private int valor; public Carta(int p, int v) { this.pinta = p; this.valor = v; } public int getPinta() { return this.pinta; } public int getValor() { return this.valor; } public int getColor() { if (pinta==CORAZON || pinta==DIAMANTE) { return ROJO; } else { return NEGRO; }

21 Programación Orientada a Objetos La programación orientada a objetos como evolución de técnicas preexistentes Los programas se hacen más complejos en la medida que su tamaño aumenta La complejidad se debe principalmente a la interconexión entre diferentes partes del programa Técnicas para el manejo de la complejidad  Procedimientos.  Módulos.  Tipos de dato abstracto.  Programación orientada a objetos.

22 Programación Orientada a Objetos La programación orientada a objetos puede verse como una evolución de los tipos de dato abstractos. Tipo de dato abstracto: un tipo de dato definido por el programador. Consiste de una estructura de datos y una serie de operaciones implementadas mediante procedimientos o funciones. Las clases son un mecanismo o técnica de implementación de tipos de dato abstracto. Al definir un TDA mediante clases se pueden especificar las operaciones válidas para el nuevo tipo de dato. Esto permite al compilador verificar la validez de las operaciones al igual que para los tipos de datos predefinidos.

23 Programación Orientada a Objetos struct pila { int tope; int valores[100]; }; void push(struct pila *p, int v) { p->valores[++(ps->top)]=v; return; } void pop(struct pila *p) { if (empty(p)) { /* error */ } else { return (p->valores[ps->top-- ]); } main()‏ { struct pila p; push(&p, 10); x = pop(&p); p.valores[5]=10; // bien } Ejemplo: implementación de una pila en C y C++

24 Programación Orientada a Objetos public class Pila { private int tope; private int valores[100]; public Pila() { tope = -1; } public void push(int v) { valores[++top]=v; return; } public int pop() { if (empty(p)) { /* error */ } else { return (valores[top--]); } Ejemplo: implementación de una pila en C y C++ public static void main(String[] args)‏ { Pila p = new Pila(); p.push(10); x = p.pop(); p.valores[5]=10 //error }

25 Programación Orientada a Objetos Bjarne Stroustrup, creador del C++, prefiere el término tipo de dato definido por el usuario al de clase En lugar de Subclase habla de tipo de dato derivado Los métodos son funciones miembro En el diseño de un programa se pueden mezclar tipos definidos por el usuario con programación convencional (no orientada a objetos)‏ Los tipos definidos por el usuario son una herramienta más (aunque muy importante) entre las que el programador puede escoger para resolver problemas

26 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información Quién invoca un método de un objeto mediante un mensaje no tiene que saber lo que hace el objeto para satisfacer la solicitud No se debe acceder directamente a las variables internas de un objeto Los lenguajes de programación difieren en el soporte que dan al ocultamiento de la información

27 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información Cuenta c = new Cuenta(); c.id = 2; En este ejemplo se esta modificando directamente una variable interna del objeto c. Esto no es recomendable Si se cambia la implementación de la clase Cuenta, todas las partes del programa que contengan construcciones de este tipo deberán ser modificadas Las variables internas de un objeto solo deben ser modificadas por el objeto mismo

28 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información La forma correcta de modificar el identificador de la cuenta es invocando un método diseñado para ese fin Cuenta c = new Cuenta(); c.setId(2);

29 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información En Java existen modificadores que permiten determinar la visibilidad de los elementos de una clase: private. Solo se puede acceder al elemento desde la clase en la cual está declarado protected. Se puede acceder al elemento desde la clase, las subclases y el paquete package. Se puede acceder al elemento desde la clase y cualquier otra clase que esté en el mismo paquete public. Se puede acceder al elemento desde cualquier parte del programa

30 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información En general deben ser privados siempre:  Las variables de instancia  Métodos que son invocados por otros métodos de la misma clase y que no deben ser invocados externamente Deben ser públicos  Los constructores y métodos que serán invocados por otras clases Pueden ser públicos o privados  Las constantes

31 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información Pueden ser protected  Las variables de instancia que se sabe que serán accedidas por subclases de la clase en la cual está declaradas  Esto es controversial. Hay quienes sostienen que las subclases deben acceder a las variables de las superclases invocando métodos públicos o protegidos. Cuando usar package  Package se puede usar en lugar de protected para permitir que subclases accedan a las variables de instancia de las superclases.  En ese caso las subclases deben estar en el mismo paquete

32 Programación Orientada a Objetos Encapsulamiento y ocultamiento de la información En C++  Existe private, public y protected En smalltalk  No existen modificadores, todas las variables son privadas y todos los métodos son públicos

33 Programación Orientada a Objetos Algunos lenguajes orientados a objetos Smalltalk  Un lenguaje 100% orientado a objetos  El lenguaje incluye en su definición básica el mecanismo de mensajes  Todo lo demás se logra mediante una biblioteca de clases  No hay tipos de datos. Las variables no tienen tipo  Los valores que contienen las variables son objetos que pertenecen a una clase  Es un lenguaje interpretado, lo que lo hace menos eficiente que lenguajes compilados, tales como C y Pascal

34 Programación Orientada a Objetos C++, Object Pascal  Lenguajes híbridos que combinan programación convencional con P.O.O.  Las clases se implementan mediante un nuevo tipo de dato (class) similar a una estructura que permite definir, además de variables, una lista de métodos que constituyen el comportamiento de los ejemplares  El problema principal de estos lenguajes es la implementación de clases mediante tipos de dato. Esto causa problemas sobre todo en el manejo de la herencia  En general son más eficientes que los lenguajes 100% orientados a objetos

35 Programación Orientada a Objetos Java  Sintaxis similar al C++  Lenguaje fuertemente orientado a objetos. (No 100 %)‏  Lenguaje con tipos (por tanto presenta los mismos problemas que C++ y Object Pascal)‏  Existe una jerarquía de clases predefinida que incluye clases que representan los tipos de dato básicos (integer, float, etc)‏  Es un lenguaje interpretado. Menos eficiente que C++  Existen, sin embargo, compiladores “just in time”, que mejoran considerablemente la eficiencia

36 Diseño Orientado a Objetos

37 El primer paso en el diseño orientado a objetos consiste en determinar  Cuales son las clases que se necesitan para la solución de un problema en particular  Que acciones debe realizar cada clase  Como se relacionan las clases Existen numerosas metodologías de diseño orientado a objetos Presentamos un método conocido como “Diseño dirigido por responsabilidades”

38 Diseño Orientado a Objetos Diseño dirigido por responsabilidades Se hace una analogía entre las clases que se requieren para la solución de un problema y un grupo de personas que se reúnen para realizar una actividad Cada clase corresponde a una persona A cada persona se asignan una serie de responsabilidades Toda acción que se debe realizar debe estar asignada a una persona (en caso contrario la acción no se realizará)‏

39 Diseño Orientado a Objetos Nombre de la clase Responsabilidades Colaboradores Para el diseño se recomienda usar fichas Cada clase es descrita por separado en una ficha

40 Diseño Orientado a Objetos La lista de responsabilidades son todas las acciones que deberán realizar los miembros de la clase En última instancia las responsabilidades se convertirán en métodos de la clase La lista de colaboradores está formada por aquellas clases en las cuales se puede apoyar una clase para realizar su trabajo Al comienzo del diseño no se hace distinción entre clases y ejemplares

41 Diseño Orientado a Objetos Los nombres de las clases deben ser palabras pronunciables, que describan claramente aquello a lo que se refieren Se recomienda usar mayúsculas o el carácter de subrayado para separar las palabras. Ej. MenúPrincipal o menu_principal Las abreviaturas deben ser claras Se debe evitar el uso de números en los nombres

42 Diseño Orientado a Objetos Ejemplos de nombres de clase: LeerValores // No recomendable. No es un sustantivo // Los nombres de clases deben ser sustantivos M20 // No sugiere lo que representa la clase ManejadorCuentas // Nombre adecuado manejador_cuentas // Nombre adecuado

43 Diseño Orientado a Objetos Categorías de clases Las clases se pueden agrupar en categorías según el tipo de responsabilidades que tienen  Clases manejadoras de datos  Fuentes de datos o pozos de datos  Clases de vista o visualización  Clases auxiliares

44 Diseño Orientado a Objetos Clases manejadoras de datos Son clases cuya responsabilidad principal es mantener cierta información Por ejemplo en un juego de cartas la clase Carta es un manejador de datos En un programa de contabilidad una clase Cuenta es un manejador de datos Las clases manejadoras de datos generalmente son los bloques fundamentales de un diseño

45 Diseño Orientado a Objetos Los datos que pertenecen a una clase manejadora de datos solo deben ser manipulados por su dueño (encapsulamiento)‏ Las demás clases no deben modificar o leer directamente los datos que pertenecen a un manejador de datos Para tener acceso a la información deben solicitarlo mediante un mensaje a la clase dueña Es un factor importante del diseño determinar cuales datos deben ser manejados por una clase manejadora de datos

46 Diseño Orientado a Objetos Únicamente el manejador de datos debe acceder a la información que le pertenece Manejador de Cuentas Archivo de cuentas Procesador Transacciones leerCuenta(100)‏ ObtenerSaldo(100)‏ LeerCuenta(100)‏ Manejador Cuentas

47 Diseño Orientado a Objetos Fuentes de datos de datos Son clases que generan datos (por ej. un generador de números aleatorios), o los aceptan para realizar algún procesamiento Los datos fluyen a través de la clase pero ésta no es dueña de los datos Por ejemplo una clase Archivo que tiene como responsabilidades  Abrir un archivo en disco  Leer y escribir datos al archivo  Cerrar el archivo

48 Diseño Orientado a Objetos Una fuente de datos no es dueña de los datos Manejador Cuentas Archivo de cuentas Manejador facturas LeerRegistro Manejador Archivos LeerRegistro Archivo de facturas

49 Diseño Orientado a Objetos Clases de vista o visualización Son clases que permiten mostrar o visualizar información en un dispositivo de salida Generalmente el código que realiza estas actividades es complejo, modificado frecuentemente e independiente de los datos que se muestran Es recomendable separar el código de visualización del código de manejo de los datos Cuando se tiene un manejador de datos y una clase de vista asociada se dice que el manejador de datos es el modelo y la clase visualizadora es la vista

50 Diseño Orientado a Objetos Ejemplo: La clase Pozo es un manejador de datos. Sus instancias representan o modelan pozos del mundo real Un graficador de pozos tiene tiene una lista de pozos y se encarga de mostrar una gráfica con la información que ellos contienen Graficador Pozos Pozo Manejador de datos Clase de visualización

51 Diseño Orientado a Objetos Caso de estudio: Una aplicación de supervisión de pozos Se tiene una base de datos con información histórica de pozos Se desea crear una aplicación que permita visualizar una gráfica de la producción de crudo y gas de los pozos.

52 Diseño Orientado a Objetos Clases Un formulario mediante el cual se puede introducir una lista de las clases que se desea visualizar y las características del gráfico que se desea obtener Una clase GraficadorPozos que se encarga de crear el gráfico con las características definidas por el usuario. Es una clase de visualización Una clase Pozo que almacena la información de un pozo. Es una clase manejadora de datos Una clase BaseDatos que hace acceso a la base de datos que contiene la información de los pozos

53 Diseño Orientado a Objetos Tarjeta CRC de la clase Formulario Graficador Pozos Formulario Pedir al usuario la lista de pozos que se desean graficar Solicitar al graficador de pozos que despliegue la gráfica

54 Diseño Orientado a Objetos Tarjeta CRC de la clase GraficadorPozos Pozo GraficadorPozos Crear los pozos con los identificadores de pozos recibidos del Formulario Solicitar a cada pozo la producción de crudo y de gas Crear el gráfico con la información obtenida

55 Diseño Orientado a Objetos Tarjeta CRC de la clase Pozo BaseDatos Pozo Leer los datos del pozo al cual representa Mantener los datos del pozo Devolver la producción de crudo y gas

56 Diseño Orientado a Objetos Tarjeta CRC de la clase BaseDatos BaseDatos Devolver la producción de crudo de un pozo dado el id del pozo Devolver la producción de gas de un pozo dado el id del pozo

57 Diseño Orientado a Objetos Otro ejemplo: un programa para cajeros automáticos El programa debe  Mostrar un mensaje de bienvenida a los usuarios  Esperar a que se introduzca una tarjeta  Leer el id de la cuenta de la tarjeta  Solicitar al usuario que introuzca la clave  Verificar si la clave es correcta  Presentar al usuario un menú de opciones (retiro, consulta,...)‏  Realizar la operación solicitada y actualizar la cuenta  Entregar el dinero

58 Diseño Orientado a Objetos Tarjeta CRC de la clase LectorDeTarjetas LectorDeTarjetas Mostrar mensaje, esperar tarjeta Pedir el Verificador de clave que compruebe validez LLamar al selector de actividad Devolver Tarjeta Verificador DeClave SelectorDe Actividad

59 Diseño Orientado a Objetos Tarjeta CRC de la clase LectorDeTarjetas VerificadorDeClave Recibir clave del ManejadorDeCuenta. Verificar si existe la cuenta Presentar ventana de solicitud de clave Recibir clave del usuario Comparar claves y devolver el resultado. ManejadorD eCuenta

60 Diseño Orientado a Objetos Tarjeta CRC de la clase LectorDeTarjetas ManejadorDeCuenta Verificar validez de cuenta y devolver la clave Verificar información de retiro y depósito. ManejadorD eCuenta

61 Diseño Orientado a Objetos Tarjeta CRC de la clase LectorDeTarjetas SelectorDeActividad Mostrar menú de actividades Esperar selección del usuario Llamar al manejador de transacción apropiado ManejadorDe Depósitos ManejadorDe Retiros

62 Diseño Orientado a Objetos Tarjeta CRC de la clase LectorDeTarjetas ManejadorDeRetiros Preguntar al usuario cantidad del retiro Verificar la cantidad con el ManejadorDe Cuenta Decirle a CajaElectrónica que descarge el efectivo ManejadorDe Cuentas ManejadorDe Retiros CajaElectróni ca

63 Diseño Orientado a Objetos Tarjeta CRC de la clase LectorDeTarjetas CajaElectrónica Dar efectivo Dar sobre de depósito Recuperar sobre de depósito

64 Diseño Orientado a Objetos Unified Modeling Language (UML)‏ Es una notación para representar modelos orientados a objetos A finales de la década de los 80 aparecieron varios métodos de modelado: Booch, Rumbaugh y Jacobson UML es la unificación de estos métodos Está en proceso de estandarización por ISO/ANSI

65 Diseño Orientado a Objetos Un modelo consiste de clases y objetos relacionados entre si, que describen o representan un aspecto del mundo real Para la descripción de un modelo en UML existen varios tipos de diagramas:  Diagramas de clases (modelo estructural)‏  Diagramas de objetos (modelo de interacción)‏  Diagramas de secuencia  Use cases (casos de uso)‏

66 Diseño Orientado a Objetos Modelo estructural Una vista de un sistema que hace énfasis en la estructura de los objetos, incluyendo sus clasificadores, relaciones, atributos y operaciones

67 Diseño Orientado a Objetos Diagrama de clases Un diagrama de clases contiene representaciones de clases y relaciones entre clases Una clase se representan mediante un rectángulo dividido en tres áreas o bandas: banda de nombre, banda de atributos y banda de operaciones Pozo Id producciónCrudo producciónGas devolverProducciónCrudo devolverProducciónGas

68 Diseño Orientado a Objetos Se utiliza también un diagrama simplificado de clases en el que se omiten la segunda y tercera banda En este caso la clase Pozo se representa como sigue Pozo

69 Diseño Orientado a Objetos Relaciones UML permite definir varios tipos de relación entre clases. A continuación se enumeran algunos  Asociación  Agregación  Composición  Generalización

70 Diseño Orientado a Objetos Asociaciones Para representar relaciones de asociación entre clases se usan líneas para conectar las clases relacionadas La multiplicidad sirve para especificar cuantos ejemplares de una clase se pueden asociar con un ejemplar de la otra clase En el ejemplo un GraficadorPozos se puede asociar con 0 o más pozos (* denota 0..n)‏ Graficador Pozos Pozo 1 * tiene

71 Diseño Orientado a Objetos A continuación se presentan algunos ejemplos de multiplicidad T T T T Cero o más (muchos)‏ Uno o más Entre uno y 40 Exactamente 5 * 1..* 1..40 5

72 Diseño Orientado a Objetos Ejemplos adicionales * 1..* Contrato PatronoEmpleado Empresa * Persona 1..* PatronoEmpleado Emplea Empresa Persona

73 Diseño Orientado a Objetos Agregación Es un tipo especial de asociación que describe una relación todo- parte Ejemplo Universidad Facultad Tiene 1..*

74 Diseño Orientado a Objetos Composición La composición es un forma de agregación que implica una fuerte relación de propiedad Avión TrenAterrizajeFuselajeMotor 112

75 Diseño Orientado a Objetos Composición Motor 2 Fuselaje 1 TrenAterrizaje 1 Avión

76 Diseño Orientado a Objetos Generalización Es una relación entre una clase general y una clase más específica Ejemplo Empleado Vendedor Gerente

77 Diseño Orientado a Objetos Diagrama de clases UML correspondiente a la aplicación de ejemplo Graficador Pozos Pozo 1 1..* tiene Formulario Pozos 1 1 tiene BaseDatos 1 1 tiene

78 Diseño Orientado a Objetos Diagramas de secuencia Verificar(noCta)‏ LectorTarjeta Verificador Clave Manejador Cuenta DevolverClave()‏ Manejador Teclado LeerClave()‏

79 Creación de objetos

80 Una vez que se han definido las clases, el siguiente paso es crear objetos Al momento de arrancar el programa deberá crear uno o varios objetos iniciales (por lo menos uno)‏ Posteriormente los diferentes objetos que constituyen el programa pueden crear (y destruir) otros objetos Por lo tanto la creación y destrucción de objetos es un proceso que se realiza durante toda la ejecución del programa Cuando el programa finaliza el último paso debe ser destruir el objeto (u objetos) creado inicialmente

81 Creación de objetos Organización de la memoria de un programa Memoria automática (Pila)‏ Memoria dinámica (Montículo – heap)‏ Memoria estática

82 Creación de objetos Memoria automática Conocida como la pila del programa La memoria se asigna y libera automáticamente Las variables se asignan cuando se ejecuta el bloque de código donde están declaradas Por ejemplo, en C++ o Java void graficar() { int n; Pozo p(10);... }

83 Creación de objetos Memoria estática Las variables estáticas se asignan cuando el programa arranca y se liberan cuando termina Por ejemplo, en C++ Pozo pozo; void graficar() { static Pozo p(10); static int x;... }

84 Creación de objetos Memoria estática Ejemplo en C y C++ void getNextNumber() { static int number = 0; number += 1; return number; } void main() { int n; for (n=0; n<5 ; ++n) { printf("%d ", getNextNumber()); }

85 Creación de objetos Memoria estática Ejemplo en Java class MyClass { public static int number = 0;... } La variable se asigna al momento de cargar la clase (generalmente la primera vez que se usa)‏

86 Creación de objetos Memoria dinámica Los objetos son creados en memoria dinámica de manera explícita, es decir, el programador determina el momento exacto en que se debe crear el objeto. Así mismo los objetos deben ser destruidos por el programador Por ejemplo en C++ void graficar() { Pozo *p; p = new Pozo(2);... delete p; }

87 Creación de objetos En C++ se pueden crear objetos de varias maneras Al declarar una variable de un tipo correspondiente a una clase... Pozo p(2); // se ha creado un pozo En este caso el objeto se puede crear en memoria estáfica o dinámica Se puede crear un objeto en memoria dinámica mediante el operador new Pozo *p; // aquí no se ha creado el pozo p = new Pozo(2); // se crea el pozo en memoria // dinámica

88 Creación de objetos Creación de objetos en Java En Java los objetos siempre son creados en memoria dinámica Sólo hay una forma de crear objetos... Pozo p; // Aquí no se ha creado el pozo p = new Pozo(1); // Se crea el pozo en memoria // dinámica Los objetos son destruidos automáticamente mediante un recolector de basura

89 Creación de objetos En Java las referencias de los objetos y los valores de tipos primitivos pueden ser almacenados en memoria automática int getNextNumber() { int next = 0; return ++next; } o en memoria estática public class SequenceManager { static int next = 0; static int getNextNumber() { return ++next; }

90 Creación de objetos Creación de objetos en Objective C Los objetos siempre se crean en memoria dinámica... Pozo *p; // Aquí no se ha creado el pozo p = [ Pozo alloc ]; // Se crea el pozo en memoria // dinámica

91 Creación de objetos Inicialización Java y C++ tienen un mecanismo de inicialización automático conocido como constructores Los constructores son métodos con el mismo nombre que la clase... class Cuenta { private: int id;... public: Cuenta(); Cuenta(int); int getId(); void setId(int idCta);... };

92 Creación de objetos Inicialización... Cuenta::Cuenta()‏ { id = 0; } Cuenta::Cuenta(int idCta)‏ { this->id = idCta; }

93 Creación de objetos Inicialización en Java class Cuenta { private int id;... public Cuenta() { } public Cuenta(int idCta) { this.id = idCta; } int getId() { return this.id; }... };

94 Creación de objetos Inicialización en Java También se pueden usar métodos de clase class Cuenta { private int id;... private Cuenta() { } public static Cuenta crear(int idCta) { Cuenta cta = new Cuenta(); cta.id = idCta; }... };

95 Creación de objetos Inicialización en Java También se pueden usar métodos de clase... Cuenta c = Cuenta.crear(10);...

96 Creación de objetos Inicialización en Objective C No hay constructores. Se usan métodos de inicialización y métodos de clase (factory methods)‏ @interface Cuenta : Object { int idCuenta; char nombre[20]; double saldo; } +(Cuenta *) create: (int) id; -(Cuenta *) init: (int) id;...

97 Creación de objetos Inicialización en Objective C No hay constructores. Se usan métodos de inicialización y métodos de clase (factory methods)‏ +(Cuenta *) create: (int) idCta { Cuenta *c = [ [ Cuenta alloc ] init: idCta ]; return c; } -(Cuenta *) init: (int) idCta { self = [super init]; if ( self) { [self setId: idCta]; } return self; }

98 Creación de objetos Inicialización en Objective C main()‏ { Cuenta *c; c = [ Cuenta alloc ] init: 10 ]; c = [ Cuenta create: 20 ]; [ c depositar: 1500.0 ];... }

99 Creación de objetos Objetos en el montículo y objetos en la pila Asignación Verificación de igualdad Constructures de copia en C++

100 Mecanismos de Reutilización de Código

101 Herencia Composición

102 Mecanismos de Reutilización de Código Herencia Es posible que existan varias clases con características similares Por ejemplo, en relación con un pozo de levantamiento artificial por gas (gaslift) es necesario conocer la presión del gas a la entrada del pozo Esta información no es requerida para pozos de flujo natural Por otra parte, los pozos de flujo natural y los de gaslift comparten características similares, tales como profundidad del pozo, producción de crudo, etc

103 Mecanismos de Reutilización de Código Herencia En este caso, en lugar de crear dos clases independientes, es posible definir una jerarquía de clases Pozo PozoFlujoNaturalPozoGasLift

104 Mecanismos de Reutilización de Código Herencia Es posible construir jerarquías de clases más complejas Número Entero EnteroCorto RealComplejo EnteroLargo

105 Mecanismos de Reutilización de Código Herencia Las subclases heredan las variables y métodos de las superclases (pero no los valores de las variables)‏ Las subclases pueden agregar nuevos métodos, y variables o redefinir los métodos existentes Un objeto puede responder a un mensaje que no esté definido en su clase si el método está implementado en algunas de las superclases

106 Mecanismos de Reutilización de Código Clase Pozo public class Pozo { private int id; private double prodCrudo; private double prodGas; public void leerValores() {... } public double getProdCrudo() { return this.prodCrudo; } public double getProdGas() { return this.prodGas; }

107 Mecanismos de Reutilización de Código Clase PozoGasLift public class PozoGasLift extends Pozo { private double presionEntrada; public void leerValores() { super.leerValores(); presionEntrada =... } public double getPresion() { return presionEntrada; }

108 Mecanismos de Reutilización de Código Herencia Cuando se pasa un mensaje a un objeto, la búsqueda del método a ejecutar comienza por la clase del objeto Si no se encuentra el método en la clase la búsqueda continúa hacia arriba en la jerarquía de clases hasta llegar a la raíz del árbol Se ejecuta el primer método encontrado o, si no se encuentra ningún método, se produce un error

109 Mecanismos de Reutilización de Código Ejemplo PozoGaslift pozo; pozo = new PozoGasLift(); // Se ejecuta el método devolver presión // de la clase PozoGasLift double presion = pozo.getPresion(); // Se ejecuta el método get producción // de crudo de la clase Pozo int prod = pozo.getProdCrudo(); // error, el método imprimir no está definido pozo.imprimir()

110 Mecanismos de Reutilización de Código Anulación y refinamiento de métodos Una clase que hereda de otra puede:  Agregar nuevas variables o métodos  Redefinir o anular un método  Refinar un método

111 Mecanismos de Reutilización de Código Redifinir o anular un método  Esto ocurre cuando la subclase tiene un método con el mismo nombre que un método de la superclase  En el ejemplo anterior, el método leerValores() está definido en la clase Pozo, pero está siendo redefinido en la clase PozoGasLift public void leerValores() { this.prodCrudo =... this.prodGas =... }

112 Mecanismos de Reutilización de Código Refinar métodos  Para refinar un método se incluye un método con el mismo nombre. La diferencia con respecto a la anulación es que el nuevo método llama al método correspondiente en la superclase public void leerValores() { super.leerValores(); this.presionEntrada =... }

113 Mecanismos de Reutilización de Código Refinar métodos  En C++ public void leerValores() { Pozo::leerValores(); this->presionEntrada =... }

114 Mecanismos de Reutilización de Código Categorías o tipos de herencia Especialización  Es el uso más común de herencia  La clase derivada es más especializada que la superclase Ejemplo Número Entero EnteroCorto RealComplejo EnteroLargo

115 Mecanismos de Reutilización de Código Especificación  Se desea garantizar que las clases mantengan una interfaz común  La clase paterna especifica el comportamiento que se debe implementar  Las clases hijas implementan ese comportamiento Construcción  Construir un concepto a partir de otro  Ejemplo:  La clase GraficadorPozo puede ser subclase de la clase JComponent de Java Swing.  En muchos casos se puede usar composición en lugar de construcción

116 Mecanismos de Reutilización de Código Generalización Lo opuesto a la especialización La subclase es más general que la superclase Generalmente se usa cuando se trabaja con clases que no se pueden modificar o que no se desean modificar En general se debe evitar este tipo de herencia Ejemplo Ventana VentanaColor

117 Mecanismos de Reutilización de Código Composición La herencia es una relación estática entre clases Cuando una clase hereda de otra la relación entre las dos clases no varía durante toda la vida del programa Cuando hay una relación de composición un objeto de clase A tiene uno o más objetos de clase B. Vehículo Motor

118 Mecanismos de Reutilización de Código Composición public class Vehiculo { String modelo; String año; Motor motor;... } public class Motor { String modelo; int potencia;... }

119 Mecanismos de Reutilización de Código Composición La composición puede ser usada como técnica de reutilización de código, al igual que la herencia Muchos problemas que pueden ser resueltos mediante herencia también pueden ser resueltos por composición Ejemplo: La clase GraficadorPozos puede tener una variable de clase JComponent (composición) en lugar de ser subclase de JComponent. El método graficar invoca métodos de la clase JComponent para mostrar la gráfica en pantalla

120 Mecanismos de Reutilización de Código Composición La composición es una relación dinámica La clase a la que pertenece el valor de la variable puede cambiar en tiempo de ejecución Esto permite mayor flexibilidad que la herencia ya que el comportamiento puede cambiar dinámicamente

121 Mecanismos de Reutilización de Código Delegación La composición tiene la siguiente desventaja  Cuando se usa herencia los métodos siempre pueden hacer referencia al objeto this (el receptor del mensaje).  Cuando se usa composición esto no es posible La delegación es similar a la composición. Hay una clase receptora y una clase delegada La clase receptora tiene un objeto (el delegado) en el cual delega ciertas responsabilidades Cada método de la clase delegada toma un parámetro del tipo de la clase receptora. Este parámetro hace las veces del objeto this.

122 Enlace Estático y Dinámico

123 Enlace (binding): vincular un nombre con el objeto que denota static int n = 10; // C++ Un entero es asignado en algún lugar de la memoria. La vinculación entre el nombre n y el objeto (el valor entero) se puede hacer:  En tiempo de compilación - enlace temprano (early binding). El ejemplo anterior  En tiempo de ejecución – enlace tardío (late binding). int *n = new int(10); // C++ Las funciones o subrutinas también pueden tener enlace temprano o tardío

124 Enlace Estático y Dinámico El enlace implica determinar Donde está el objeto en la memoria ¿Qué es el objeto?. Para poder determinar:  La validez de las operaciones  Cómo se realizan las operaciones int a, b, c; c = a + b// suma de enteros double x, y, z; z = x + y;// suma de punto flotante String a = “Hola” * x; El enlace puede ser estático o dinámico

125 Enlace Estático y Dinámico Enlance estático. Asignación estática de tipos (C++, Java, Objective C, Object Pascal): Se asigna un “tipo” a cada variable. int x; El tipo se usa para  Determinar el conjunto de valores legales que pueden contener las variables  Determinar la validez y el significado de las operaciones. Una variable es una “caja de bits”. El tipo es lo que le da el significado a los bits. El enlace es temprano (en tiempo de compilación)‏

126 Enlace Estático y Dinámico Enlace dinámico (Objective C, Smalltalk, Python, Ruby): Las variables no tienen tipo. Ejemplo en Smalltalk: | x y z | Cada valor es un objeto que pertenece a una clase x := 10. x := Pozo new: 4. Asociado a cada valor está la información de “a qué clase pertenece” No existe la idea de ”asignación ilegal de valores” El enlace es tardío (en tiempo de ejecución)‏

127 Enlace Estático y Dinámico El enlace estático presenta ciertas dificultades cuando se trabaja con jerarquías de clases Cuando se pasa un mensaje a un objeto el sistema de ejecución debe:  Verificar la validez de la operación  Determinar cual método se debe ejecutar para satisfacer la solicitud

128 Enlace Estático y Dinámico Ejemplo Figura Rectángulo Círculo Línea

129 Enlace Estático y Dinámico public class Figura { protected int x; protected int y; public Figura(int cx, int cy) { x = cx; y = cy; } public void moverA(int cx, int cy) { x = cx; y = cy; }

130 Enlace Estático y Dinámico class Circulo extends Figura { protected int radio; public Circulo(int cx, int cy, int r) { super(cx, cy); radio = r; } void dibujar() { // dibujar el circulo }

131 Enlace Estático y Dinámico Ejemplo Circulo c; c = new Circulo(100, 100, 50); c.dibujar();// se ejecuta el método dibujar c.imprimir();// error, la operación imprimir // no está definida para Circulos

132 Enlace Estático y Dinámico Ejemplo Figura f; Circulo c = new Circulo(100, 100, 50); f = c; El tipo de “f” es Figura, pero el valor al cual se refiere es un Circulo En este caso se dice que Figura es el tipo estático y Circulo es el tipo dinámico

133 Enlace Estático y Dinámico Si intentamos realizar una operación definida para círculos se produce un error f.dibujar();// error, esta operación no está // definida para figuras Esto se debe a que Java utiliza enlace estático de tipos para determinar la validez de las operaciones El método dibujar no está definido en la clase Figura

134 Enlace Estático y Dinámico La solución es declarar en la clase figura todos los métodos que se implementarán en las subclases abstract class Figura { private int x; private int y; public Figura(int cx, int cy) { x = cx; y = cy; } void moverA(int cx, int cy) { x = cx; y = cy; } void dibujar(){ // implemenado por las subclases }

135 Enlace Estático y Dinámico Al declarar abstracto el método dibujar:  No se pueden crear objetos de clase figura  Cualquier subclase de Figura debe implementar el método o ser declarada abstracta 1.abstract class Figura {  protected int x;  protected int y;  public Figura(int cx, int cy) {  x = cx;  y = cy;  }  void moverA(int cx, int cy) {  x = cx;  y = cy;  }  abstract void dibujar(); 1.}

136 Enlace Estático y Dinámico En Java Se utiliza el tipo estático para determinar la validez de la operación Se utiliza el tipo dinámico para determinar cual método se va a ejecutar para satisfacer la solicitud En C++ Se utiliza el tipo estático para determinar la validez de la operación La selección del método se puede hacer estáticamente o dinámicamente En Objective C Hay enlace estático al estilo de Java y dinámico al estilo de Smalltalk

137 Enlace Estático y Dinámico Enlace en C++  class Figura {  Private:  int x;  int y;  public:  Figura(int cx, int cy);  void moverA(int cx, int cy);  void dibujar(); // enlace estático  }

138 Enlace Estático y Dinámico Enlace en C++  class Figura {  Private:  int x;  int y;  public:  Figura(int cx, int cy);  void moverA(int cx, int cy);  virtual void dibujar(); // enlace dinámico  }

139 Enlace Estático y Dinámico En C++ se pueden declarar métodos abstractos  class Figura {  protected:  int x;  int y;  public:  Figura(int cx, int cy);  void moverA(int cx, int cy);  virtual void dibujar() = 0; // método abstracto  }

140 Polimorfismo

141 El término polimorfismo se refiere a conceptos diferentes, pero relacionados Se habla de polimorfismo cuando un mismo nombre sirve para invocar operaciones diferentes int a, b; a = b + 5;// suma de enteros float a, b; a = b + 5.0;// suma de punto flotante Un objeto polimórfico es una variable o argumento de función que puede tener valores de tipos diferentes durante la ejecución del programa

142 Polimorfismo La POO permite implementar de manera directa la primera acepción de polimorfismo El método que se ejecuta en respuesta a un mensaje depende de la clase del receptor Rectangulo r; Circulo c; c.dibujar(); // se ejecuta Circulo::dibujar()‏ r.dibujar(); // se ejecuta Rectangulo::dibujar()‏

143 Polimorfismo Otro aspecto del polimorfismo: Funciones que pueden tomar parámetros de cualquier tipo Ejemplo ordenar(x)‏ x puede ser un arreglo de cualquier cosa Unicamente se requiere que los elementos de x respondan al mensaje mayor x[i].mayor(y)‏ La respuesta sería un valor booleano que indique si el receptor es mayor que el parámetro. El método mayor tambien es polimórfico (el parámetro “y” puede ser cualquier cosa)‏

144 Polimorfismo Esto es fácil en lenguajes de programación 100% orientados a objetos tales como Smalltalk pero difícil de lograr en lenguajes con tipos, tales como C++ y Java C++ y Java ofrecen características diseñadas para permitir, hasta cierto punto, objetos polimórficos Objective C permite desarrollar al estilo de smalltalk (sin tipos estáticos) o al estilo de Java (con tipos estáticos)‏

145 Polimorfismo Java Interfaces Una interfaz es una colección de definiciones de métodos sin las implementaciones. Una interfaz define un protocolo que un objeto se compromete a implementar Se dice que un objeto implementa una interfaz

146 Polimorfismo Suponga que se desea implementar un método imprimir que imprime el valor que se le pasa como parámetro void imprimir(int v)‏ { System.out.println(v); } En este caso imprimir solo puede trabajar con valores enteros

147 Polimorfismo Para resolver este problema se define una interfaz ObjetoImprimible: interface ObjetoImprimible { String convertirEnCadena(); } El método convertirEnCadena devuelve la representación del objeto como un string.

148 Polimorfismo Ahora se puede declarar el método imprimir como sigue: void imprimir(ObjetoImprimible v)‏ { String s = v.converirEnCadena(); System.out.println(s); }

149 Polimorfismo Para crear un objeto imprimible la clase del objeto debe implementar la interfaz ObjetoImprimible: class Pozo implements ObjetoImprimible {... public string convertirEnCadena() {... }... }

150 Polimorfismo Ejemplo: un programa de optimización import java.util.Random; interface FuncionObjetivo { double evaluar(double x); } public class OptimizadorMonteCarlo { FuncionObjetivo func; int ciclos; double puntoOpt; Optimizador(FuncionObjetivo f, int c) { func = f; ciclos = c; }

151 Polimorfismo Ejemplo: un programa de optimización // Iterar por el numero de ciclos especificados // y devolver el valor minimo obtenido public double optimizar() { double min = 100000; Random rnd = new Random(); double v, p; for (int n=0; n < ciclos; ++n) { p = rnd.nextDouble()*10; v=func.evaluar(p); if (v < min) { min = v; puntoOpt = p; } return min; }

152 Polimorfismo Ejemplo: un programa de optimización // devolver el punto donde se encontro el valor mínimo public double puntoOptimo() { return puntoOpt; } public class Cuadrado implements FuncionObjetivo { public double evaluar(double x) { return x*x; }

153 Polimorfismo Ejemplo: un programa de optimización // Crear una función objetivo y un optimizador Cuadrado cuadrado = new Cuadrado(); Optimizador optimizador = new Optimizador(cuadrado, 100); // Realizar la optimización valorOptimo = optimizador.optimizar(); puntoOptimo = optimizador.puntoOptimo();

154 Polimorfismo Generics. Los Generics en Java son clases o métodos cuyos tipos están parametrizados. Volveremos a este tema después de haber visto templates en C++

155 Polimorfismo C++ ofrece las siguientes características que ayudan a definir objetos polimórficos  Métodos estáticos y virtuales  Herencia múltiple  Patrones (templates)‏

156 Polimorfismo Herencia múltiple Una clase puede ser subclase de dos clases diferentes Window Clock WindowWithMenu WindowWithBorder

157 Polimorfismo class Window {... public: Window(char *title); virtual void draw(); }; class WindowWithBorder : public Window { // cosas relacionadas con bordes void ownDraw(); void draw(); } class WindowWithMenu : public Window { // cosas relacionadas con menus void ownDraw(); void draw(); }

158 Polimorfismo class Clock : public WindowWithBorder, public windowWithMenu { // cosas relacionadas con relojes void ownDraw () // dibujar agujas y numeros void draw(); }

159 Polimorfismo void WindowWithBorder::draw() { Window::draw(); ownDraw(); } void WindowWithMenu::draw() { Window::draw(); ownDraw(); } void Clock::draw() { Window::draw(); WindowWithBorder::ownDraw(); WindowWithMenu::ownDraw(); }

160 Polimorfismo La herencia múltiple presenta problemas de ambigüedad cuando dos superclases de una clase tienen métodos con el mismo nombre C++ tiene reglas para resolver la ambigüedad

161 Polimorfismo En C++ se puede implementar el concepto de interfaz utilizando herencia múltiple y métodos abstractos class ObjetoImprimible { virtual char *convertirEnCadena() = 0; }; El método convertirEnCadena no se implementa puesto que es abstracto Cualquier subclase de ObjetoImprimible debe implementar el método convertirEnCadena.

162 Polimorfismo Plantillas. Son clases parametrizadas  template class Pila  {  int tope;  T datos[100];  public:  Pila();  void push(T);  T pop();  };

163 Polimorfismo Template void Pila ::push(T elem)‏ { if (top == 100) exit(1); datos[tope] = elem; tope = tope + 1; } Pila pilaEnt; pilaEnt.push(10); Pila pilaFloat; pilaFloat.push(5.2);

164 Polimorfismo Existe una biblioteca de clases estandar basada en templates (STL: standard template library)‏ Los templates resuelven el problema parcialmente. La misma clase patrón se puede usar para implementar clases que almacenen diferentes tipos de datos, pero no para que un objeto contenedor pueda contener objetos de tipos diferentes.

165 Polimorfismo Objective C Enlace totalmente dinámico.  No hay tipos de dato  Una función o método puede recibir parámetros de cualquier tipo  La implementación de funciones polimórficas es directa  Programación propensa a errores  Programas difíciles de entender en el futuro Tipos estáticos.  Similar al sistema de tipos de Java  Para implementar funciones polimórficas se pueden usar: interfaces (protocols en Objective C)‏  No hay clases parametrizadas

166 Polimorfismo Genéricos en Java Similar en concepto a los templates en C++ Muy diferente la implementación public class ArrayList { private V[] values; public ArrayList() { values = (V[]) new Object[DEFAULT_SIZE]; }

167 Polimorfismo Genéricos en Java Similar en concepto a los templates en C++ Muy diferente la implementación public class ArrayList {... public V get(int index) { return values[index] } public void add(V value) { }

168 Polimorfismo Genéricos en Java Uso public class Test { public static void main(String[] args) { ArrayList a = new ArrayList (); a.add(1); // OK a.add(new Integer(1)); // igual a la anterior // autoboxing a.add(“Hola”) // error }

169 Diferencias entre los genéricos de Java y los Templates de C++ La definición de las clases template en C++ no se compilan. Se distribuyen como código fuente Cuando se declara un objeto cuyo tipo es una clase template el compilador genera una clase con el código fuente de la clase template en la cual el tipo parametrizado se sustituye por el tipo suministrado en la declaración. Ejemplo Pila p = new Pila ; El compilador genera la siguiente clase class PilaInt { int valores[100]; int pop();...

170 Diferencias entre los genéricos de Java y los Templates de C++ Si se declara una variable con otro tipo Pila p = new Pila ; El compilador genera una clase totalmente diferente a la anterior: class PilaDouble { double valores[100]; double pop();... Las dos clases son incompatibles desde el punto de vista de la programación orientada a objetos

171 Diferencias entre los genéricos de Java y los Templates de C++ La definición de las clases genericas en Java. Se compilan como cualquier otra clase. Los tipos parametrizados se sustituyen por Object. Esto lo llaman “type erasure” porque después que el programa está compilado no queda ninguna información del tipo Cuando se declara una variable con un tipo simplemente se crea una instancia de la única clase existente. Ejemplo Pila p = new Pila (); El compilador simplemente crea un objeto de tipo pila. Dado que el tipo de la pila es Object se le puede agregar cualquier cosa. El compilador verifica que no se le agregue algo diferente a int

172 Diferencias entre los genéricos de Java y los Templates de C++ Sin embargo se puede hacer lo siguiente: Pila p = new Pila (); Pila p1 = p; p.push(“Hola”); En este caso el compilador produce una advertencia (warning) pero el programa compila

173 Diferencias entre los genéricos de Java y los Templates de C++ En conclusión las clases parametrizadas (template) en C++ producen clases cuyos tipos son verdaderamente enteros, dobles, etc., mientras que las clases genéricas en Java producen clases cuyo tipo es siempre Object Las clases parametrizadas en C++ por lo tanto son más seguras (type safe) y más eficientes Los diseñadores de los genéricos en Java justifican sus decisiones argumentando compatibilidad con programas escritos con versiones anteriores a Java 1.5


Descargar ppt "Técnicas Avanzadas de Programación. Contenido Conceptos generales de programación orientada a objetos  Concepto de clase, método, mensaje, objeto  Ejemplo:"

Presentaciones similares


Anuncios Google