Información

Marcar pregunta

Texto informativo

Jerarquía de Figuras - Clase Circulo

Planteamiento

Queremos modelar y programar una clase Java que me permita representar y trabajar con figuras de tipo círculo en el plano 2D. La clase se llamará Circulo.

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

Un círculo es una figura geométrica en un plano que consiste en todos los puntos equidistantes de un punto central llamado centro. Es una forma redonda y simétrica que no tiene lados ni esquinas. La distancia constante entre cualquier punto de la circunferencia del círculo y su centro se denomina radio. La circunferencia de un círculo es la curva cerrada que delimita su borde.

Modelado de los datos de la clase 

Para poder representar un círculo 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 círculo 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 círculo.

  • Radio. El radio de un círculo es la distancia desde el centro hasta cualquier punto en su circunferencia y es una medida esencial para describir y calcular propiedades geométricas del círculo. 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.

Definición de una constante de clase

Con un valor aproximado de 3.1416, el número π (PI) es fundamental en la mayor parte de los cálculos que realizamos con círculos, ya que relaciona su radio, diámetro, circunferencia o perímetro y área. 

Crearemos una constante de clase (accesible a través del nombre de la clase) para almacenar el valor de PI (un número real de tipo double) y así poder utilizarlo en cualquier momento en la implementación de nuestra clase Circulo. Esta constante de clase será solo para uso interno de la clase y no estará accesible desde el exterior de la misma ni desde sus subclases, si las hubiese.

Métodos constructores

Se programarán dos constructores para la clase:

  • Un constructor que recibirá las coordenadas X e Y del punto que marca el centro de la figura y el tamaño del radio.
  • Un constructor que recibe un objeto Punto2D que marca el centro de la figura y el tamaño del radio. 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 el atributo radio de la clase. 

El método setter deberá 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 getDiametro, que devolverá el tamaño del diámetro del círculo. El diámetro de un círculo es una línea recta que pasa a través del centro del círculo y que une dos puntos opuestos de su circunferencia. Es la distancia máxima entre dos puntos de la circunferencia de un círculo. El diámetro es siempre el doble del radio del círculo.

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 círculo (un double). El área de un círculo se calcula multiplicando el número PI por el cuadrado del tamaño del radio.
  • Daremos implementación al método getPerimetro heredado de la clase Figura2D, que devolverá el perímetro del círculo (un double). El perímetro de un círculo se calcula multiplicando el número PI por el doble del tamaño del radio (es decir, por el diámetro).

  • Redefine los dos métodos heredados de la clase Object que permiten establecer cuándo dos objetos de la clase Circulo son iguales, de tal manera que se establezca que serán iguales cuando su centro y su radio sea 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 los métodos getDiametro, getArea, getPerimetro  y el método que comprueba si dos círculos son iguales, son correctos. 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 la definición de la constante de clase será penalizado con hasta un 10% de la puntuación.

    • 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 del diámetro se penalizará con hasta un 40% del ejercicio.

    • Errores en los métodos getArea y getPerimetro se penalizará con hasta un 60% 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