Está en la página 1de 41

INTRODUCCIÓN A LA PROGRAMACIÓN 01100

ORIENTADA A OBJETOS
10011
10110
01110
01100
10011
10110
01110
1001
Depto. de Ciencias e Ingeniería de la Computación 1 11
0 0
Universidad Nacional del Sur, Bahía Blanca 1
Tabla
Sectores Sectores (max:entero)
<<Atributos de instancia>> Crea una tabla para representar
t [] Androide max sectores. Requiere max > 0
<<Constructor>>
Sectores (max:entero) asignar (a:Androide, s:entero)
<<Comandos>> Asigna a al sector s. Requiere que el
asignar (a:Androide, s: entero) sector s sea válido y esté disponible.
01100
retirar (s:entero) 10011
retirar (a:Androide) retirar (s:entero)
10110
<<Consultas>> Elimina la asignación del androide
01110
cantSectores():entero del sector s. Requiere que el sector s 01100
cantSectoresAsignados():entero sea válido. 10011
cantSectoresAndroide(a:Androide):entero 10110
retirar (a:Androide)
todosAsignados():boolean 01110
Elimina todas las asignaciones del androide
estaAndroide(a:Androide):boolean 1001
existeSector(s:entero):boolean
a. 1 11
androideSector(s:entero):Androide 0 0
hayANave(n:NaveEspacial):boolean 1
clone():Sectores
2
Tabla
Sectores cantSectores():entero
<<Atributos de instancia>> Retorna el tamaño de la tabla
t [] Androide
cantSectoresAsignados():entero
<<Constructor>> Retorna la cantidad de sectores que tienen
Sectores (max:entero) asignado un androide.
<<Comandos>>
asignar (a:Androide, s: entero) cantSectoresAndroide(a:Androide):entero 01100
retirar (s:entero) Retorna la cantidad de sectores a las que 10011
retirar (a:Androide) está asignado el androide a. 10110
<<Consultas>> 01110
cantSectores():entero todosAsignados ():boolean 01100
cantSectoresAsignados():entero Retorna true si todos los sectores tienen asignado1 0 0 1 1
cantSectoresAndroide(a:Androide):entero un androide 10110
todosAsignados():boolean 01110
estaAndroide(a:Androide):boolean estaAndroide(a:Androide):boolean 1001
existeSector(s:entero):boolean Retorna true si el androide a está asignado al 1 11
androideSector(s:entero):Androide menos a un sector. 0 0
hayANave(n:NaveEspacial):boolean 1
clone():Sectores
Tabla
Sectores
<<Atributos de instancia>>
t [] Androide
<<Constructor>> existeSector(s:entero):boolean
Sectores (max:entero) Retorna true si s es un sector válido
<<Comandos>>
asignar (a:Androide, s: entero) androideSector (s:entero):Androide
Retorna al androide asignado al sector s 01100
retirar (s:entero) 10011
retirar (a:Androide) o nulo
10110
<<Consultas>> 01110
hayANave(n:NaveEspacial):boolean
cantSectores():entero 01100
Retorna verdadero si hay al menos un
cantSectoresAsignados():entero 10011
androide asignado a la nave n.
cantSectoresAndroide(a:Androide):entero 10110
todosAsignados():boolean clone():Sectores 01110
estaAndroide(a:Androide):boolean Implementa clone en profundidad 1001
existeSector(s:entero):boolean 1 11
androideSector(s:entero):Androide 0 0
hayANave(n:NaveEspacial):boolean 1
clone():Sectores 4
Tabla
Androide
Sectores
<<Atributos de instancia>> <<Atributos de instancia>>
t [] Androide vocablos: entero
nave: NaveEspacial
<<Constructor>>
Sectores (max:entero)
<<Constructor>>
<<Comandos>>
Androide (n: NaveEspacial)
asignar (a:Androide, s: entero) 01100
<<Comandos>>
retirar (s:entero) 10011
establecerNave(n: NaveEspacial)
retirar (a:Androide) 10110
aprenderVocablos(v: entero)
<<Consultas>> 01110
copy(a: Androide)
cantSectores():entero 01100
<<Consultas>>
cantSectoresAsignados():entero 10011
obtenerNave(): NaveEspacial
cantSectoresAndroide(a:Androide):entero 10110
obtenerVocablos(): entero
todosAsignados():boolean 01110
clone(): Androide
estaAndroide(a:Androide):boolean 1001
equals(a: Androide): boolean
existeSector(s:entero):boolean 1 11
androideSector(s:entero):Androide 0 0
hayANave(n:NaveEspacial):boolean 1
clone():Sectores
Tabla

