La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería

Presentaciones similares


Presentación del tema: "IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería"— Transcripción de la presentación:

1 Introducción a la Programación Orientada a Objetos Sonia Rueda Genericidad
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2018

2 Genericidad Los datos de aplicaciones muy diferentes con frecuencia pueden representarse con estructuras a las que se accede con operaciones que no dependen del tipo de las componentes. Una clase genérica encapsula a una estructura cuyo comportamiento es independiente del tipo de las componentes. La genericidad favorece la reusabilidad. IPOO 2 cuatrimestre 2018

3 Genericidad La clase Inventario encapsula una colección de componentes de tipo Articulo, representada a través de un arreglo parcialmente ocupado. Las componentes están comprimidas, de modo que si se almacenan cantArtículos, ocupan las primeras cantArticulos posiciones del arreglo. IPOO 2 cuatrimestre 2018 Inventario Artículo

4 Genericidad T [] Articulo codigo:entero cantArticulos:entero
Inventario Articulo T [] Articulo cantArticulos:entero codigo:entero rubro:entero valor:real anio:entero << Constructores>> Inventario(max:entero) <<Comandos>> insertar (c:Articulo) eliminar (c:Articulo) depreciarRubro (r:entero,p:real) <<Consultas>> cantArticulos():entero estaLlena():entero pertenece (c:Articulo):boolean unAnio(a:entero):Inventario <<Constructor>> Articulo (c:entero,r:entero, v:entero,a:entero) <<Comandos>> depreciar(p:real) <<Consultas>> equals(a:Articulo ):boolean mayor(a:Articulo ):boolean

5 Genericidad Inventario(max:entero): crea una colección con capacidad para mantener max artículos. insertar (c:Articulo): asigna el artículo c a la primera posición libre e incrementa cantArtículos. Requiere c ligado y estaLlena()== false. eliminar (c:Articulo): busca un artículo equivalente a c, si existe, lo elimina arrastrando los que le siguen una posición y decrementando cantArtículos depreciarRubro (r:entero,p:real): recorre exahustivamente la colección y deprecia cada artículo del rubro r en el porcentaje p. cantArticulos():entero: retorna la cantidad de artículos almacenados en la colección estaLlena():booleano: retorna true si la cantidad de artículos es igual al tamaño de la colección pertenece (c:Articulo):boolean: retorna true si la colección contiene un elemento equivalente a c. unAnio(a:entero):Inventario: retorna una colección con los artículos que corresponden al año a en la colección que recibe el mensaje. IPOO 2 cuatrimestre 2018

6 Genericidad La clase Correo encapsula una colección de componentes de tipo Mensaje, representada a través de un arreglo parcialmente ocupado. Las componentes están comprimidas, de modo que si se almacenan cantMensajes, ocupan las primeras cantMensajes posiciones del arreglo. IPOO 2 cuatrimestre 2018 Correo Mensaje Fecha

7 Genericidad T [] Mensaje contacto:Contacto cantMensajes:entero
Correo Mensaje T [] Mensaje cantMensajes:entero contacto:Contacto fecha:Fecha hora:Hora asunto : String contenido:String << Constructores>> Correo(max:entero) <<Comandos>> insertar (m:Mensaje) eliminar (m:Mensaje) <<Consultas>> cantMensajes():entero estaLlena():entero pertenece (m:Mensaje):boolean filtroAsunto(a:String):Correo <<Constructor>> <<Comandos>> <<Consultas>> equals(m:Mensaje ):boolean mayor(m:Mensaje ):boolean

8 Genericidad Correo(max:entero): crea una colección con capacidad para mantener max mensajes. insertar (c:Mensaje): asigna el mensaje a la primera posición libre e incrementa cantMensajes. Requiere c ligado y estaLlena()== false. eliminar (c:Mensaje): busca un Mensaje equivalente a c, si existe, lo elimina arrastrando los que le siguen una posición y decrementando cantMensajes cantMensajes():entero: retorna la cantidad de Mensajes almacenados en la colección estaLlena():booleano: retorna true si la cantidad de Mensajes es igual al tamaño de la colección pertenece (c:Mensaje):boolean: retorna true si la colección contiene un elemento equivalente a c. filtroAsunto(a:String):Correo: retorna una colección con los mensajes que corresponden al asunto a en la colección que recibe el mensaje. IPOO 2 cuatrimestre 2018

