2017-04-12 4 views
1

내가 달성하려는 것은 일치 조건에 여러 부울 옵션을 일치시키는 것입니다. 지금까지 이것은 나의 디자인이다. 나는 그것에 만족하지 않는다. 하나의 조건과 일치하는 여러 옵션을 효율적으로 작성하는 방법은 무엇입니까? 아니면 여러 옵션에 주요 코드 냄새가 있습니까?특정 조건에 대해 여러 옵션 일치

class Condition 
{ 
    Boolean a; // Optional 
    Boolean b; // Optional 
    Boolean c; // Optional 
    boolean d; // mandatory 

    Condition(Boolean a, Boolean b, Boolean c, boolean d) 
    { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
     this.d = d; 
    } 

    public boolean matches(Boolean a, Boolean b, Boolean c, boolean b) 
    { 
     return (a == null || this.a == a) 
       && (b == null || this.b == b) 
       && (c == null || this.c == c) 
       && (this.b == b); 
    } 

    public static void main(String args[]) { 
     Condition c1 = new Condition(true, true, null, true); 
     Condition c2 = new Condition(null, null, false, false); 
     Condition c3 = new Condition(false, true, null, true); 
     Condition[] conditions = new Condition[]{c1,c2,c3}; 

     for (Condition con : conditions) { 
      Boolean a = someTestLogic1(...); 
      Boolean b = someTestLogic2(...); 
      Boolean c = someTestLogic3(...); 
      boolean d = someTestLogicMandatory(...); 

      if (con.matches(a,b,c,d)) { 
       // found the matching condition 
       return con; 
      } 
     }    
    } 
} 
+0

이 코드의 어느 부분이 특히 불만입니까? –

+0

나는 더 적은 Constructor params를 사용하여보다 효율적이고 (속도가 빠르며) 우아한 방법 (덜 장황 함)을 보인다. 또한 모든 조건을 반복하고 첫 번째 일치하는 것을 찾지 않아도된다. – delita

+0

메서드는'someTestLogic1()'등을 호출합니다. for 루프 안에 ... 맞습니까? 그 이유는 모든 메소드가 zero-arg 메소드처럼 보이고 어떻게 diff를 리턴 할까하는 것입니다. '부울 '값? 루프 외부에있을 수 있습니까? – developer

답변

0

내가 더 효율적 (속도)가 의심하고 우아한 방법 (이하 자세한 정보) 낮은 생성자 PARAMS와 같은을 달성하고, 는 내가 모든 조건의 루프를 싫어하고 깨진 첫 번째 일치하는 찾을 수 있습니다.

(1) null O를 통과 좋은 방법이 아닙니다 인스턴스를 생성하는 생성자 호출을 만족

는 다음과 같은 현재의 코드 몇 가지 문제가 분명히있다.

(2) 동일한 유형의 두 개체가 같은지 확인하더라도 equals() 메서드를 사용하지 않습니다.

그래서, 위의 문제를 다음과 같습니다 대답 :

(1)은 첫 번째 문제를 해결하기 위해 Builder pattern을 사용할 수 있습니다

(2) 분명히, 당신은 equals()hashcode() 방법을 재정의해야 java.lang.Object에서 두 개체의 동일성과 일치시킵니다. (그들이 당신의 코어 로직 부분이기 때문에)


중요한 점은이 두 솔루션은 완전히 if 검사 또는 조건을 피하고, 즉 당신의 상세를 해결하지 못할 수도 있다는 점이다. 그러나 이러한 수정은 올바른 방향으로 이끌어 줄 것이며 코드가 더 체계적으로 구성되어 (덜 혼란스럽고) 쉽게 읽을 수 있습니다. &.