class Sectores {
private Androide[] t;
//Constructor
public Sectores(int max) {
/*Crea una tabla para representar max sectores*/
01100
t = new Androide [max]; 10011
} 10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1

6
Tabla

//Comandos
public void asignar(Androide a, int s) {
/*Asigna a al sector s. Requiere que el
sector s sea válido y esté disponible*/
t[s] = a;
01100
} 10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1

7
Tabla

public void retirar(int s) {


/*Elimina la asignación del androide del sector
s. Requiere que el sector s sea válido.*/
t[s] = null;
}
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
Si el sector no tenía un androide asignado no se produce ningún cambio. 0 0
1

8
Tabla

public void retirar (Androide a) {


/*Elimina todas las asignaciones del androide a.*/
for (int i=0;i < cantSectores();i++)
if (t[i] == a)
t[i] = null;
01100
} 10011
10110
01110
01100
10011
10110
01110
1001
1 11
Aunque el diseñador no lo especifica explícitamente asumimos que la 0 0
comparación es por identidad. 1

9
Tabla

//Consultas
public int cantSectores (){
//Retorna el tamaño de la tabla
return t.length;
}
01100
public int cantSectoresAsignados (){ 10011
/*Retorna la cantidad de sectores que tienen 10110
01110
asignado un androide*/ 01100
10011
int cant = 0; 10110
for (int i=0;i < cantSectores();i++) 01110
1001
if (t[i]!=null) cant++; 1 11
return cant; 0 0
1
}
10
Tabla

public int cantSectoresAndroide(Androide a) {


/*Retorna la cantidad de sectores que tienen
asignado al androide a.*/
int cant=0;
for (int i=0;i < cantSectores();i++)
01100
if (t[i] == a) 10011
cant++; 10110
01110
return cant; 01100
10011
} 10110
01110
1001
1 11
0 0
1

11
Tabla

public int todosAsignados() {


/*Retorna true si todos los sectores tienen
asignado un androide.*/
boolean todos=true;
for (int i=0;i < cantSectores()&& todos;i++)
01100
todos = t[i]!=null; 10011
return todos; 10110
01110
} 01100
10011
10110
01110
1001
1 11
0 0
1

12
Tabla

public boolean estaAndroide(Androide a) {


/*Retorna true si el androide a está asignado al
menos a un sector.*/
boolean esta=false;
for (int i=0;i < cantSectores() && !esta;i++)
01100
esta = t[i] == a; 10011
return esta; 10110
01110
} 01100
10011
10110
01110
1001
1 11
Si el parámetro no está ligado retorna true si hay un sector sin asignar 0 0
1

13
Tabla

public boolean existeSector(int s) {


/*Retorna true si s es un sector válido*/
return 0<=s && s<cantSectores();
}
01100
public Androide androideSector(int s) { 10011
/*Retorna al androide asignado al sector s 10110
01110
o nulo*/ 01100
10011
Androide a=null; 10110
if (existeSector(s)) 01110
1001
a = t[s]; 1 11
return a; 0 0
1
}
14
Tabla

public boolean hayANave(NaveEspacial n) {


/*Retorna verdadero si hay al menos un
androide asignado a la nave n.*/
boolean esta=false;
for (int i=0;i < cantSectores() && !esta;i++)
01100
esta = (t[i] != null && t[i].obtenerNave()==n);1 0 0 1 1
return esta; 10110
01110
} 01100
10011
10110
01110
1001
El contrato de la clase Androdoide establece que todo androide está 1 11
0 0
asociado a una nave. 1

15
Tabla

public Sectores clone() {


/*Implementa clone en profundidad*/
Sectores nueva = new Sectores(cantSectores());
for (int i=0;i < cantSectores();i++)
if (t[i] != null)
01100
nueva.asignar(t[i].clone(),i); 10011
return nueva; 10110
01110
} 01100
10011
10110
01110
1001
t[i] puede recibir cualquiera de los servicios que brinda la clase Androide 1 1 1
0 0
1

16
Tabla

Una compañía de transporte tiene un estacionamiento


formado por un conjunto de unidades de
estacionamiento en el que se ubican los micros.
En un momento dado una unidad puede estar ocupada
por un micro o libre. Las unidades libres y ocupadas
01100
están intercaladas. En una unidad de estacionamiento 10011
claramente solo puede estar estacionado un micro y un 10110
01110
mismo micro solo puede estar estacionado en una 01100
unidad. 10011
10110
01110
1001
1 11
0 0
1
Tabla

El estacionamiento puede ser modelado por un arreglo


en el cual el subíndice indica el número de unidad.
Inicialmente el estacionamiento está vacío.
Cuando un micro estaciona en una unidad se asigna
un objeto a un elemento arreglo. 01100
10011
Cuando se retira un micro se asigna nulo a un 10110
01110
elemento del arreglo. 01100
10011
10110
01110
1001
1 11
0 0
1
Tabla
Estacionamiento Estacionamiento (max:entero)
<<Atributos de instancia>> Crea una tabla para representar max
t [] Micro unidades de estacionamiento. Requiere max >0
<<Constructor>> estacionar (unMicro:Micro)
Estacionamiento (max:entero) Busca la primera unidad libre, si existe
<<Comandos>> asigna el micro a esa unidad.
estacionar(unMicro:Micro,p:entero) Requiere que unMicro no esté estacionado
estacionar(unMicro:Micro) en una unidad 01100
retirar(p:entero) 10011
retirar(unMicro:Micro) estacionar (unMicro:Micro,p:entero) 10110
inspeccion() Estaciona unMicro en la unidad p. 01110
<<Consultas>> Requiere la unidad controlada y vacía. 01100
cantUnidades():entero 10011
cantUnidadesOcupadas():entero
retirar (p:entero) 10110
todasOcupadas():boolean Elimina el micro de la unidad p. 01110
estaMicro(unMicro:Micro):boolean Requiere controlada la unidad. 1001
existeUnidad(p:entero):boolean 1 11
microUnidad(p:entero):Micro retirar (unMicro:Micro) 0 0
Elimina el micro con la misma patente que 1
cantVerificación(m:entero):entero
cantDisponibles():entero unMicro. Requiere unMicro ligado.
19
Tabla
Estacionamiento
estaMicro(unMicro:Micro):boolean
<<Atributos de instancia>> Retorna true si el micro con la patente de
t [] Micro unMicro está asignado a alguna unidad de
<<Constructor>> Estacionamiento. Requiere unMicro ligado.
Estacionamiento (max:entero)
<<Comandos>> existeUnidad(p:entero):boolean
estacionar(unMicro:Micro,p:entero) Retorna true si p es una unidad de
estacionar(unMicro:Micro) estacionamiento válida. 01100
retirar(p:entero) 10011
retirar(unMicro:Micro)
microUnidad (p:entero):Micro
10110
inspeccion() Retorna el micro estacionado en la unidad p. 01110
<<Consultas>> Requiere p válida. 01100
cantUnidades():entero 10011
cantUnidadesOcupadas():entero
cantVerificación(m:entero):entero 10110
todasOcupadas():boolean Retorna cuántos micros hicieron su última 01110
estaMicro(unMicro:Micro):boolean verificación en el mes m. Requiere m válido. 1001
existeUnidad(p:entero):boolean 1 11
microUnidad(p:entero):Micro cantDisponibles():entero 0 0
Retorna cuántos micros tienen al menos 1
cantVerificación(m:entero):entero
cantDisponibles():entero un asiento disponible.
20
Tabla
Estacionamiento Micro
<<Atributos de instancia>>
t [] Micro <<Atributos de instancia>>
patente:String
<<Constructor>> fechaUltVTV:Fecha
Estacionamiento (max:entero) cantDisponibles:entero
<<Comandos>>
estacionar(unMicro:Micro,p:entero) <<Constructor>>
estacionar(unMicro:Micro) Micro(p:String,f:Fecha) 01100
retirar(p:entero) <<Comandos>> 10011
retirar(unMicro:Micro) ocupar(a:entero) 10110
inspeccion() liberar(a:entero) 01110
<<Consultas>> establecerFechaUltVTV(f:Fecha) 01100
cantUnidades():entero <<Consulta>> 10011
cantUnidadesOcupadas():entero obtenerPatente():String 10110
todasOcupadas():boolean obtenerFechaUltVTV():Fecha 01110
estaMicro(unMicro:Micro):boolean obtenerCantDisponibles():entero 1001
existeUnidad(p:entero):boolean estaOcupado(a:entero):boolean 1 11
microUnidad(p:entero):Micro igualPatente(unMicro:Micro):boolean 0 0
1
cantVerificación(m:entero):entero La patente y la fecha de la última
cantDisponibles():entero verificación siempre están ligadas
21
Tabla
Estacionamiento Micro
<<Atributos de instancia>>
t [] Micro <<Atributos de instancia>>
patente:String
<<Constructor>> fechaUltVTV:Fecha
Estacionamiento (max:entero) asientos[] boolean
<<Comandos>>
estacionar(unMicro:Micro,p:entero) <<Constructor>>
estacionar(unMicro:Micro) Micro(p:String) 01100
retirar(p:entero) <<Comandos>> 10011
retirar(unMicro:Micro) ocupar(a:entero) 10110
inspeccion() liberar(a:entero) 01110
<<Consultas>> establecerFechaUltVTV(f:Fecha) 01100
cantUnidades():entero 10011
<<Consulta>>
cantUnidadesOcupadas():entero 10110
obtenerPatente():String
todasOcupadas():boolean 01110
obtenerFechaUltVTV():String
estaMicro(unMicro:Micro):boolean 1001
obtenerCantDisponibles():entero 1 11
existeUnidad(p:entero):boolean estaOcupado(a:entero):boolean
microUnidad(p:entero):Micro 0 0
igualPatente(unMicro:Micro):boolean 1
cantVerificación(m:entero):entero
cantDisponibles():entero
22
Tabla

class Estacionamiento {
private Micro[] t;
//Constructor
public Estacionamiento(int max) {
/*Crea una tabla para representar max unidades
01100
de estacionamiento. Requiere max>0 */ 10011
t= new Micro [max]; 10110
01110
} 01100
10011
10110
01110
1001
1 11
0 0
1

23
Tabla

//Comandos
public void estacionar (Micro unMicro) {
/*Busca la primera unidad libre, si existe
asigna el micro a esa unidad. Requiere que unMicro
no esté estacionado en otra unidad*/
01100
int i = 0; 10011
while (i < cantUnidades() && t[i] != null) 10110
01110
i++; 01100
10011
if (i < cantUnidades()) 10110
t[i] = unMicro; 01110
1001
} 1 11
0 0
1

24
Tabla

//Comandos
public void estacionar (Micro unMicro) {
/*Busca la primera unidad libre y asigna unMicro a
la unidad. Requiere que unMicro no esté estacionado
en otra unidad y que haya una unidad libre*/
01100
int i = 0; 10011
while (t[i] != null) 10110
01110
i++; 01100
10011
t[i] = unMicro; 10110
} 01110
1001
1 11
El comentario indica que es la clase cliente la responsable de garantizar que 0 0
hay un unidad libre, por ejemplo invocando a todasOcupadas() 1

25
Tabla

public void estacionar(Micro unMicro,int p) {


/*Estaciona unMicro en la unidad p. Requiere que la
unidad p sea válida y esté disponible*/
if(!estaMicro(unMicro))
t[p] = unMicro;
01100
} 10011
10110
01110
01100
10011
10110
01110
1001
Si la unidad tenía un micro asignado se produce un error de aplicación. 1 11
0 0
1

26
Tabla

public void retirar(int p) {


/*Elimina el micro de la unidad p. Requiere
controlada la unidad*/
t[p] = null;
}
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
Si la unidad no tenía un micro estacionado no se produce ningún cambio. 0 0
1

27
Tabla

public void retirar(Micro unMicro) {


/*Elimina el micro con la misma patente que
unMicro, requiere unMicro ligado */
int i = 0; boolean encontro=false;
while (i < cantUnidades() &&!encontro){
01100
if (t[i] != null && 10011
t[i].igualPatente(unMicro)); { 10110
01110
encontro = true; 01100
10011
t[i] = null; 10110
} 01110
1001
i++; 1 11
} 0 0
1
}
28
Tabla

//Consultas
public int cantUnidades (){
//Retorna el tamaño de la tabla
return t.length;
}
01100
10011
10110
01110
01100
10011
10110
01110
1001
1 11
La funcionalidad es análoga a la consulta cantSectores() de la clase 0 0
Sectores. 1

29
Tabla

public int cantUnidadesOcupadas (){


/*Retorna la cantidad de unidades ocupadas por un
micro*/
int i = 0; int cant = 0;
while (i < cantUnidades ()){
01100
if (t[i]!=null) 10011
cant++; 10110
01110
i++; 01100
} 10011
10110
return cant; 01110
1001
} 1 11
0 0
La funcionalidad es análoga a la consulta cantSectoresAsignados() de la 1
clase Sectores.
30
Tabla

public boolean estaMicro(Micro unMicro) {


/*Retorna true si el micro con la patente de
unMicro está asignado a alguna unidad de
Estacionamiento. Requiere unMicro ligado.*/
boolean esta=false;
01100
String p = unMicro.obtenerPatente(); 10011
for (int i=0;i < cantUnidades() && !esta;i++) 10110
01110
esta = t[i] != null && 01100
10011
t[i].obtenerPatente().equals(p); 10110
return esta; 01110
1001
} 1 11
0 0
La funcionalidad es similar a estaAndroide de la clase Sectores. 1

31
Tabla

public boolean existeUnidad (int p){


return p>= 0 & p< t.length;
}

public Micro microUnidad (int p){


01100
/*Retorna el micro estacionado en la unidad p. 10011
Requiere p válida */ 10110
01110
return t[p]; 01100
} 10011
10110
01110
1001
1 11
0 0
La responsabilidad de microUnidad es diferente a androideSector de la 1
clase Androide.
32
Tabla

public int cantVerificacion (int m){


/*Retorna cuántos micros hicieron su última
verificación en el mes m. Requiere m válido.*/
int cant = 0;
for (int i=0;i < cantUnidades();i++)
01100
if (t[i]!=null && 10011
t[i].obtenerFechaUltVTV().obtenerMes()==m)1 0 1 1 0
01110
cant++; 01100
return cant; 10011
10110
} 01110
1001
1 11
0 0
1

33
Tabla

public int cantDisponibles (){


/*Retorna cuántos micros tienen al menos
un asiento disponible*/
int cant = 0;
for (int i=0;i < cantUnidades();i++)
01100
if (t[i]!=null && 10011
t[i].obtenerCantDisponibles()>0) 10110
01110
cant++; 01100
return cant; 10011
10110
} 01110
1001
1 11
0 0
1

34
Reusabilidad

Si observamos el comportamiento de la clase Sectores definida


antes y la clase Estacionamiento definida ahora, podemos notar
un patrón en la representación de los datos y en las operaciones.
Los sectores del videojuego y las unidades del estacionamiento se
asocian a elementos de un arreglo. 01100
10011
En ambas clases el constructor crea un arreglo. 10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
Reusabilidad

class Sectores {
private Androide[] t;
//Constructor
public Sectores(int max) {
/*Crea una tabla para representar max sectores */
t= new Androide [max]; 01100
} 10011
10110
class Estacionamiento { 01110
01100
private Micro[] t; 10011
//Constructor 10110
public Estacionamiento(int max) { 01110
1001
/*Crea una tabla para representar max unidades de 1 11
estacionamiento */ 0 0
t= new Micro [max]; 1
}
Reusabilidad

//Comandos
public void asignar(Androide a, int s) {
/*Asigna a al sector s. Requiere que el
sector s sea válido y esté disponible*/
t[s] = a;
01100
} 10011
10110
public void estacionar(Micro unMicro,int p) { 01110
01100
/*Estaciona unMicro en la unidad p. Requiere que la
10011
10110
unidad p sea válida y esté disponible. Requiere que
01110
unMicro no esté estacionado*/ 1001
1 11
t[p] = unMicro; 0 0
} 1
Reusabilidad

La consulta que decide si un androide está asignado a algún


sector es similar a la consulta que decide si un micro está
estacionado en alguna unidad, aunque la búsqueda en el
primer caso es por identidad y en el segundo por número de
patente. 01100
En la consulta que retorna el micro estacionado en una unidad 10011
10110
la responsabilidad de controlar que el sector sea válido es de 01110
la clase cliente, en la consulta que retorna el androide 01100
10011
asignado a un sector, la responsabilidad es de la clase 10110
Sectores. 01110
1001
Además, un micro solo puede ocupar una unidad mientras que 1 11
0 0
el mismo androide puede estar asignado a varios sectores. 1
Reusabilidad
Sectores Estacionamiento
<<Atributos de instancia>> <<Atributos de instancia>>
t [] Androide t [] Micro
<<Constructor>> <<Constructor>>
Sectores (max:entero) Estacionamiento (max:entero)
<<Comandos>> <<Comandos>>
asignar(a:Androide, s:entero) estacionar(unMicro:Micro,p:entero)
estacionar(unMicro:Micro) 01100
retirar (s:entero) 10011
retirar (a:Androide) retirar (p:entero)
10110
<<Consultas>> retirar (unMicro:Micro)
01110
cantSectores():entero inspeccion()
01100
cantSectoresAsignados():entero <<Consultas>> 10011
cantSectoresAndroide(a:Androide):entero cantUnidades ():entero 10110
todosAsignados ():boolean cantUnidadesOcupadas():entero 01110
estaAndroide(a:Androide):boolean todasOcupadas ():boolean 1001
existeSector(s:entero):boolean estaMicro(unMicro:Micro):boolean 1 11
androideSector (s:entero):Androide existeUnidad(p:entero):boolean 0 0
hayANave(n:NaveEspacial):boolean microUnidad (p:entero):Micro 1
clone():Sectores cantVerificación(m:entero):entero
cantDisponibles():entero
Reusabilidad

Algunos servicios son específicos de Sectores, otros de


Estacionamiento.
Adoptamos la convención de llamar tabla a una estructura
que encapsula un arreglo que mantiene referencias nulas y
ligadas intercaladas y brinda operaciones para insertar, 01100
eliminar, buscar y procesar de alguna manera los elementos. 10011
10110
01110
01100
10011
10110
01110
1001
1 11
0 0
1
Reusabilidad
Sectores Estacionamiento
<<Atributos de instancia>> <<Atributos de instancia>>
t [] Androide t [] Micro
<<Constructor>> <<Constructor>>
Sectores (max:entero) Estacionamiento (max:entero)
<<Comandos>> <<Comandos>>
asignar(a:Androide, s:entero) estacionar(unMicro:Micro,p:entero)
estacionar(unMicro:Micro) 01100
retirar (s:entero) 10011
retirar (a:Androide) retirar (p:entero)
10110
<<Consultas>> retirar (unMicro:Micro)
01110
cantSectores():entero inspeccion()
01100
cantSectoresAsignados():entero <<Consultas>> 10011
cantSectoresAndroide(a:Androide):entero cantUnidades ():entero 10110
todosAsignados ():boolean cantUnidadesOcupadas():entero 01110
estaAndroide(a:Androide):boolean todasOcupadas ():boolean 1001
existeSector(s:entero):boolean estaMicro(unMicro:Micro):boolean 1 11
androideSector (s:entero):Androide existeUnidad(p:entero):boolean 0 0
hayANave(n:NaveEspacial):boolean microUnidad (p:entero):Micro 1
clone():Sectores cantVerificación(m:entero):entero
cantDisponibles():entero

También podría gustarte