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 Encapsulamiento y Abstracción
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2018

2 Caso de Estudio: Correo
Una empresa de desarrollo de software emprende un proyecto que requiere representar a una colección de mensajes recibidos a una cuenta de correo electrónico. Los mensajes van a quedar almacenados en el orden en que insertan en la colección. Al eliminarse uno o más mensajes los que quedan deben mantener el orden. También es posible computar la cantidad de mensajes, decidir si la estructura está llena y si existe al menos un mensaje almacenado. Las funcionalidades se describen en el siguiente diagrama:

3 Caso de Estudio: Correo
Las componentes ligadas ocupan las primeras cant posiciones. T [] Mensaje cant:entero insertar (m:Mensaje) Asigna el mensaje m a la primera posición libre de la estructura, es decir, cant. Aumenta el valor de cant. Requiere que la clase cliente haya verificado que la estructura no esté llena, m esté ligado y no haya un mensaje con la misma identidad en la estructura. << Constructores>> Correo(max:entero) <<Comandos>> insertar (m:Mensaje) eliminar (m:Mensaje) eliminar (c:Contacto) eliminar (m:Mensaje) Busca un mensaje con la misma identidad que m en la secuencia de mensajes, si lo encuentra arrastra los mensajes que siguen una posición y decrementa cant Adoptamos la convención de llamar colección a las estructuras que mantienen una cantidad fija de componentes ligadas ocupando las primeras posiciones y las demás libres. eliminar(c:Contacto)Asigna nulo a todos los mensajes que corresponden al contacto c, actualiza cant y comprime para mantener todas las componentes ligadas las primeras cant posiciones.

4 Caso de Estudio: Correo
mensaje(p:entero) Retorna el mensaje que corresponde a la posición p, si p no es una posición válida retorna nulo T [] Mensaje cant:entero pertenece (m:Mensaje) Busca el mensaje con la misma identidad que m y si existe retonar true. <<Consultas>> cantElem():entero estaLleno():boolean hayMensajes():boolean mensaje(p:entero):Mensaje pertenece (m:Mensaje):boolean caracteres(n:entero):entero asunto(a:String):Correo dosenSec(c:Contacto) : boolean caracteres(n:entero) Computa la cantidad de mensajes con más de n caracteres en el contenido. asunto(a:String) Genera una estructura con todos los mensajes que corresponden a un asunto dado. La clase Correo no brinda servicios para leer ni mostrar datos. dosenSec(c:Contacto )Retorna true si hay dos mensajes consecutivos del mismo contacto c.

5 Caso de Estudio: Correo
Mensaje T [] Mensaje cant:entero contacto:Contacto fecha:Fecha hora:Hora asunto : String contenido:String << Constructores>> Correo(max:entero) <<Comandos>> insertar (c:Mensaje) eliminar (c:Mensaje) eliminar (c:Contacto) <<Consultas>> cantElem():entero estaLleno():boolean hayMen():boolean mensaje(p:entero):Mensaje pertenece (c:Mensaje):boolean caracteres(m:entero):entero asunto(a:String):Correo dosenSec(c:Contacto):Mensaje Las clases Correo y Mensaje están asociadas. La clase Mensaje no conoce la existencia de la clase Correo. La clase Correo conoce la interfaz de la clase Mensaje.

