Información

Marcar pregunta

Texto informativo

Jerarquía de Figuras - Clase Rectangulo

Planteamiento

Queremos modelar y programar una clase Java que me permita representar y trabajar con figuras de tipo rectángulo en el plano 2D. La clase se llamará Rectangulo.

Un rectángulo es un tipo de figura geométrica, por lo que se modelará como una subclase de la clase Figura2D, que ya tenemos programada.

Un rectángulo es una figura geométrica plana que se caracteriza por tener cuatro lados rectos y ángulos internos de 90 grados (ángulos rectos). Es un paralelogramo con lados opuestos iguales y paralelos. Los lados opuestos del rectángulo tienen igual longitud y los lados adyacentes son perpendiculares entre sí. La base y la altura son las dos dimensiones principales de un rectángulo.

Por simplicidad del programa, vamos a considerar solamente los rectángulos con una orientación a 0 grados, es decir, aquellos cuya base coincide con la horizontal y su altura coincide con la vertical. No vamos a dar la posibilidad de trabajar con rectángulos rotados, por lo que la dirección del rectángulo no será un parámetro a considerar en la definición de nuestra clase.

Modelado de los datos de la clase 

Para poder representar un rectángulo en el plano 2D necesitamos almacenar la siguiente información:

  • Centro (Heredado de la clase Figura2D). Como cualquier otra figura de nuestra jerarquía de figuras, un rectángulo tiene un centro. Será un Punto2D que registra la posición en el plano en la que se encuentra el centro de la figura; en este caso, el centro del rectángulo.

  • Base. En general, cuando se habla de la base de un rectángulo, se refiere a los dos lados más largo del mismo. Nosotros tomaremos como base del rectángulo a los dos lados horizontales, independientemente de que sean más cortos que la altura. Será un número real (double) positivo. No son posibles números negativos ni el valor cero para este atributo. El atributo deberá tener el modificador de acceso adecuado para el propósito del mismo.

  • Altura. En general, cuando se habla de la altura de un rectángulo, se refiere a los dos lados más cortos del mismo. Nosotros tomaremos como altura del rectángulo a los dos lados verticales, independientemente de que sean más largos que la base. Será un número real (double) positivo. No son posibles números negativos ni el valor cero para este atributo. El atributo deberá tener el modificador de acceso adecuado para el propósito del mismo.

Métodos constructores

Se programarán dos constructores para la clase:

  • Un constructor que recibirá las coordenadas X e Y del vértice inferior izquierdo del rectángulo, la base y la altura del rectángulo. Calcular el centro del rectángulo a partir de estos datos es muy sencillo, simplemente hay que sumar la mitad de la base a la coordenada X del vértice inferior izquierdo y sumar la mitad de la altura a la coordenada Y del vértice inferior izquierdo.
  • Un constructor que recibe un objeto Punto2D que marca el centro de la figura y el tamaño de la base y la altura del rectángulo. Hay que detectar si se le pasa un objeto Punto2D nulo, en cuyo caso, habrá que lanzar la excepción NullPointerException y no crear el objeto.

Los constructores deberán comprobar que los datos suministrados cumplen con las restricciones establecidas para los mismos, si las hubiese. Si alguno no es válido, se lanzará la excepción IllegalArgumentException. Los métodos constructores deberán tener el modificador de acceso adecuado para el propósito de los mismos.

Métodos getter/setter

Aparte de los métodos getter/setter heredados de la clase Figura2D, se ofrecerán métodos getter/setter para los atributos base y altura de la clase Rectangulo

Los métodos setter deberán verificar que se cumplen las restricciones impuestas para los datos correspondientes, si las hubiese. Si el dato no es válido, se lanzará la excepción IllegalArgumentException

Todos estos métodos deberán tener el modificador de acceso adecuado para el propósito de los mismos.

Otros métodos

  • Programaremos un método llamado getVertices, que devolverá un vector de objetos Puntos2D conteniendo los 4 vértices del rectángulo, en este orden: vértice inferior izquierdo, vértice superior izquierdo, vértice superior derecho y vértice inferior derecho.

El método descrito deberá tener el modificador de acceso adecuado para el propósito del mismo.

Redefinición de métodos heredados

  • Daremos implementación al método getArea heredado de la clase Figura2D, que devolverá el área del rectángulo (un double). El área de un rectángulo se calcula multiplicando la base por la altura.
  • Daremos implementación al método getPerimetro heredado de la clase Figura2D, que devolverá el perímetro del rectángulo (un double). El perímetro de un rectángulo se calcula sumando el doble de la base más el doble de la altura.

  • Redefine los dos métodos heredados de la clase Object que permiten establecer cuándo dos objetos de la clase Rectangulo son iguales, de tal manera que se establezca que serán iguales cuando su centro, su base y su altura sean el mismo. Debe resolverse correctamente desde el punto de vista de los principios de la orientación a objetos.

Testing JUnit de la función

En el siguiente enlace encontrarás el fichero de Testing JUnit que puedes integrar en tu proyecto para comprobar si el método getVertices es correcto. Pero recuerda:

  • Debes programar para resolver el problema que se te ha planteado de manera genérica y correcta, no programar para que la función pase los tests. Se considera mal programado un código que va poniendo parches para resolver casos particulares de testing cuando esos casos pueden ser tratados en el algoritmo general de estar éste bien programado.  
  • Si tu función no pasa alguno de los tests es porque contiene errores que debes corregir. Sin embargo, que tu función pase los tests no implica necesariamente que sea correcta; simplemente significa que pasa los tests diseñados.

Criterio de Corrección

    • La clase tiene que estar operativa, no conteniendo errores de sintaxis que impidan su compilación y uso. Si no es así, no se puntuará el ejercicio.
    • Errores en la elección de los modificadores de acceso, tanto de atributos como de métodos, será penalizado con hasta un 30% de la puntuación del ejercicio.
    • Errores en la definición de los constructores de los objetos de la clase y la gestión de sus restricciones será penalizado con hasta un 30% de la puntuación del ejercicio.
    • Errores en la definición de los métodos getter/setter y la gestión de sus restricciones será penalizado con hasta un 30% de la puntuación del ejercicio.
    • Errores en el método de cálculo de los vértices del rectángulo se penalizará con hasta un 20% del ejercicio.

    • Errores en los métodos getArea y getPerimetro se penalizará con hasta un 50% del ejercicio. Debe resolverse correctamente desde el punto de vista de los principios de la orientación a objetos.

    • Errores en la modificación de los métodos heredados de la clase Object serán penalizados con hasta un 30% de la puntuación del ejercicio. Debe resolverse correctamente desde el punto de vista de los principios de la orientación a objetos.

    Tiempo estimado de realización

    30 minutos