Реализация круга - Как моделировать, чтобы получить эту информацию - PullRequest
1 голос
/ 04 января 2011
1. Find circle diameter from radius
2. Find circle diameter from perimeter
3. Find circle diameter from area

4. Find circle perimeter from diameter
5. Find circle perimeter from radius

6. Find circle radius from diameter
7. Find circle radius from perimeter
8. Find circle radius from area

В настоящее время наш класс модели реализован следующим образом.

class Circle {
  double radius;

  Circle (double r) {
  }

// Solves 6,7,8
      double getDiameter() {}
      double getPerimeter() {}
      double getArea() {}

// static functions to solve 1-5
// e.g. public static double getPermiter(double diameter) {..}
    }

Есть ли лучший способ смоделировать вышеуказанный класс, чтобы я мог получить вышеуказанную информацию, поскольку, учитывая определенный параметр (например, радиус, диаметр, площадь или периметр), пользователь должен найти другую информацию.

Ответы [ 3 ]

3 голосов
/ 04 января 2011

Я бы предпочел класс Circle с конструктором, использующим радиус. Вы можете добавить статические фабричные методы для создания экземпляров из окружности и области.

public class Circle
{
    double radius;

    public Circle(double radius)
    {
        this.radius = radius;
    }

    public static Circle fromCircumference(double circumference)
    {
        return new Circle(circumference / (Math.PI * 2));
    }

    public static Circle fromArea(double area)
    {
        return new Circle(Math.sqrt(area / Math.PI));
    }

    public double getCircumference()
    {
        return 2 * Math.PI * radius;
    }

    public double getRadius()
    {
        return radius;
    }

    public double getDiameter()
    {
        return 2 * radius;
    }

    public double getArea()
    {
        return Math.PI * radius * radius;
    }
}
1 голос
/ 04 января 2011

Как я понимаю, вам не всегда нужен сам круг, но, например, вы хотите посчитать потенциальную площадь круга по заданному радиусу.

Я бы лучше переместил все эти статические функции вотдельный служебный класс.По соглашению, такое имя класса является множественной формой класса или интерфейса, с которым оно используется.Итак, он будет называться Circles.

public class Circles {

    public static double diameterFromRadius(double radius) {...}

    public static double diameterFromPerimeter(double perimeter) {...}

    public static double perimeterFromArea(double area) {...}

    ...
}

Если по каким-то причинам вам все еще нужен класс Circle, подумайте о том, чтобы сделать ваш круг неизменным (если это не так), т.е. удалите все сеттеры и заполните все поля final.

public class Circle {
  final double radius;

  public Circle (double r) {
      this.radius = r;
  }

  public double getRadius() {
      return radius;
  }
}
1 голос
/ 04 января 2011

Я бы реализовал все 8 методов как статические открытые методы внутри класса Circle (или, возможно, в классе вспомогательного помощника), а также объявил бы get {Diameter, Perimeter, radius}, вызвав соответствующие статические методы, определенные выше:

public class Circle {
  double radius;

  public double getPerimeter() {
    return getPerimeterFromRadius(radius);
  }

  // ... 

  public static double getPerimeterFromRadius(double radius) {
    return 2 * Math.PI * radius;
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...