6 Caso de Estudio: Correo
class Correo { //Atributos de Instancia private Mensaje[] T; private int cant; //Constructor /*Crea una estructura con capacidad para max mensajes*/ public Correo(int max) { T= new Mensaje [max]; cant = 0; } class ServicioMensajeria { Correo im = new Correo(1000); }

7 Caso de Estudio: Correo
cant im length 1000

8 Caso de Estudio: Correo
//Comandos public void insertar (Mensaje m) { /*Asigna el mensaje m a la primera posición libre del arreglo, es decir, cant. Aumenta el valor de cant. Requiere que la clase cliente haya verificado que la colección no esté llena, m esté ligado y no haya un mensaje almacenado con la misma identidad */ T[cant++] = m; } class ServicioMensajeria{ sms = new Mensaje(…); if (!im.estaLleno() && !im.pertenece(sms)) im.insertar(sms); }

9 Caso de Estudio: Correo
cant im length :Mensaje 1000

10 Caso de Estudio: Correo
Algoritmo eliminar DE el mensaje m Busca la posición de un mensaje con la misma identidad que m Si está decrementa la cantidad arrastra los mensajes que siguen a la posición

11 Caso de Estudio: Correo
public void eliminar ( Mensaje m){ /* Busca un mensaje con la misma identidad que m en la secuencia de mensajes, si lo encuentra arrastra los mensajes que siguen una posición*/ boolean esta = false; int i= 0; while (!esta && i < cantElem()) if (T [i] == m) esta = true; else i++; if (esta) { cant--; arrastrar(i); }

12 Caso de Estudio: Correo
cant im length 4 1000

13 Caso de Estudio: Correo
cant im length 4 1000

14 Caso de Estudio: Correo
cant im length 3 1000

15 Caso de Estudio: Correo
private void arrastrar( int i){ /* arrastra todos los elementos una posición hacia arriba*/ while (i < cantElem()){ T[i] = T[i+1]; i++; } T[i]=null; Para que la estructura quede comprimida en las primeras posiciones del arreglo y los elementos mantengan el orden de inserción, “arrastramos”, cada elemento una posición hacia “atrás”.

16 Caso de Estudio: Correo
private void arrastrar( int i){ /* arrastra todos los elementos una posición hacia arriba*/ while (i < cantElem()){ T[i] = T[i+1]; i++; if (i==cantElem()) T[i]=null; }

17 Buscamos soluciones correctas, eficientes y legibles
Caso de Estudio: Correo public void eliminar ( Contacto c){ /* Elimina todos los mensajes que corresponden al contacto c*/ for (int i=0; i< cantElem();i++) if (T [i].obtenerContacto() == c) eliminar(T[i]); } La solución no es correcta si contiene dos elementos consecutivos ligados al contacto c. Buscamos soluciones correctas, eficientes y legibles

18 Caso de Estudio: Correo
Algoritmo eliminar DE un contacto c Para cada mensaje si el contacto tiene la misma identidad que c asigna nulo Si elimino alguno comprimir

19 Caso de Estudio: Correo
public void eliminar ( Contacto c){ /* Elimina todos los mensajes que corresponden al contacto c*/ int cantEliminados= 0; for (int i=0; i< cantElem();i++) if (T [i].obtenerContacto() == c){ T[i] = null; cantEliminados++; } if (cantEliminados > 0) comprimir(); cant = cant-cantEliminados; private void comprimir(){ /* Las primeras cant componentes quedan ocupadas manteniendo el orden en el que fueron insertados los mensajes*/ }

20 Caso de Estudio: Correo
//Consultas public int cantElem () { return cant; } public boolean estaLleno() { return cant == T.length; public boolean hayMen() { return cant > 0; public Mensaje mensaje(int p){ /*Retorna el mensaje que corresponde a la posición p, si p no es una posición válida retorna nulo*/ Mensaje m = null; if (p>=0 && p < cantElem()) m = T[p]; return m;

21 Caso de Estudio: Correo
public boolean pertenece (Mensaje m){ /*Decide si algún elemento de la colección tiene la misma identidad que m*/ boolean esta = false; for (int i = 0; !esta && i < cantElem() ; i++) esta = T[i] == m; return esta; }

22 Caso de Estudio: Correo
public int caracteres(int m){ /*Cuenta la cantidad de mensajes con más de m caracteres en el contenido*/ int car =0; String content; for (int i = 0; i < cantElem(); i++) { content = T[i].obtenerContenido(); if (content.length() > m) car++; } return car; La clase Correo conoce la interfaz de la clase Mensaje. Si la clase cliente no cumple el contrato y envía el mensaje insertar con parámetro nulo, la consulta caracteres terminará anormalmente.

23 Caso de Estudio: Correo
public Correo asunto(String a){ /*Genera un objeto de clase Correo solo con los objetos que corresponden al asunto a*/ Correo n = new Correo(cantElem()); for (int i = 0; i < cantElem() ; i++) if(T[i].obtenerAsunto().equals(a)){ n.insertar(T[i]); } return n; La clase Correo no conoce de qué clase es asunto pero sabe que brinda el método equals.

24 Caso de Estudio: Correo
public boolean dosenSec(Contacto c){ boolean b=false; return b; } Dada una secuencia de mensajes S=s0,s1,…,scant-1 la consulta dosenSec retorna true si existe 0<k<cant tal que sk y sk-1 corresponden al mismo contacto c

25 Caso de Estudio: Correo
“Luis” :Correo T cant im length “Lucho” “Lucho” 4 “UNS” 1000

26 Caso de Estudio: Correo
Algoritmo dosenSec Para cada mensaje desde el último hasta el segundo si el mensaje y el anterior corresponden al contacto c se verifica

27 Caso de Estudio: Correo
Mensaje T [] Mensaje cant:entero contacto:Contacto fecha:Fecha hora:Hora asunto : String contenido:String <<Consultas>> mayor (Mensaje m):boolean << Constructores>> Correo(max:entero) <<Comandos>> insertar (c:Mensaje) eliminar (c:Mensaje) eliminar (c:Contacto) <<Consultas>> cantElem():entero estaLleno():boolean hayMen():boolean mensaje(p:entero):Mensaje pertenece (c:Mensaje):boolean caracteres(m:entero):entero asunto(a:String):Correo ordenado():Correo ordenado():Correo Genera una estructura con los mensajes ordenados de acuerdo al criterio establecido por el método mayor de la clase Mensaje

28 Caso de Estudio: Correo
public Correo ordenado() /*Genera una estructura con los mensajes ordenados de acuerdo al criterio establecido por el método mayor*/ Correo n = new Correo(cantElem()); return n; }


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

Presentaciones similares


Anuncios Google