Primer Parcial - Cátedra Fontela - 27/9/2005

Enunciado

Punto 1

Supongamos que, en el desarrollo de un sistema de sueldos, un diseñador de software orientado a objetos nos presenta un diagrama de clases que, como subclases de Empleado ha definido dos clases, una EmpleadosVarones y otra EmpleadosMujeres. ¿Podemos decir que este planteo es siempre correcto? ¿Podemos decir que es siempre incorrecto? O, en caso de que las dos respuestas anteriores hayan sido negativas, ¿puede explicar en que caso/s consideraróa correcto dicho diseño?

Punto 2

Selección Múltiple: Se deben elegir todas las opciones correctas. Justificar.
La relacion entre “el perro de mi vecina Carlota” y “perro” es:

  1. Especialización
  2. Generalización
  3. Instanciación
  4. Composición
  5. Ninguna de las anteriores

Punto 3

Explique el mecanismo de recolección de basura. ¿Qué ventajas e inconvenientes le encuentra comparándolo con un esquema en la que la destrucción de los objetos se hace mediante la llamada explícita a un metodo destructor? ¿Qué ejemplos de lenguajes conoce que manejen cada mecanismo?

Punto 4

Codificación y diagrama de clases:

  1. Escribir una clase VectoresCadenas que solo contenga dos métodos:
    1. Uno, cuya signatura es
      public static String[] convertir(Object[] v);

      y tiene como propósito convertir un arreglo de elementos de cualquier clase en un arreglo de cadenas de caracteres, donde a cada elemento se le debe aplicar el método toString() definido en Object.

    2. Otro, con una signatura
      public static String[] convertir(Objetc[] v,Stringator s);

      que debe permitir hacer lo mismo, pero no utilizando el toString() de Object, sino el definifo para el objeto s. Stringator es una interfaz cuyo único método es uno cuya signatura es

      String toString(Object o);

      y convierte en cadena de caracteres al objeto o.

  2. Luego, escribir un programa de prueba, que tome un arreglo de objetos de la clase Punto, definida como se muestra más adelante, y lo convierta en un arreglo de cadenas, utilizando el segundo metodo implementado. Su implementación debe ser completa, con todo el código necesario (clases, interfaces, atributos, métodos).
    La clase Punto implementa la siguiente interfaz:
public interface InterfazPunto {
   public double getX();
   public double getY();
   public void setX(double valor);
   public void setY(double valor);
}

La conversión a String debe hacerse como en el ejemplo que sigue: ”(x = 1.2; y = 2.3)“

Finalmente, hacer un diagrama de clases que muestre la solucion implementada.

Resolución

Punto 1

En el caso de que el EmpleadoVaron y EmpleadoMujer tengan comportamientos diferentes tendria sentido tener esta distinción de clases de lo contrario no.

Punto 2

Opción correcta: Instanciación

  • Especialización no es porque sería “perro” —> “doberman”
  • Generalización no es porque sería “perro” —> “animal”
  • Instanciación es porque “el perro de Carlota” es un caso particular de “perro”.

En codigo seria

Perro p_carlota = new Perro("Carlota");
  • Composición no es porque sería “perro” —> “pata_de_perro”

Punto 3

El mecanismo de recolección de basura se ocupa de verificar los objetos a los que no hay referencias apuntandolos y los elimina de la memoria. Comparando con la autorización de destructor, el recolector ayuda a generar un código mas limpio y aumenta la velocidad de desarrollo delegando el borrado de memoria al recolector. A nivel de la performance del software el recolector es eficiente cuando puede actuar en tiempos muertos del programa (cuando se esperan datos de entrada por teclado por ejemplo). Cuando en el programa no hay tiempos muertos donde el recolector pueda actuar, la complejidad de la tarea de recolección termina afectando la eficiencia del programa y en este caso puede ser conveniente utilizar destructores.

Punto 4

  • VectoresCadenas.java
public class VectoresCadenas {
   public static String[] convertir(Object[] v){
      String[] aux=new String[v.length];
      for(int i=0;i<v.length;i++){
         aux[i]=v[i].toString();
      }
      return aux;
   }
 
   public static String[] convertir(Object[] v, Stringator s){
      String[] aux=new String[v.length];
      for(int i=0;i<v.length;i++){
         aux[i]=s.toString(v[i]);
      }
      return aux;
   }
}
  • Stringator.java
public interface Stringator {
   public String toString(Object o);
}
  • PuntoStringator.java
public class PuntoStringator implements Stringator {
 
   public String toString(Object o) {
      Punto p=(Punto)o;
      return p.toString();
   }
 
}
  • InterfazPunto.java
public interface InterfazPunto {
   public double getX();
   public double getY();
   public void setX(double valor);
   public void setY(double valor);
}
  • Punto.java
public class Punto implements InterfazPunto {
 
   private double x,y;
 
   public Punto(double x,double y){
      setX(x);
      setY(y);
   }
 
   public double getX() {
      return x;
   }
 
   public void setX(double x) {
      this.x = x;
   }
 
   public double getY() {
      return y;
   }
 
   public void setY(double y) {
      this.y = y;
   }
   public String toString(){
      return new String("(x="+getX()+";y="+getY()+")");
   }
}
  • Principal.java
public class Principal {
 
   public static void main(String[] args) {
 
      Punto[] puntos=new Punto[10];
 
      for(int i=0;i<10;i++){
         puntos[i]=new Punto(i,i*0.1);
      }
      PuntoStringator ps=new PuntoStringator();
      VectoresCadenas.convertir(puntos,ps);
 
      /* Esto es un agregado para verificar que funciona
      String[] s=VectoresCadenas.convertir(puntos,ps);
 
      for(int i=0;i<10;i++){
         System.out.println(s[i]);
      }               
      */
   }
}

Discusión

materias/75/07/parcial_1_20050927_1.txt · Última modificación: 2008/04/20 16:13 por rulo86
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki