Examen Parcial Primavera 2010 (2010)

Examen Español
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería de Sistemas de Telecomunicación - 1º curso
Asignatura Metodologia y Programacion Orientada a Objetos
Año del apunte 2010
Páginas 6
Fecha de subida 12/11/2014
Descargas 0
Subido por

Vista previa del texto

EXAMEN PARCIAL Metodología y Programación Orientada a Objetos.
Curso 2009-2010. Cuatrimestre primavera. 12 de Mayo de 2010-05-08 Hoy en día existen herramientas que permiten construir modelos UML para dar soporte al desarrollo de software. Algunas de ellas son capaces de generar automáticamente parte del código del programa.
El siguiente diagrama de clases muestra una parte de las clases que forman parte de una hipotética herramienta capaz de generar código automáticamente. Como se ve en la figura, el diagrama modela los conceptos de clase, método, atributo, tipo primitivo y herencia de la orientación a objetos: la clase de nombre “Clase” modela el concepto de clase, la clase de nombre “Metodo” modela al método de una clase, la clase de nombre Atributo a los atributos de una clase, etc.
NOTA: como podéis observar, en el diagrama NO aparecen los constructores. La pregunta 3 pide el diseño de uno de ellos.
1. (1,25 PUNTOS) A la vista de que las clases y relaciones del anterior diagrama modelan las relaciones entre los conceptos de clase, atributo, método y argumento en orientación a objetos, contestad BREVEMENTE a las siguientes preguntas (una o dos frases cortas para cada una).
a ¿Qué modelan las diferentes relaciones de composición en el diagrama? (entre Clase y Método, entre Clase y Atributo, entre Método y Argumento) Clase-Metodo: que los métodos son parte constituyente de una clase.
Clase-Atributo: que los atributos son parte constituyente de una clase.
Metodo-Argumento: que los argumentos son parte constituyente de un m b. ¿Qué modela la asociación “opera con” entre Metodo y Atributo? Que un método set o get usa un atributo (para asignarle valor o para devolver su valor respectivamente).
c. ¿Cómo se modela en este diagrama la relación de herencia entre clases? Mediante la asociación “es subclase de” que va de Clase a Clase.
d. ¿Por qué se hace uso de la clase Tipo en el diagrama?. ¿Qué indica la asociacines “pertenece a” entre Atributo y Tipo, y entre Argumento y Tipo? Tipo es la superclase de Clase y TipoEnumerado. Se utiliza para mostrar que los atributos y los argumentos pueden ser instancias de clase o valores de tipos primitivos.
e. ¿Cuál es el papel de la función getTipo() en Atributo y Argumento? Devuelve el objeto que indica la clase de la cual es instancia o el tipo primitivo del que es valor el atributo/argumento.
f. ¿Cuál es el papel de las funciones addMetodo() y addAtributo() en Clase y addArgumento() y setTipoResultado() en Metodo?.
addMetodo() y addAtributo() permiten añadir uno a uno los diferentes miembros (métodos y atributos) a una clase después de su creación.
addArgumento() permite añadir uno a uno los argumentos de un método.
setTipoResultado() permite definir el tipo (valor de tipo primitivo u objeto instancia de clase) que devuelve el método.
g. ¿Por qué aparecen las clases Set, Get como derivadas de Metodo?. ¿Cuál es su utilidad en el contexto de la generación automática de código? Porque son tipos especiales de método. Son los métodos más simples y para ellos puede generarse código automáticamente mediante las funciones polimórficas generaCodigo().
2. (2 PUNTOS) A la vista del diagrama anterior, escribid, para las clases siguientes: Clase, Tipo, Metodo, Argumento y Atributo, la parte de código de la definición de comenzando con el “public class….” incluyendo solamente la declaración de los todos los atributos de las clases, incluyendo aquellos que aparecen al implementar las relaciones, tal y como se muestra a continuación para Tipo: public class Tipo{ prívate String nombre ; } public class Clase extends Tipo{ private boolean esAbstracta ; private Clase superclase ; // de asociación ‘es subclase de’ private List <Atributo> atributos ; // composición a Atributo private List <Metodo> métodos ; // composición a Metodo } public class Metodo { private String nombre ; private Tipo valorDevuelto; // de asociación ‘devuelve’ private List <Argumento> argumentos ; // composición a Argumento private Atributo atributo ; // de asociación ‘opera con’ } public class Atributo { private String nombre ; private Tipo tipo; // de asociación ‘pertenece a’ } public class Argumento { private String nombre ; private Tipo tipo; // de asociación ‘pertenece a’ } 3. (1 PUNTO) Proponed un constructor con argumentos para la clase Clase y escribid su código. Nota: en la evaluación de la respuesta se tendrá en cuenta la adecuación del constructor propuesto con el repertorio de métodos que aparecen en la clase Clase.
public Clase(String n, boolean abst, Clase sup){ super(n) ; this.esAbstracta = abst ; this.superClase = sup ; this.metodos = new ArrayList<Metodo> ; // se admite también LinkedList this.atributos LinkedList = new ArrayList<Atributo> ; // se admite también } No se pasan argumentos de lista de métodos y atributos porque la clase tiene las funciones addMetodo() y addAtributo() para añadirlos después.
4. (0, 75 PUNTOS) El diagrama que sigue es un trozo de un diagrama de objetos. Muestra a un objeto instancia de Clase cuyo atributo nombre tiene el valor “Casilla”. Modela por tanto a una clase llamada Casilla. Este objeto contiene además un objeto instancia de Atributo, cuyo atributo nombre es “pieza”. Este objeto instancia de Atributo a su vez contiene un objeto instancia de Clase cuyo atributo nombre es “Pieza”. En resumen, este trozo modela la situación siguiente: una clase de nombre “Casilla”, con un atributo de nombre “pieza” que es instancia de una clase de nombre “Pieza”.
Añadid al mapa los objetos necesarios para modelar las siguientes operaciones en Casilla: operación de nombre “getPieza” sin argumentos que retorna un objeto instancia de Pieza; operación de nombre “setPieza” con argumento de nombre “p” instancia de Pieza.
Respuesta: Explicación: Casilla tiene un atributo de nombre “pieza” que es una instancia de Pieza. Tiene una operación set, de nombre “setPieza” que tiene un argumento de nombre “p” que es una instancia de Pieza y una función get, de nombre “getPieza” que devuelve un objeto instancia de Pieza. Los métodos “setPieza” y “getPieza” operan con el atributo “pieza”.
5. Implementad los métodos generarCodigo() de clases que se indican a continuación: NOTA: se recomienda utilizar la clase StringBuffer y su operación append() para construir el String que todas ellas retornan). Haced uso de las funciones que aparecen en el diagrama de clases.
a (0,75 PUNTOS) De Atributo. Esta función debe devolver un String con el código correspondiente a la declaración de un argumento como argumento privado. Ejemplo: para un atributo de nombre “pieza”, instancia de Pieza, podría devolver el String: “private Pieza pieza ;” public String generarCodigo(){ StringBuffer result = new StringBuffer() ; result.append("private " + this.tipo.getNombre() + " " + this.nombre + ";\n") ; return result.toString() ; } // también se admiten como válidas respuestas que no usan StringBuffer pero // // devuelven el String correcto.
b (1,25 PUNTOS) De Set. Esta función debe devolver un String con el código correspondiente a una función set en la que se asigna el valor del argumento pasado al atributo correspondiente de la clase. Ejemplo, para la operación setPieza, que opera sobre el atributo pieza, el String podría ser: “public void setPieza(Pieza p){this.pieza = p ;}” NOTA: el código de la función generada NO debe incluir código de guarda.
public String generarCodigo(){ StringBuffer result = new StringBuffer() ; result.append("public void " + this.getNombre() + "(") ; Argumento arg = this.getArgumentos().get(0) ; result.append(arg.getTipo().getNombre() + " " + arg.getNombre() + "){") ; result.append("this." arg.getNombre() + ";}\n") ; + this.getAtributo().getNombre() return result.toString() ; + " = " + } // también se admiten como válidas respuestas que no usan StringBuffer pero // // devuelven el String correcto.
c. (1 PUNTO) De Get. Esta función debe devolver un String con el código correspondiente a una función get que devuelve el valor del atributo correspondiente. Para una supuesta operación getPieza, el código generado podría ser: public Pieza getPieza(){return this.pieza;} public String generarCodigo(){ StringBuffer result = new StringBuffer() ; result.append("public " + this.getNombre() + "{") ; result.append("return ";}\n") ; this.getTipoResultado().getNombre() + " " + this." + this.getAtributo().getNombre() + return result.toString() ; } // también se admiten como válidas respuestas que no usan StringBuffer pero // // devuelven el String correcto.
d. (2 PUNTOS) De Clase. Esta función debe devolver un String con el código correspondiente a la definición parcial de una clase, que incluye: la cabecera de la definición (“public class…”), la declaración de todos sus atributos y el código de sus métodos.
NOTA: el diagrama de clases mostrado solo permitiría construir automáticamente el código de las operaciones set y get.
public String generaCodigo(){ StringBuffer result = new StringBuffer() ; result.append("public ") ; if(this.esAbstracta) result.append("abstract ") ; result.append("class") ; if(this.superClase!=null){ result.append(" extends " + this.superClase.getNombre()) ; } result.append(" " + this.getNombre() + " {\n"); java.util.Iterator it = this.atributos.iterator() ; while(it.hasNext()){ Atributo atr = (Atributo)it.next() ; result.append("\t" + atr.generarCodigo()) ; } result.append("\n") ; it = this.metodos.iterator() ; while(it.hasNext()){ Metodo met = (Metodo)it.next() ; result.append("\t" + met.generarCodigo()) ; } result.append("}") ; return result.toString() ; } ...