2013-02-10 5 views
-1

내가 몇 가지를 가지고있는 프로그램에서 몇 가지 독특한 출력을 얻고 경우이 같은 문장 :|| 그리고 && 하나의 if 문

나는 모두 & &하고 있습니다
if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border) 
    && (m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){ 
    check = true; 
} 

|| 동일한 if 조건에서 사용됩니다. getLeft()의 셀이 벽이나 경계선이고 getBelow()의 셀이 열려 있거나 방문 된 경우 부울 검사를 true로 만들고 싶습니다.

이 코드는 지금 작성한 방식으로이 검사를 올바르게 수행합니까? 아마도 더 중요한 것은 이런 식의 진술을 쓰는 것이 형편 없는가라는 것입니까? 그것을 두 문장으로 나누는 것이 낫겠습니까?

내가 본 특수성이 이러한 진술 또는 다른 무엇 때문인지 확실하지 않습니다. 제 질문은 일반적인 모범 사례에 관한 것입니다.

편집 : 모든 입력 해 주셔서 감사합니다. 나는 (내가 너무 복잡했기 때문에) 많은 것을 의심했다. 그래서 내가했던 것처럼 나의 질문을 짜 넣었다.

EDIT (년 후, 다시 찾고)는 하나님의 사랑 (위 더 격렬하게 재 작성) 위의 if 문 같은 것을 쓰지 않는다. 유사한 코드 행을 발견하면 occam's razor은 프로그래밍에 적용 할 수있는 곳이 없을 것입니다.

+4

if 문은 매우 복잡합니다. 나는 이것이 이해하기가 더 어렵다고 생각한다. 나는 당신이 필요로하는 실제 해결책이 두 개의 if 문으로 분해하거나, 그러한 합병증을 필요로하지 않는 방법을 리팩터링하는 것이라고 생각한다. – theJollySin

+2

나는 여기에서 복잡성이나 진짜 질문을 보지 못한다. 처음 두 조건 중 하나라도 '참'으로 해결되고 두 번째 조건 중 하나가 두 가지를 해결하면 ... '확인'을 '참'으로 설정합니다. 꽤 기본적인'if' 문입니다. –

답변

1

귀하의 복잡한 if 문으로 리팩토링 할 수 있습니다

public boolean isCheck(M m, Position p) { 
    boolean retVal = false; 

    if(m.getLeft(p).state == p.state.wall || m.getLeft(p).state == p.state.border)) { 
     if((m.getBelow(p).state == p.state.open || m.getBelow(p).state == p.state.visited)) 
      retVal = true; 
     } 
    } 

    return retVal; 
} 

// call it as such 

check = isCheck(m, position); 
+0

... 부울 비교 결과에'check'을 지정하지 않는 이유는 무엇입니까? – Makoto

+0

@Makoto 그래도 그렇게 할 것입니다. –

1

제대로 실행되지만 읽는 것이 다소 어렵습니다.

if 문에서 &&을 사용하려는 경우 새 if 문을 중첩 할 수도 있지만 대부분의 경우 기본적으로 동일한 것입니다.

(a == x_1 || a == x_2) && (b == x_3 || b == x_4) 

불행하게도, 그 특정 부울 문을 얻을 것만큼이나 간단합니다

+0

else 문이있는 경우에는 동일하지 않습니다. 동일한 효과를 얻으려면 해당 코드를 복제해야합니다. – Arjan

+0

@Arjan 코드를 복제 할 else 문을 사용하는 곳 - 올바른지 이해하고 있으면'||'를 사용하는 것이 더 낫습니다. 그러나 그럼에도 불구하고, 이것이 내가 본질적으로 대부분의 경우에 말했던 것입니다. – Enfyve

1

은 부울 문을 부셔,이 같은 무언가를 읽습니다.

  • (아래 내 리팩토링과 같이)하는 경우 블록이로 그것을 파괴함으로써, 복잡한 문장을 필요로하지 않는 코드를 리팩토링, 또는
  • 추출 : 고통을 훨씬 쉽게 할 수있는 옵션이 있습니다 그것을 메서드로 사용하고 반환 값을 check에 할당합니다. 솔직히 말해서, 그것은 진실이거나 거짓이 될 것입니다.

다음은 리팩터링 메소드의 예입니다.에

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) { 
    if((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){ 
     check = true; 
    } 
} 

감사 :

if(m.getLeft(position).state == position.state.wall || 
    m.getLeft(position).state == position.state.border){ 
    if(m.getBelow(position).state == position.state.open || 
     m.getBelow(position).state == position.state.visited){ 
     check = true; 
    } 
} 
1

다른 IF&&를 사용하는 insted 사용 : 나는 무엇을 m 것은 정확하게 모른다 @Makoto :

check = ((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) && ((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)); 

코드와이 코드는 "작동합니다".

그러나 Java 스타일 지침에서 언급 한 명명 규칙을 따르십시오. 귀하의 코드에 m이 무엇인지 전혀 모르겠습니다. 이런 종류의 객체 참조의 명명은 피해야합니다. 또한 state은 수업 중에 public 필드 인 것으로 보입니다 (가정). 이러한 공개 접근 필드도 피해야합니다. 대신 getters()setters()을 사용하십시오.

+0

어느 것이 .... 똑같은 것. –