9 Genericidad T [] Mensaje T [] Articulo cantMensajes:entero
Correo Inventario T [] Mensaje cantMensajes:entero T [] Articulo cantArticulos:entero << Constructores>> Correo(max:entero) <<Comandos>> insertar (m:Mensaje) eliminar (m:Mensaje) <<Consultas>> cantMensajes():entero estaLlena():entero pertenece (m:Mensaje):boolean filtroAsunto(a:String):Correo << Constructores>> Inventario(max:entero) <<Comandos>> insertar (c:Articulo) eliminar (c:Articulo) depreciarRubro (r:entero,p:real) <<Consultas>> cantArticulos():entero estaLlena():entero pertenece (c:Articulo):boolean unAnio(a:entero):Inventario

10 Genericidad Correo Inventario T [] Mensaje cantMensajes:entero
Correo(max:entero) T [] Articulo cantArticulos:entero Inventario(max:entero) Coleccion T [] Elemento cantElementos:entero Coleccion(max:entero) class Coleccion{ //atributos de instancia protected Elemento [] T; protected int cantElementos; //Constructor public Coleccion(int max){ T = new Elemento [max]; cantElementos = 0; } …}

11 Genericidad La clase Coleccion puede usarse para:
T [] Elemento cantElementos:entero Coleccion(max:entero) La clase Coleccion puede usarse para: Crear objetos de clase Coleccion Definir clases especializadas que extiendan a Coleccion

12 Genericidad Correo Inventario insertar (m:Mensaje)
eliminar (m:Mensaje) cantMensajes():entero estaLlena():entero pertenece (m:Mensaje):boolean filtroAsunto(a:String):Correo insertar (c:Articulo) eliminar (c:Articulo) depreciarRubro (r:entero,p:real) cantArticulos():entero estaLlena():entero pertenece (c:Articulo):boolean unAnio(a:entero):Inventario Coleccion insertar (c:Elemento) eliminar (c:Elemento) cantElementos():entero estaLlena():entero pertenece (c:Elemento):boolean Correo Inventario filtroAsunto(a:String):Correo depreciarRubro (r:entero,p:real) unAnio(a:entero):Inventario

13 Genericidad Colección(max:entero): crea una colección con capacidad para mantener max componentes insertar (c:Elemento): asigna el elemento c a la primera posición libre e incrementa cantElementos. Requiere c ligado y estaLlena()== false. eliminar (c:Elemento): busca un Elemento equivalente a c, si existe, lo elimina arrastrando los que le siguen una posición y decrementando cantElementos cantElementos():entero: retorna la cantidad de Elementos almacenados en la colección estaLlena():booleano: retorna true si la cantidad de Elementos es igual al tamaño de la colección pertenece (c:Elemento):boolean: retorna true si la colección contiene un elemento equivalente a c. IPOO 2 cuatrimestre 2018

14 Genericidad public void insertar (Mensaje m) {
/*Inserta un mensaje en la primera posición libre. Requiere que la colección no esté llena y m no nulo*/ T[cantMensajes++] = m; } public void insertar (Articulo a) { /*Inserta un elemento en la primera posición libre. Requiere que la colección no esté llena y c no nulo*/ T[cantArticulos++] = c; } public void insertar (Elemento elem) { /*Inserta un elemento en la primera posición libre. Requiere que la colección no esté llena y elem no nulo*/ T[cantElementos++] = elem; }

15 Genericidad public int cantMensajes () { return cantMensajes; } public int cantArticulos() { return cantArticulos; } public int cantElementos() { return cantElementos; } La definición de este método genérico solo implica un cambio de nombre.

16 Genericidad public void eliminar ( Mensaje m){
/* Busca un mensaje equivalente a m en la colección, si lo encuentra arrastra los mensajes que siguen una posición. Requiere m ligado*/ boolean esta = false; int i= 0; while (!esta && i < cantMensajes() ) if (T[i].equals(m)) esta = true; else i++; if (esta) { cantMensajes--; arrastrar(i); }

17 Genericidad public void eliminar ( Articulo c){
/* Busca un articulo equivalente a c en la colección, si lo encuentra arrastra los articulos que siguen una posición. Requiere c ligado*/ boolean esta = false; int i= 0; while (!esta && i < cantArticulos() ) if (T [i].equals(c)) esta = true; else i++; if (esta) { cantArticulos--; arrastrar(i); }

18 Genericidad public void eliminar ( Elemento elem){ /* Busca un elemento equivalente a elem en la colección, si lo encuentra arrastra los elementos que siguen una posición. Requiere elem ligado*/ boolean esta = false; int i= 0; while (!esta && i < cantElementos() ) if (T [i].equals(elem)) esta = true; else i++; if (esta) { cantElementos--; arrastrar(i); } La ligadura dinámica vincula el mensaje equals con el método que corresponda, de acuerdo al tipo dinámico de la variable polimórfica T[i].

19 Genericidad *Elemento *equals (e:Elemento):boolean
*mayor (e:Elemento):boolean Articulo Mensaje codigo:entero rubro:entero valor:real anio:entero contacto:Contacto fecha:Fecha hora:Hora asunto : String contenido:String <<Constructor>> <<Comandos>> <<Consultas>> equals(e:Elemento ):boolean mayor(e:Elemento ):boolean <<Constructor>> <<Comandos>> <<Consultas>> equals(e:Elemento ):boolean mayor(e:Elemento ):boolean

20 Genericidad En este caso también podríamos definir una interface.
abstract class Elemento { abstract public boolean equals(Elemento e); abstract public boolean mayor(Elemento e); } interface Elemento { public boolean equals(Elemento e); public boolean mayor(Elemento e); } En este caso también podríamos definir una interface.

21 Genericidad abstract class Elemento {
abstract public boolean equals(Elemento e); abstract public boolean mayor(Elemento e); } class Articulo extends Elemento { //Atributos de instancia //Constructor //Comandos //Consultas public boolean equals(Elemento e){ …} public boolean mayor(Elemento e) { …}; }

22 Genericidad interface Elemento { public boolean equals(Elemento e);
public boolean mayor(Elemento e); } class Articulo implements Elemento { //Atributos de instancia //Constructor //Comandos //Consultas public boolean equals(Elemento e){ …} public boolean mayor(Elemento e) { …}; }

23 Genericidad class Mensajeria{ private Correo correo; public void gestionCorreo{ Correo correo = new Correo (n); Mensaje m = new Mensaje (…); correo.insertar(m); } En la clase Mensajeria el objeto ligado a la variable correo siempre recibe el mensaje insertar con un parámetro de clase Mensaje. Un objeto de clase Correo puede recibir cualquiera de los mensajes que corresponden a servicios provistos por Coleccion.

24 Genericidad Las componentes de una instancia de Coleccion tienen tipo estático Elemento, lo cual asegura que están definidos los métodos equals y mayor. Coleccion insertar (c:Elemento) eliminar (c:Elemento) cantElementos():entero estaLlena():entero pertenece (c:Articulo):boolean Correo Inventario filtroAsunto(a:String):Correo depreciarRubro (r:entero,p:real) unAnio(a:entero):Inventario

25 Genericidad class Correo extends Coleccion { public Correo(int max){ super(max); } public Inventario FiltroAsunto ( String a){ /* Retorna una colección con los mensajes que corresponden al asunto a en la colección que recibe el mensaje. */ Correo cor= new Correo(cantElementos()); for (int i=0; i<cantElementos();i++){ Mensaje sms = (Mensaje) T[i]; if (sms.obtenerAsunto().equals(a)) cor.insertar(T[i]); } return cor; } } Podemos asegurar que el tipo dinámico de T[i] es Mensaje. En un objeto de clase Correo solo se insertan objetos de clase Mensaje.

26 Genericidad class Mensajeria{ private Correo correo; public void gestioCorreo{ correo = new Correo (n); Mensaje m = new Mensaje (…); correo.insertar(m); String unAsunto = …; Correo otro = correo.filtrarAsunto (unAsunto); } Un objeto de clase Correo puede recibir cualquiera de los mensajes que corresponden a servicios provistos por su propia clase.

27 Genericidad *Elemento Coleccion *equals (e:Elemento):boolean
*mayor (e:Elemento):boolean Colección(max:entero) insertar (c:Elemento) eliminar (c:Elemento) cantElementos():entero estaLlena():entero pertenece (c:Articulo):boolean SignosVitales umbralMax,umbralMin :entero maxima,minima :entero equals(e:Elemento ):boolean mayor(e:Elemento ):boolean alarma():boolean RegistroSignosVitales RegistroSignosVitales(max:entero) estable():boolean cantAlarmas():entero SVDiabetes umbralMaxG,umbralMinG :entero glucemia :entero equals(e:Elemento ):boolean mayor(e:Elemento ):boolean alarma():boolean

28 Genericidad class ControlPaciente{ private RegistroSignosVitales rs; public void procedimientoControl{ rs= new RegistroSignosVitales (40); SignosVitales mañana,tarde; mañana=new SVDiabetes(…); tarde=new SVDiabetes(…); rs.insertar(mañana); rs.insertar(tarde); if (rs.cantAlarmas()>2) … } } En la clase ControlPaciente el objeto ligado a la variable rs siempre recibe el mensaje insertar con un parámetro que pertenece a la clase SignosVitales. La clase ControlPaciente es responsable de garantizar que se cumplen los requerimientos asumidos por las clases SignosVitales, SVDiabetes y RegistroSignosVitales.

29 Genericidad class RegistroSignosVitales extends Coleccion { public RegistroSignosVitales(int max){ super(max); } public boolean cantAlarmas(){ /* Computa la cantidad de registros que indican alarma en la temperatura, la presión o la glucemia en el caso de pacientes diabéticos a los que se les realiza esta medición*/ int cant=0; for (int i=0; i<cantElementos();i++){ SignosVitales sv= (SignosVitales) T[i]; if (sv.alarma()) cant++; } return cant; } Como solo insertamos objetos que pertenecen a la clase SignosVitales, podemos asegurar que T[i] mantiene una referencia a un objeto de clase SignosVitales .

30 Genericidad La clase Coleccion es genérica, permite factorizar el comportamiento compartido definiendo un patrón general. Las clases Correo, Inventario y RegistroSignosVitales extienden a Coleccion con servicios específicos. En un objeto de clase Correo solo tiene sentido insertar objetos de clase Mensaje. Si desde la clase Mensajeria por error se insertaran objetos de clase Articulo en un objeto de clase Correo, la ejecución del método filtrarAsunto, por ejemplo, provocaría un error. Si usamos instanceOf podemos prevenir la terminación anormal, pero el error persiste, porque se trata de un error en la aplicación.

31 Caso de Estudio: Colección Ordenada
ColeccionOrdenada *Elemento T [] Elemento cant:entero <<Consultas>> *igual(c: Elemento):boolean *mayor(c: Elemento):boolean << Constructores>> ColeccionOrdenada(max:entero) <<Comandos>> insertar(c:Elemento) eliminar(c:Elemento) <<Consultas>> cantElementos():entero estaLlena():entero pertenece(c:Elemento):boolean intercala(l:ColeccionOrdenada): ColeccionOrdenada

32 Caso de Estudio: Colección Ordenada
ColecciónOrdenada(max:entero) crea una colección con capacidad para mantener max componentes insertar (c:Elemento): boolean Busca la posición de inserción de c, de modo tal que todos los elementos que ocupen las posiciones anteriores sean menores a c y los elementos que siguen a la posición sean mayores a c. Si c no está ligada o estaLlena() es false no modifica el estado interno y retorna false eliminar (c:Elemento) busca un Elemento equivalente a c, si existe, lo elimina arrastrando los que le siguen una posición y decrementacantElementos cantElementos():entero retorna la cantidad de Elementos almacenados en la colección estaLlena():entero retorna true si la cantidad de Elementos es igual al tamaño de la colección pertenece (c:Elemento):boolean retorna true si la colección contiene un elemento equivalente a c. intercala(c:ColeccionOrdenada):ColeccionOrdenada Genera una nueva colección ordenada intercalando la colección que recibe el mensaje con la que pasa como parámetro.

33 Caso de Estudio: Colección Ordenada
El servicio insertar tiene que funcionar considerando varios casos diferentes: La colección está vacía el elemento es: Menor a todos Mayor a todos Mayor al primero pero Menor que el último

34 Caso de Estudio: Colección Ordenada
Algoritmo insertar DE c Buscar la posición del primer elemento mayor a c Arrastrar todos los elementos a partir de posición Asignar c a la posición Incrementar la cantidad de elementos

35 Caso de Estudio: Colección Ordenada
public boolean insertar(Elemento c){ /*Busca la posición de inserción de c, de modo tal que todos los elementos que ocupen las posiciones anteriores sean menores a c y los elementos que siguen a la posición sean mayores a c. Si c no está ligada o estaLlena() es false no modifica el estado interno y retorna false */ boolean inserto = true; if (c==null || estaLlena()) inserto = false; else{ int pos = posInsercion(nc,cant); arrastrarDsp (pos,cant-pos); T[pos] = c; cant++; } return inserto;}

36 Caso de Estudio: Colección Ordenada
Caso trivial: Si la cantidad de elementos es 0, la posición de inserción es 0 Caso trivial: Si c es mayor que el último nombre, la posición es la última Caso Recursivo: buscar la posición de inserción entre las n-1 componentes private int posInsercion (Elemento c,int n){ /* Retornar la posición del primer elemento mayor a c, o 0 si no existe*/ int pos = 0; if (n > 0) if (c.mayor(T[n-1]) pos = n; else pos = posInsercion (c,--n); return pos; }

37 Caso de Estudio: Colección Ordenada
private void arrastrarDsp (int pos,int n){ if (n > 0){ T[pos+n] = T[pos+n-1]; arrastrarDsp(pos,--n); }

38 Caso de Estudio: Colección Ordenada
El servicio eliminar tiene que funcionar considerando varios casos diferentes: La colección está vacía el elemento: No pertenece a la colección Es el primero Es el último Es Mayor al primero pero Menor que el último

39 Caso de Estudio: Colección Ordenada
Algoritmo eliminar DE c Buscar la posición del c Si existe Arrastrar los elementos desde posición hasta el último Decrementar la cantidad de elementos public void eliminar(Elemento c){ /*Elimina, si existe, el elemento c */ int pos = posElemento (c,cantElementos); if (pos > -1){ arrastrarAnt(pos,cantElementos -pos-1); cant--; }

40 Caso de Estudio: Colección Ordenada
public int posElemento (int c, int ini,int fin){ /*Retorna la posición de c usando búsqueda binaria. Si c no pertenece a la colección retorna -1 */ int pos = -1; return pos; }

41 Caso de Estudio: Colección Ordenada
La búsqueda binaria requiere que la estructura esté ordenada y consiste en partirla en mitades, considerando que el elemento buscado puede ser: Introducción a la Programación Orientada a Objetos •igual al que está en el medio •menor que el que está en el medio mayor que el que está en el medio

42 Caso de Estudio: Colección Ordenada
public int posElemento (Elemento c, int ini,int fin){ /*Retorna la posición de c usando búsqueda binaria. Si c no pertenece a la colección retorna -1 */ int pos = -1; int mitad= (int) (ini+fin)/2 ; if (c.igual(T[mitad])) pos = mitad; else if (ini < fin) if (c.mayor(T[mitad])) pos = posElemento (c,mitad+1,fin); else pos = posElemento (c,ini,mitad-1); return pos; }

43 Caso de Estudio: Colección Ordenada
Algoritmo Intercalar crear una colección ordenada Nueva i1  0 i2  0 k  0 mientras i1 < n1 y i2 < n2 si L1i1 es menor que L2i2 insertar L1i1 en Nuevak i1++ k++ sino insertar L2i2 en Nuevak i2++ k++ si i1 < n1 Insertar el resto de L1i1 sino Insertar el resto de L2i2 Introducción a la Programación Orientada a Objetos ¿Qué ocurre si un elemento pertenece a las dos estructuras?

44 Genericidad Estamos modelando genericidad usando herencia.
En las materias que siguen se presenta un mecanismo para definir clases genéricas a partir de polimorfismo paramétrico. Java brinda recursos limitados para soportar este concepto.


Descargar ppt "IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería"

Presentaciones similares


Anuncios Google