2014-10-30 1 views
0

다음과 같은 경우-다른-경우 체인 :리팩토링 경우 - 다른 경우 내가있는 방법이 자바 8 체인 스타일

 if(downstreamActual.getNumber() <= downstreamRecommended.getNumber()){ 
      downstreamActual.setInvalid(); 
      showErrorWindow(); 
      throw new NumberFormatException(); 
     }else if(upstreamActual.getNumber() <= upstreamRecommended.getNumber()){ 
      upstreamActual.setInvalid(); 
      showErrorWindow(); 
      throw new NumberFormatException(); 
     }else if(biUpstreamActual.getNumber() <= biUpstreamRecommended.getNumber()){ 
      biUpstreamActual.setInvalid(); 
      showErrorWindow(); 
      throw new NumberFormatException(); 
     }else if(biDownstreamActual.getNumber() <= biDownstreamRecommended.getNumber()){ 
      biDownstreamActual.setInvalid(); 
      showErrorWindow(); 
      throw new NumberFormatException(); 
     } 

우리가 같은 작업 (첫 번째 개체에 대해 동일한 메소드를 호출 할 때마다 단계가 부울 표현식에서 사용하는 경우 showErrorWindow()을 호출하고 Exception을 던집니다.

특히이 코드를 관리하기 위해 Java 8을 사용하는 좋은 기술은 무엇입니까?

+0

'downstreamActual','upstreamActual', 'upstreamRecommended' 등의 유형은 무엇입니까? 그것들은 같은 유형입니까? 아니면 공통 기본 클래스가 있습니까? 또는 공통 인터페이스입니까? – Eran

+1

코드가 작동하고 그것을 검토하고 싶다면 http://codereview.stackexchange.com/ – fxm

+0

@Eran으로 문의하십시오. 이들은 숫자 유형의 NumberTextBox와 동일합니다. –

답변

3

귀하의 의견에 따라 Java 8 구문이 필요하다고 생각하지 않습니다. 테스트되는, 따라서 그들의 나머지를 방지, 예외를 슬로우 실패 처음부터

validate (downstreamActual,downstreamRecommended); 
validate (upstreamActual,upstreamRecommended); 
... 

:

public void validate (NumberTextBox actual, NumberTextBox recommended) 
{ 
    if(actual.getNumber() <= recommended.getNumber()) { 
     actual.setInvalid(); 
     showErrorWindow(); 
     throw new NumberFormatException(); 
    } 
} 

그런 다음 4 번 전화 :

는 그냥 방법을 사용 당신은 if else-if 구조체가 필요 없다.

0

여기 자바 (8) 참여를 볼 수 있지만, 당신이 할 수있는 한 가지는 다음과 같은 방법으로 경우 - 다른 체인의 조각을하는 방법을 만들 수 있습니다 : 그 스트림이 공통의 슈퍼가있는 경우

public void handleStreams() throws NumberFormatException { 
    if(downstreamActual.getNumber() <= downstreamRecommended.getNumber()) { 
     setInvalid(downstreamActual); 
    } else if(upstreamActual.getNumber() <= upstreamRecommended.getNumber()) { 
     setInvalid(upstreamActual); 
    } else if(biUpstreamActual.getNumber() <= biUpstreamRecommended.getNumber()) { 
     setInvalid(biUpstreamActual); 
    } else if(biDownstreamActual.getNumber() <= biDownstreamRecommended.getNumber()) { 
     setInvalid(biDownstreamActual); 
    } else { 
     return; 
    } 

    showErrorWindow(); 
    throw new NumberFormatException(); 
} 

public void setInvalid(MyObject stream) { 
    stream.setInvalid(); 
} 
0

클래스에서 직접 구현할 수 있습니다. 당신을 확인 할 그럼 당신은 방법을 만들 수 CustomStream 클래스

public int recommendedValue; 

에 변수로 recommendation를 추가하고 인스턴스를 만들 때 .. 설정할 수 있습니다 다음

public class DownstreamActual extends CustomStream { 

경우 즉 당신은 자바 8로 할 수있는

public void checkRecommendedValue() { 
    if(this.getNumber() <= this.recommendedValue){ 
     this.setInvalid(); 
     showErrorWindow(); 
     throw new NumberFormatException(); 
    } 
} 
0

한 가지 (즉 당신에게 호출하는 경우) 별도의 방법을 피하고 사용하여 메서드 내 오른쪽에 하나를 만들 수있다 값 새로운 구문 :

BiConsumer<Thing, Thing> check = (actual, recommended) -> { 
    if (actual.getNumber() <= recommended.getNumber()) { 
     actual.setInvalid(); 
     showErrorWindow(); 
     throw new NumberFormatException(); 
    } 
}; 

check.accept(downstreamActual, downstreamRecommended); 
check.accept(upstreamActual, upstreamRecommended); 
check.accept(biUpstreamActual, biUpstreamRecommended); 
check.accept(biDownstreamActual, biDownstreamRecommended); 
+0

좋은 시작입니다. 당신은'ActualRecommended' 데이터 객체를 정의하고 짧은 이름의 공장을 제공하는 경우 지금, 당신은'Stream.of (AR (downstreamActual, downstreamRecommended), AR (upstreamActual, upssteamRecommended)을 가질 수있다 (ar''말) .. .). forEach (ar -> {... 코드 처리 중 ...});' –

+0

더 나아가 첫 번째 유효하지 않은 인스턴스를 찾는 것이므로 'findFirst'를 사용하여 리팩터링 한 다음 논리를 적용 할 수 있습니다. –

+0

이것이 효과가 있지만 나는 Eran의 방법에 비해 어떤 이점도 보이지 않는다. ('룩앤필'을 고려하지 않는 한 이점이있다.) Eran의 메소드는 성능이 뛰어나고 읽기 쉽다 (메소드의 이름이 명확하기 때문에). 이런 종류의 코드는 객체 거부와 같은 코드처럼 보입니다. –

관련 문제