Está en la página 1de 9

EXAMEN

FINAL Metodologa y Programacin Orientada a Objetos.


Curso 2013-2014. Cuatrimestre de Primavera. 20 de Junio de 2014
Publicacin de notas provisionales: 27 de junio del 2014.
Revisin: 30 de junio del 2014. Sala C6 E106. Hora: 11:00
TEORA.
1. (0.25 PUNTOS) Imaginad que en una aplicacin orientada a objetos hemos definido dos clases diferentes A y B,
dnde B es subclase de A. Imaginad tambin que uno de los mtodos constructores de la subclase B se ha
implementado de la siguiente forma:
public class B extends A
{
public B(int a, String str1, String str2, int b) {
super(a, str1);
this.str2 = str2;
this.b = b;
}
}
A partir del cdigo proporcionado, cul debera ser la cabecera de al menos uno de los mtodos constructores que
define la superclase A?
Observando el nmero y tipo de los parmetros proporcionados a super(..) podemos deducir que la superclase A
define un mtodo constructor con cabecera public A(int a, String str1);
2. (0.25 PUNTOS) En la misma aplicacin donde hemos definido previamente la superclase A y su subclase B
identificamos el siguiente fragmento de cdigo:
B objetoDeTipoB = new A (10, texto1);
Creis que dicho fragmento de cdigo es correcto? Justificad vuestra respuesta.
Dicho fragmento de texto es incorrecto, pues no podemos referenciar un objeto de la superclase A mediante una
variable de referencia de la subclase B. En general, en Java podemos apuntar a objetos de subclases mediante
variables de referencia de sus superclases (los objetos de subclases son a su vez objetos de todos los tipos de sus
superclases). Sin embargo, esto no es vlido al revs, pues un objeto de una superclase no tiene por qu ser de una
subclase especfica.
3. (0.25 PUNTOS) Imaginad que en una aplicacin orientada a objetos hemos creado un contenedor de la siguiente
forma:
ArrayList<Evaluable> evaluables = new ArrayList<Evaluable>();
donde Evaluable es un tipo de interface. Qu clase (o clases) de objetos podr albergar dicho contenedor?
Justificad vuestra respuesta.
Siendo Evaluable una interface, una ArrayList<Evaluable> puede albergar objetos de cualquier clase que
implemente dicha interface. No albergar nunca objetos de tipo Evaluable, pues una interface no es instanciable
en Java.


4. (0.25 PUNTOS) Imaginad que el bucle implementado para iterar los objetos dentro del contendor evaluables de
la pregunta anterior es el siguiente:
Iterator<Evaluable> it = evaluables.iterator();
while (it.hasNext()) {
Evaluable e = it.next();
try{
e.evalua();
}
catch (FaltaInfoException e) {
//
}
}
A partir del cdigo proporcionado, implementad la interface Evaluable.
public interface Evaluable {
public void evalua() throws FaltaInfoException;
}
PROBLEMAS.
Una bodega quiere informatizar el proceso de elaboracin de sus vinos. A continuacin se detalla una parte de los
requisitos que la aplicacin informtica debe satisfacer:
R1. La aplicacin debe guardar informacin de todos los viticultores con los que trabaja la bodega. De cada viticultor
debe guardarse: un string identificador nico, el nombre, los apellidos del viticultor y la superficie que cultiva.
R2. La aplicacin debe guardar informacin de todos los vinos que la bodega elabora. De cada vino debe guardarse: el
nombre, la graduacin alcohlica y la denominacin de origen.
R3. Cada viticultor cultiva diferentes tipos de uva. De cada clase de uva hay que guardar: su variedad (que acta como
un identificador nico), el mes de su floracin y el mes de inicio de su cosecha.
R4. Cada vino est compuesto por varios tipos de uva combinados en proporciones adecuada. De cada componente del
vino se guarda informacin del tipo de uva y su porcentaje (suponed que ste siempre es un entero).
R5. La elaboracin de un cierto vino para la bodega en cuestin corre a cargo de los enlogos. Los enlogos elaboran el
vino combinando convenientemente sus componentes (tipos de uvas y sus porcentajes correspondientes).
R6. Existen dos tipos de enlogos: los propios viticultores, que elaboran el vino a mano, y unas mquinas (o mquinas
de baco) que lo elaboran automticamente.
R7. La bodega dispone de varias mquinas de baco. De cada una de stas debe guardarse su nmero de serie, marca,
modelo y ao de compra (String en formato AAAAMMDD).
R8: La aplicacin debe gestionar las distintas uvas que se utilizan en la elaboracin de los vinos de la bodega.


A continuacin se muestra una parte del diagrama de clases de la aplicacin.


2. (2 PUNTOS) Completad el diagrama UML a partir del texto de los requisitos. Para ello:
a. Aadid aquellas clases que identifiquis en los requisitos y no aparezcan en el mismo.
b. Aadid tambin las relaciones que consideris oportunas a partir de dichos requisitos (incluyendo nombre,
cardinalidad y direccionalidad en las asociaciones). Sustituid el ? en la asociacin de Bodega a Uva por la
cardinalidad que consideris oportuna.
c. Aadid a cada clase los atributos que deduzcis de los requisitos.
Opcin 1: En este caso, se introduce una nueva clase Componente para gestionar la composicin de un vino:



Opcin 2: En este caso, la composicin de un vino se implementa mediante un Map<Uva,Integer>:


3. (1 PUNTO) A partir del diagrama UML resultante en el apartado anterior, escribid, para todas las clases la parte de
cdigo de la definicin que comienza con el public class. correspondiente a la declaracin de todos los atributos de
las clases, incluyendo aquellos que aparecen al implementar las relaciones.
OPCION 1:
public class InterfazUsuario {
private Controlador controlador;
}
public class Bodega {
private InterfazUsuario iu;
private Map<String, Vino> vinos;

//Clave: nombre del vino

private Map<String, Viticultor> viticultores;


private List<MaquinaBaco> maquinas;
private Map<String,Uva> uvas ;
}
public class Componente{
private Uva uva ;
private int porcentaje ;
}
public class Vino {
private String nombre;

//Clave: identificador viticultor


private double graduacion;
private String denominacion;
private List<Componente> componentes; // O Set
}

public class Viticultor implements Enologo {


private String id, nombre, apellidos;
private double superficieCultivada;
private Map<String, Uva> uvas; //Clave: variedad de uva
}
public class MaquinaBaco implements Enologo {
private String numSerie, marca, modelo;
private int aoCompra;
private Map<String, Uva> uvas; //Clave: variedad de uva
}
public class Uva {
private String variedad, color, floracion, cosecha;
}
OPCION 2: TODAS LAS CLASES IDNTICAS SALVO:
1. No presencia de clase Componente.
2. La clase Vino quedara como sigue:
public class Vino {
private String nombre;
private double graduacion;
private String denominacion;
private Map<Uva, Integer> componentes;

//Clave: objeto Uva; Valor: % del tipo de

uva
}

4. (1 PUNTO)
Uno de los casos de uso de la aplicacin (el segundo) es AltaVino. Dicho caso de uso permite al usuario dar de alta en
el sistema a un nuevo vino a partir de su nombre, denominacin de origen, graduacin y composicin (tipos de uva y sus
correspondientes porcentajes). Si el caso de uso finaliza con xito, el sistema incorporar dicho vino en el repertorio de
vinos ofrecidos por la bodega. Desarrollad este caso de uso completo, incluyendo cualquier escenario alternativo que
consideris oportuno.
Nombre: AltaVino
Numero: 2
Actores: usuario que da de alta el vino.
Precondiciones: el usuario ha seleccionado la opcin dar de alta un nuevo vino
Postcondiciones: el vino ha sido dado de alta con sus componentes.


ESCENARIO PRINCIPAL:
1. El usuario introduce el nombre del vino.
2. El sistema comprueba que no hay ningn vino dado de alta con ese nombre.
3. El usuario introduce la graduacin del vino.
4.El usuario introduce los detalles de sus components: las variedades de uvas y sus
correspondientes porcentajes.
5. El sistema comprueba que todas las variedades de uvas componentes del vino estn dadas
de alta.
7. El sistema procede a crear los componentes y a combinarlos para formar el vino.
8. El sistema da de alta el vino.
ESCENARIOS ALTERNATIVOS:
2.a. El sistema comprueba que ya hay un vino dado de alta con ese nombre.
1. El sistema notifica el problema al usuario y le pide entrar un nuevo nombre.
2. El sistema vuelve a paso 1 del escenario principal.
5.a. El sistema comprueba que hay algunas uvas que no estn dadas de alta.
1. El sistema notifica el problema al usuario, dndole detalles de las uvas que ya
estn dadas de alta.
2. El
componentes

