2014-06-13 3 views
0

제목이 분명하지 않을 수도 있지만 더 좋은 것을 찾지 못했습니다. 여기에 문제가있다. 나는 QueryEngine가 쿼리해야 모든 페이지를 제공하는 범위 인터페이스를 가지고있다.쿼리 동작을 제외/적용하지 않도록 디자인하는 방법

interface Scope{ 
    Set<Page> getPages();  
} 

interface QueryEngine{ 
    void query(Scope scope){ 
    queryIn(scope.getPages()); 
    } 
} 

이 제공하는 것보다 다른 쿼리의 모든 페이지 을 말한다 범위의 또 다른 유형이있다. 이 동작을 모델링하려고했습니다.

interface ExcludeScope extends Scope{ 
} 

어떤 경우에는 내가 QueryEngine

interface QueryEngine{ 
    void query(Scope scope){ 
    if(scope instanceof ExcludeScope){ 
     queryInPagesOtherThan(scope.getPages()); 
    }else{ 
     queryIn(scope.getPages()); 
    } 
    } 
} 

아래처럼 뭔가를해야 아니면 내가 느끼는 부울

interface Scope{ 
    Set<Page> getPages(); 
    boolean shouldExclude(); 
} 

모두 위의 방법에 의해 구동되는 뭔가를해야한다 if, else 조건으로 QueryEngine 이 나오면 수정을 위해 닫히지 않습니다.

어떻게 이러한 동작을 설계 할 수 있습니까? 디자인 문제를 해결하는 동안 따라야하는 접근 방식은 무엇이되어야합니까? 솔리드 원칙이 준수되었는지 여부를 확인해야합니까? 따라서 우리는 디자인 패턴에서 문제를 분류하여 해결해야 할 것인가? 제 생각에는

+2

유사한 페이지 여부와 Scope 답변 독립적으로 true 또는 false를 처리 할 수 ​​있는지 여부 Scope 요청 인터페이스 메소드가 처리 할 페이지를 리턴한다고 말하면'ExcludeScope'로 처리되지 않는 페이지를 반환하는 것은 모순됩니다. – Smutje

+0

예, 동의합니다. 이 경우 운영자 기반 접근 방식이 있어야합니까? 제외 연산자는 NOT 연산자와 마찬가지로 모든 페이지에서 OR 연산자를 사용합니까? – themanwhosoldtheworld

+0

컨트롤을 반전시킬 수도 있습니다. 예를 들어'QueryEngine'은 페이지가 처리되고'Scope'이'true' 또는'false'를 반환하면 각 페이지의 스코프를 묻습니다. 그러면 ExcludeScope 구현은 처리하지 않을 페이지 목록을 보유하고 처리해야합니다. – Smutje

답변

1

은 문제의 뿌리는이 문장에 있습니다. "이 제공하는 것보다 다른 쿼리의 모든 페이지를 말합니다 범위의 또 다른 유형이있다

범위 질의와 관련이 없으며 모든 요소의 하위 집합 만 나타내야합니다. 다른 방법으로 쿼리를 수행하려는 것 같습니다. QueryEngine

interface QueryEngine{ 
    void query(Scope scope){ 
    ... 
    } 
    void queryComplement(Scope scope) { 
    ... 
    } 
} 
+2

이것은 의미가 있습니다. 쿼리 메서드는 범위에서 수행 할 작업을 반영해야합니다. – themanwhosoldtheworld

+0

동의하는 경우 대답을 올바르게 표시 할 수 있습니까? – LuGo

1

하나의 가능성은 제어의 반전을 수행하는 경우 : QueryEngine 당신은`ExcludeScope`이 페이지를 반환하면

interface Scope { 
    boolean process(Page page); 
} 

interface QueryEngine { 
    void query(Scope scope, Set<Page> pages) { 
    Set<Pages> pagesToProcess = new HashSet<Page>(); 

    for (Page page : pages) { 
     if (scope.process(page)) { 
     pagesToProcess.add(page); 
     } 
    } 

    queryIn(pagesToProcess); 
    } 
} 

class IncludeScope implements Scope { 
    private static final Set<Page> INCLUDING_PAGES = ... 

    public boolean process(Page page) { 
    return INCLUDING_PAGES.contains(page); 
    } 
} 

class ExcludeScope implements Scope { 
    private static final Set<Page> EXCLUDING_PAGES = ... 

    public boolean process(Page page) { 
    return !EXCLUDING_PAGES.contains(page); 
    } 
} 
관련 문제