2011-01-04 2 views
1
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) {..} 
    } 

은, 위의 클래스를 모델링 할 수있는 더 좋은 방법이 있나요 나는 할 수 있도록 특정 매개 변수 (예 : 반지름, 직경, 면적 또는 둘레)가 주어지면 사용자는 다른 정보를 찾을 것으로 예상되므로 위의 정보를 가져옵니다.

+0

4-8은 중복 연산입니다. –

+0

@ org.life.java - 명확하게 할 수 있습니까? – Jason

+1

나는 반경 필드 만 계산, 직경, 면적, 둘레면 충분하다고 말하려했다. 그래서 클래스를 디자인한다면, 원할 때 원의 중심 위치를 추가 할 수 있다면 충분할 것이라고 생각한다. –

답변

3

아마도 반경을 사용하는 생성자가있는 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

나는 Circle 클래스 내부의 정적 public 메소드와 같은 모든 8 개 메소드를 구현 (또는 어쩌면 동료 도우미 클래스에서) 또한 GET {직경, 경계, 반경} 적절한 정적 메소드를 호출하여 위의 정의 선언합니다 :

public class Circle { 
    double radius; 

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

    // ... 

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

} 
1

내가 알고 있듯이, 당신은 항상 원 자체가 필요하지는 않지만, 예를 들어, 주어진 반지름으로 잠재적 원 영역을 계산하고자합니다.

나는 모든 정적 함수를 별도의 유틸리티 클래스로 옮기려고합니다. 관례 상, 그러한 클래스 이름은 사용되는 클래스 또는 인터페이스의 복수형입니다. 따라서 이름은 Circles입니다.

public class Circles { 

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

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

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

    ... 
} 

당신은 여전히 ​​다음 (그렇지 않은 경우) 즉 당신의 원 불변하게 생각 어떤 세터를 제거하고 모든 필드 final을 몇 가지 이유에 대한 클래스 Circle이 필요합니다.

public class Circle { 
    final double radius; 

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

    public double getRadius() { 
     return radius; 
    } 
}