Introduccin a la Programacin Orientada a Objetos Genericidad
Introducción a la Programación Orientada a Objetos Genericidad Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2019 IPOO 2 cuatrimestre 2019 Sonia Rueda
Genericidad Una clase genérica encapsula a una estructura cuyo comportamiento es independiente del tipo de las componentes. Las clases genéricas favorecen la reusabilidad y la extensibilidad. La genericidad puede modelarse en Java de dos maneras diferentes: usando polimorfismo paramétrico o usando herencia. En esta materia definiremos clases genéricas usando herencia. Introducción a la Programación Orientada a Objetos
Genericidad Representamos el conjunto de vehículos de una cochera con una clase Estacionamiento que encapsula a un arreglo de componentes de clase Micro y brinda operaciones para estacionar, retirar, buscar, etc. Representamos a un conjunto de robots de una fábrica con una clase Sectores que encapsula un arreglo de componentes de clase Robot y brinda operaciones para asignar, desasignar, buscar, etc. Estacionamiento Sectores Micro Robot
Genericidad Estacionamiento T : arreglo de Micro <<constructores>> Estacionamiento (max : entero) <<comandos>> estacionar (un. Micro : Micro, u: entero) estacionar (un. Micro: Micro) retirar (u : entero) <<Consultas>> cant. Unidades (): entero cant. Unidades. Ocupadas(): entero todas. Ocupadas () : boolean esta. Micro(un. Micro: Micro): boolean existe. Unidad(u: entero): boolean micro. Unidad (u: entero): Micro todos. Reservados(): boolean Asigna un. Micro en la Unidad u. Requiere controlada la unidad y micro no nulo Busca la primera unidad libre y asigna el un. Micro a la unidad. Requiere que haya una Unidad libre y un. Micro no sea nulo Elimina un. Micro de la unidad u. Requiere controlada la unidad Retorna true si en el estacionamiento hay un micro estacionado con la misma identidad que un. Micro
Genericidad class Estacionamiento { private Micro[] T; //Constructor public Estacionamiento(int max) { /*Crea una Tabla con capacidad para max elementos. */ T= new Micro [max]; }. . .
Genericidad //Comandos public void estacionar(Micro un. Micro) { /*Busca la primera posición libre e inserta un. Micro La clase Cliente es responsable de controlar que la tabla no esté llena y un. Micro no sea nulo*/ int i = 0; while (T[i] != null) i++; T[i] = un. Micro; } public void estacionar (Micro un. Micro, int u) { /*Asigna un. Micro a la unidad u, requiere controlada la unidad y un. Micro no nulo*/ T[u] = un. Micro; }
Genericidad public int cant. Unidades(){ return T. length; } public boolean existe. Unidad(int u){ /*Decide si existe una unidad de estacionamiento u*/ return (u>=0 & u<cant. Unidades()); }
Genericidad //Consultas public boolean todos. Reservados() { /*Retorna true si todos los micros tienen todos los asientos reservados*/ int i = 0; todos =true; while (i <= cant. Unidades() && todos){ todos = T[i] != null && !T[i]. hay. Disponibles(); i++; } return todos; }
Genericidad class Parking { private Estacionamiento s; … public Parking(){ s = new Estacionamiento(50); … } public void administrar (){ … int pos; … pos = 0; Micro r= new Micro (…); s. estacionar (r, pos); … }
Genericidad Sectores T : arreglo de Robot <<constructores>> Sectores (max : entero) <<comandos>> asignar (rob : Robot, s: entero) asignar (rob: Robot) desasignar (s : entero) <<Consultas>> cant. Sectores(): entero cant. Sectores. Ocupados(): entero todos. Ocupados () : boolean esta. Robot(rob: Robot): boolean existe. Sector(s: entero): boolean robot. Sector (s: entero): Robot Asigna rob al sector s. Requiere controlado el sector y rob no nulo Busca al primer sector libre y asigna rob al sector. Requiere que haya un sector libre y rob no sea nulo Elimina rob de la unidad s. Requiere controlado el sector Retorna true si en algún sector hay un robot asignado con la misma identidad que rob
Genericidad class Sectores { private Robot[] T; //Constructor public Sectores(int max) { /*Crea una Tabla con capacidad para max elementos. */ T= new Robot [max]; }. . .
Genericidad //Comandos public void asignar (Robot rob) { /*Busca el primer sector libre y asigna el robot rob La clase Cliente es responsable de controlar que la tabla no esté llena y rob no sea nulo*/ int i = 0; while (T[i] != null) i++; T[i] = rob; } public void asignar(Robot rob, int s) { /*Asigna el robot rob al sector s, requiere controlado el sector y rob no nulo*/ T[s] = rob; }
Genericidad public boolean esta. Robot (Robot rob){ /*Decide si algún sector está ligado al robot rob, que asume no nulo*/ int i = 0; boolean esta = false; while (i < max. Elem() && !esta ){ esta = T[i] == rob) ; i++; } return esta; } Busca un robot con la misma identidad que el parámetro formal rob.
Genericidad public int cant. Sectores(){ return T. length; } public boolean existe. Sector(int s){ /*Decide si existe un sector s*/ return (s>=0 & s<cant. Sectores()); }
Genericidad class Fabrica. Juguetes{ private Sectores s; … public Fabrica. Juguetes(){ s = new Sectores(70); … } public void producir (){ … int pos; … pos = 0; Robot r= new Robot (“Tommy”); s. asignar(r, pos); … }
Genericidad Tabla T : arreglo de Object <<constructores>> Tabla (max : entero) <<comandos>> insertar (elem : Object, p: entero) insertar (elem: Object) eliminar (p : entero) <<Consultas>> cant. Posiciones (): entero cant. Posiciones. Ocupadas(): entero todas. Ocupadas () : boolean esta. Elemento(elem: Object): boolean existe. Posicion(p: entero): boolean elemento. Posicion (p: entero): Object Inserta elem en la posición p. Requiere controlada la posición y elem no nulo Busca la primera posición libre y asigna el elem a la posición. Requiere que haya una posición libre y elem no sea nulo Elimina elem de la posición p. Requiere controlada la posición Retorna true si algún elemento de la tabla tiene la misma identidad que elem
Genericidad //Constructor public Tabla (int max) { /*Crea una Tabla con capacidad para max elementos. */ T= new Object [max]; }. . . Introducción a la Programación Orientada a Objetos class Tabla { protected Object[] T;
//Comandos public void insertar (Object elem) { /*Busca la primera posición libre e inserta La clase Cliente es responsable de controlar que la tabla no esté llena y elem no sea nulo*/ int i = 0; while (T[i] != null) i++; T[i] = elem; } Introducción a la Programación Orientada a Objetos Genericidad
public void insertar (Object elem, int p) { /Inserta un elemento en la posición p, requiere controlada la posición y elem no nulo*/ T[p] = elem; } Introducción a la Programación Orientada a Objetos Genericidad
Genericidad public boolean esta. Elemento (Object elem){ /*Decide si la tabla mantiene un elemento con la misma identidad de elem, que asume no nulo*/ int i = 0; boolean esta = false; while (i<cant. Posiciones() && !esta ){ esta = T[i] == elem) ; i++; } return esta; }
Genericidad public int cant. Posiciones(){ return T. length; } public boolean existe. Posicion(int p){ /*Decide si existe una posición p*/ return (p>=0 & p<cant. Posiciones()); }
Tabla T : arreglo de Object <<constructores>> Tabla (max : entero) <<comandos>> … <<Consultas>> … Estacionamiento <<Constructor>> Estacionamiento (max: entero) <<Consultas>> todos. Reservados (): boolean
Genericidad class Estacionamiento extends Tabla { public Estacionamiento (int max){ super(max); } public boolean todos. Reservados() { /*Retorna true si todos los micros estacionados tienen todos los asientos reservados*/ int i = 0; todos =true; Micro m; while (i <= cant. Unidades() && todos){ if (T[i] != null){ m = (Micro) T[i]; todos = !m. hay. Disponibles(); } i++; } return todos; } }
Genericidad class Parking { private Estacionamiento s; … public administrar(){ s = new Estacionamiento(50); … int pos; … pos = 0; Micro r= new Micro (…); s. insertar (r, pos); … }
Genericidad class Fabrica. Juguetes{ private Tabla s; … public producir(){ s = new Tabla(70); … int pos; … pos = 0; Robot r= new Robot (…); s. insertar (r, pos); … }
Caso de Estudio: Colección Ordenada Coleccion. Ordenada *Elemento T [] Elemento cant: entero << Constructores>> Coleccion. Ordenada(max: entero) <<Comandos>> insertar(c: Elemento) eliminar(c: Elemento) <<Consultas>> pertenece(c: Elemento): boolean cant. Elementos(): entero esta. Llena(): entero intercala(l: Coleccion. Ordenada): Coleccion. Ordenada <<Consultas>> *igual(c: Elemento): boolean *mayor(c: Elemento): boolean
Caso de Estudio: Colección Ordenada Colección. Ordenada(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 esta. Llena() 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 decrementacant. Elementos.
Caso de Estudio: Colección Ordenada pertenece (c: Elemento): boolean retorna true si la colección contiene un elemento equivalente a c. cant. Elementos(): entero retorna la cantidad de Elementos almacenados en la colección esta. Llena(): entero retorna true si la cantidad de Elementos es igual al tamaño de la colección intercala(c: Coleccion. Ordenada): Coleccion. Ordenada Genera una nueva colección ordenada intercalando la colección que recibe el mensaje con la que pasa como parámetro
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 al primero pero Menor que el último
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
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 esta. Llena() es false no modifica el estado interno y retorna false */ boolean inserto = true; if (c==null || esta. Llena()) inserto = false; else{ int pos = pos. Insercion(nc, cant); arrastrar. Dsp (pos, cant-pos); T[pos] = c; cant++; } return inserto; }
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 pos. Insercion (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 = pos. Insercion (c, --n); return pos; }
Caso de Estudio: Colección Ordenada private void arrastrar. Dsp (int pos, int n){ if (n > 0){ T[pos+n] = T[pos+n-1]; arrastrar. Dsp(pos, --n); } }
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
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 = pos. Elemento (c, cant. Elementos); if (pos > -1){ arrastrar. Ant(pos, cant. Elementos -pos-1); cant--; } }
Para decidir si un elemento pertenece a la colección ordenada podemos aplicar búsqueda binaria. La búsqueda binaria consiste en partir una estructura ordenada en mitades, considerando que el elemento buscado puede ser: • igual al que está en el medio • menor que el que está en el medio • mayor que el que está en el medio Introducción a la Programación Orientada a Objetos Caso de Estudio: Colección Ordenada
Caso de Estudio: Colección Ordenada Algoritmo Búsqueda Binaria si el elemento que está en el medio es el buscado EXISTE si hay un solo elemento y no es el buscado NO EXISTE sino si el elemento que está en el medio es menor al buscado Descartar la primera mitad Buscar en la segunda mitad sino Descartar la segunda mitad Buscar en la primera mitad Refinamos la solución Introducción a la Programación Orientada a Objetos
Caso de Estudio: Colección Ordenada Algoritmo Búsqueda. Binaria DE ini, fin, Elem Mitad (ini+fin)/2 si Tmitad = Elem EXISTE sino si ini >= fin NO EXISTE sino si Tmitad < Elem Buscar. Binaria mitad+1, fin, Elem sino Busqueda. Binaria ini, mitad-1, Elem Es un algoritmo genérico, no depende del tipo de los elementos. Introducción a la Programación Orientada a Objetos
Caso de Estudio: Colección Ordenada public boolean pertenece(Elemento c, int ini, int fin){ boolean b= false; int mitad= (int) (ini+fin)/2 ; if (c. igual(T[mitad])) b = true; else if (ini < fin) if (c. mayor(T[mitad])) b = pertenece (c, mitad+1, fin); else b = pertenece(c, ini, mitad-1); return b; }
Algoritmo Intercalar crear una colección ordenada Nueva i 1 0 i 2 0 k 0 mientras i 1 < n 1 y i 2 < n 2 si L 1 i 1 es menor que L 2 i 2 insertar L 1 i 1 en Nuevak i 1++ k++ sino insertar L 2 i 2 en Nuevak i 2++ k++ si i 1 < n 1 Insertar el resto de L 1 i 1 sino Insertar el resto de L 2 i 2 ¿Qué ocurre si un elemento pertenece a las dos estructuras? Introducción a la Programación Orientada a Objetos Caso de Estudio: Colección Ordenada
- Slides: 40