sistema

solicita

al

usuario

que

entre

de

nuevo

los

detalles

de

los

3. El sistema vuelve al paso 4 del scenario principal.


//NOTA: se admitirn otras soluciones que detallen ms el proceso de entrar los detalles
de los componentes del vino. Se admitirn asimismo soluciones que en los escenarios
alternativos contemplen que el sistema de por acabado el caso de uso o que pregunten al
usuario si quiere introducir de nuevo la informacin o acabar el caso de uso.

5. (1 PUNTO)
Durante la fase de diseo, se ha aadido a Controlador el mtodo siguiente:

public boolean altaUva(String variedad, String mesFloracion, String mesCosecha) ;


Si esta uva no est dada de alta en el sistema, este mtodo la crea, la da de alta y devuelve true. En caso de que la uva
cuya variedad se pasa como primer argumento ya est dada de alta, el mtodo devuelve false. Dibujad el diagrama de
sequencia que muestre las interacciones necesarias para implementar el mtodo anterior.

6. (1 PUNTO)
Implementa en Java el mtodo toString() de la clase Vino. Dicho mtodo tiene que devolver un String que
contenga el nombre del vino, la denominacin de origen, la graduacin y cada una de las variedades de uva que lo
componen, junto con su tanto por ciento. Podis implementar mtodos toString() de otras clases si lo consideris
oportuno, y utilizarlos en el diseo del toString() de la clase Vino. A continuacin se muestra un ejemplo de
contenidos del string devuelto por el mtodo:
Nombre: Can Feixes Selecci
DO: Peneds

Graduacin: 13,5%
Variedades: 40% Parellada 30% Macabeu 20% Parellada 10% Malvasia de Sitges


Solucin:
En clase Vino:
public String toString() {
String result = "Nombre: " + this.nombre;
result += "\nDO: " + this.denominacion + "\nGraduacion: " + this.graduacion;
result += "\nVariedades: ";
Iterator<Componente> it = this.componentes.iterator();


while (it.hasNext()) {
Componente componente = it.next();
result += componente.toString();
}
return result;

}
Se hace uso de toString() de Componente:
public String toString(){
return this.uva.getVariedad()+ " " + this.porcentaje + "% "


7. (1 PUNTO)
Implementad el siguiente mtodo de Vino:
public List<Uva> uvasPrincipalesMes(int porcentaje, String mesCosecha) ;
Este mtodo admite como primer argumento un valor entero, y como segundo un String indicativo de un mes. El
mtodo devuelve en una lista aquellas uvas que participen en su composicin en un porcentaje igual o mayor al valor
del mencionado argumento, Y que tengan como mes de cosecha el indicado por el segundo argumento.
Solucin:
public List<Uva> uvasPrincipales(int porcentaje, String mesCosecha) {
List<Uva> result = new LinkedList<Uva>();
Iterator<Componente> it = this.componentes.iterator();
while(it.hasNext()){
Componente comp = it.next() ;
Uva uva = comp.getUva() ;
if(comp.getPorcentaje()>=porcentaje &&
mesCosecha.equals(uva.getMesCosecha())){
result.add(uva);
}
}
return result;
}



8. (2 PUNTOS)
Implementad el siguiente mtodo de Bodega
public List<Vino> vinosConUva(String variedad) ;


Este mtodo admite como argumento una variedad de uva. Debe devolver una lista que contenga todos los vinos en
cuya composicin interviene esta variedad.
Solucin:
public List<Vino> vinosConUva(String variedad){
List result = new LinkedList<Vino>() ;
Collection<Vino> soloVinos = this.vinos.values() ;
for(Vino unVino: soloVinos){
Iterator<Componente> itComps = unVino.iteratorComponentes() ;
boolean end = false ;
while(itComps.hasNext() && !end){
Componente comp = itComps.next() ;
if(comp.getUva().getVariedad().equals(variedad)){
result.add(unVino);
end = true ;
}
}
}

return result ;
}

También podría gustarte