2016-08-28 2 views
0

단일 공장에 대한 날씨 측정을 유지하는 객체가 있습니다.자세한 스위치 케이스 설명 리펙터링

public class FactoryWeather { 

    // each measurement consists of min, max and average observations. 
    private Measurement temperature; 
    private Measurement humidity; 
    private Measurement ... 

    public constructor,setters/getters... 

} 

측정 유형을 열거 다음과 같이 정의된다 : 스위치 문,의 유형을 잘 볼 수 있지만

public void updateWeatherMeasurement(String type, Measurement measurement, FactoryWeather factory) { 
    WeatherMeasurementEnum m = WeatherMeasurementEnum(type.toUpperCase()); 
    if(!m.isValid(measurement.getAverage()) 
     throw new AppException("Invalid measurement!"); 

    switch(m) { 
    case TEMPERATURE: factory.setTemperature(measurement);break; 
    case HUMIDITY: factory.setHumidity(measurement);break; 
    ... 
    } 

} 

: 마지막으로

public enum WeatherMeasurementEnum { 
    // min and max range of single measurement 
    TEMPERATURE(-50,50), 
    HUMIDITY(0,100), 
    ... 

    // validity check for measurements 
    public boolean isValid(int average) { 
     return average >= minimum && average <= maximum; 
    } 
} 

, 나는 다음과 같은 방법을 사용하여 각 측정을 업데이트 미래에는 측정 값이 커질 수 있습니다. 이것을 고려하고 모범 사례를 위해 긴 전환이나 if/else 문을 없앨 수 있습니까?

+0

Stategy Pattern에 대해 알게 되셨습니까? –

+0

필자는이 방법이 효과가있을 것이라고 말할 수있을만큼 충분히 말하지는 않았지만 아이디어를 발표 할 것입니다 : WeatherMeasurementEnum에 setMeasurement (FactoryWeather) 메소드를 추가합니다. 공장. enum에 추상 메소드가 필요하고 각 enum 인스턴스에 구현이 필요합니다. –

답변

3

각 측정마다 FactoryWeather에서 별도의 필드를 사용하는 대신 각 열거 형 인스턴스에 대한 측정 값을 저장하는 Map<WeatherMeasurementEnum, Measurement>을 가질 수 있습니다. FactoryWeather의 setMeasurement() 방법은 직접 측정의 유효성을 확인할 수 있기 때문에

그러면 그냥

public void updateWeatherMeasurement(String type, Measurement measurement, FactoryWeather factory) { 
    WeatherMeasurementEnum m = WeatherMeasurementEnum(type.toUpperCase()); 
    if (!m.isValid(measurement.getAverage()) { 
     throw new AppException("Invalid measurement!"); 
    } 

    factory.setMeasurement(m, measurement); 
} 

그리고 사실

는이 방법이 완전히 제거 될 수있다 할 것이다.

또 다른 옵션은 열거 자체에 필드의 설정을 위임하는 것입니다 : 당신이 잊지 수있는 방법은 없다 :

public enum WeatherMeasurementEnum { 
    // min and max range of single measurement 
    TEMPERATURE(-50,50) { 
     @Override 
     setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw) { 
      fw.setTemperature(m); 
     } 
    }, 
    HUMIDITY(0,100) { 
     @Override 
     setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw) { 
      fw.setHumidity(m); 
     } 
    }, 
    ... 

    // validity check for measurements 
    public boolean isValid(int average) { 
     return average >= minimum && average <= maximum; 
    } 

    public abstract setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw); 
} 

는 switch 문보다 더 자세한 보일 수 있지만, 그것은 큰 장점이 있습니다 새로운 유형의 측정이 도입 될 때 측정 설정을 처리하기 위해 : 컴파일러는 추상 메소드를 구현하도록 강제합니다.