2011-02-22 5 views
0

'측정'이라는 개체를 만들려고합니다. 이 측정 개체에는 calculate() 메서드가 하나만 있습니다. (인터페이스 또는 클래스가 될 수 있습니다 - 어느 것이 최선인지 확실하지 않습니다).일반 클래스의 메서드로 다른 클래스의 메서드를 설정하는 방법

나는 많은 다른 측정 값 (아마도 수백 개 이상)을 가지고 있으며, 이들을 구현하려는 방식은 이러한 모든 측정을 정적 메소드로 포함하는 클래스를 갖는 것입니다.

그래서 기본적으로 클래스의 정적 메서드를 Measurement 개체로로드하려고하는데, 여기서 measurement.calculate()를 호출 할 수 있습니다.

내가 구현할 수있는 방법은 생각할 수있는 유일한 방법은 Reflection에서 Method 클래스를 사용하는 것입니다. 여기서 각 측정은 Method (다른 클래스의 정적 측정 방법)로 인스턴스화됩니다. . Measurement 클래스의 calculate() 메소드는 각각의 객체가 인스턴스화 된 메소드를 호출합니다.

이것을 구현하는 가장 좋은 방법은 무엇입니까?

감사합니다.

+0

나는 대답하기를 원하고 당신의 동기에 의문을 제기하지 않는다는 것을 안다.하지만 ... 신이여, 왜? – johusman

+0

나는 500 회 이상의 측정을했다. 대부분은 단일 진술 일뿐입니다. 나는 그들을 쉽게 포함하는 파일을 수정/읽을 수 있기를 원한다. 나는 그것들을 메소드 호출로 유지하고 싶지만, 불가능한 것이기 때문에, 그것들을 유일한 방법으로 모든 방법으로 만들 것이라고 생각했다.궁극적으로, 나는 하나 하나의 측정을 피하고 싶다. 많은 측정들이 다른 측정의 약간의 변화이며, 그것의 자신의 클래스이다. 나는 여러 가지 방법에 개방적이지만, 나는 각 클래스를 만드는 것을 피하는 것이 너무 무리 스럽다고 생각하지 않습니다. 그것은 내 필요를 위해 불필요하게 근면 한 것처럼 보입니다. – Bijan

+0

이 방법을 사용하는 다른 방법은 클래스 내의 모든 메서드를 포함하고 해당 클래스 내의 모든 메서드를 측정 값으로 활용하는 것입니다. – Bijan

답변

3

이것은 작업을 수행하는 방식을 결정하고 그 과정에서 더 복잡한 문제를 만든 것처럼 보입니다. 모든 객체가 구현할 인터페이스를 생성하라는 제안을 시작했습니다. 그러나 하나의 정적 클래스에서 이들을 모두 그룹화하면 상황이 붕괴되기 시작합니다.

더 나은 조직은 각 측정 클래스가 calculate 메소드를 구현하도록하는 것입니다. 이렇게하면 Foos를 다룰 때 Foos, Bars, Bizzes 및 Bazzes와 관련된 코드가있는 하나의 큰 클래스로 이동할 필요가 없습니다. 적어도 100 개의 클래스를 가질 수 있다고 말했 으면, 이는 정적 클래스를 처음부터 잘 작동하도록 만듭니다. 계산에 대한 많은 구현이 필요하지 않을 수도 있습니다. 상속 계층 구조를 구축하면 코드를 더욱 세밀하게 분할하고 구성하여이 작업을 수행 할 수 있습니다.

public interface Measurable<T> { 
    T calculate(); 
} 

public class Foo implements Measurable<Integer> { 
    private int a; 
    private int b; 
    @Override 
    Integer calculate() { 
    return a + b; 
    } 
} 

public class Foo implements Measurable<Double> { 
    private double a; 
    private double b; 
    @Override 
    Integer calculate() { 
    return a/b; 
    } 
} 

당신은 당신이 실제로 무엇을 찾고에 대한 자세한 정보를 가지고,하지만 좋은 예를 제공하고 당신이 일을 유연하게하는 방법을 보여해야 할 기본 템플릿입니다.

+0

또한 @philonous로 이동 했으므로 각 측정 구현에 대한 클래스를 작성하지 않는 것이 좋습니다. 나는 그들보다 더 이상 방법이 아닌 것을 선호한다. 이 동작은 일반적으로 각 클래스 내에서 자체 클래스를 래핑하여 구현된다는 것을 알고 있지만 텍스트를 줄이려면 피하려고합니다. – Bijan

+0

내가 생각할 수있는 또 다른 대안은 Measurement 클래스를 잊어 버리고 모든 측정 방법이 정의 된 클래스 내의 모든 메소드로 측정을 관리하는 것입니다. – Bijan

0

문제를 언급 했으므로 인터페이스로 "측정 개체"를 구현해야합니다. 그것은 오직 하나의 방법을 가지고 있으며,이 방법은 모든 하나의 특정 "측정 객체"에 의해 구현되어야합니다. 귀하의 접근 방식은 God class처럼 내성적 인 코드로 보강 된 것 같습니다. 단지 polymorphism을 사용하여보다 쉽게 ​​달성되는 동작을 모방하는 것입니다.

그래서 좀 더 구체적으로 :

public interface Measurable { 
    public void calculate(); 
} 

그리고 다음과 같이 단일 측정 전략은 구현 될 것이다 :

public class MeasurementA implements Measurable { 

    @Override 
    public void calculate() { 
     System.out.println("I am doing a very cool measurement."); 
    } 

} 

이 다음 다음과 같은 방법으로 사용될 수있다 :

public class Controller { 

    public static void main(String[] args) { 

     ArrayList<Measurable> measurables = new ArrayList<Measurable>(); 
     measurables.add(new MeasurementA()); 
     measurables.add(new MeasurementB()); 

     for (Measurable measurement : measurables) { 
      measurement.calculate(); 
     } 
} 
관련 문제