Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设计不在/排除查询行为_Java_Design Patterns_Solid Principles - Fatal编程技术网

Java 如何设计不在/排除查询行为

Java 如何设计不在/排除查询行为,java,design-patterns,solid-principles,Java,Design Patterns,Solid Principles,标题可能不太清楚,但我想不出更好的。问题就在这里。我有一个作用域接口,它提供了查询引擎应该查询的所有页面 interface Scope{ Set<Page> getPages(); } interface QueryEngine{ void query(Scope scope){ queryIn(scope.getPages()); } } 在这种情况下,我必须在QueryEngine中执行以下操作 interface QueryEngine{

标题可能不太清楚,但我想不出更好的。问题就在这里。我有一个作用域接口,它提供了查询引擎应该查询的所有页面

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

interface QueryEngine{
  void query(Scope scope){
     queryIn(scope.getPages());
  }
}
在这种情况下,我必须在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();
}
接口范围{
设置getPages();
布尔值应排除();
}
我觉得上述两种方法都会导致QueryEngine中的if,else条件 这意味着它不会因修改而关闭


如何设计这样的行为?在解决任何设计问题时,应该遵循什么方法?我们是否应该首先检查是否遵循了坚实的原则?我们是否应该根据设计模式对问题进行分类,从而得出解决方案?

在我看来,问题的根源在于这句话:

还有另一种类型的作用域,表示“查询除它提供的页面以外的所有页面”

范围与查询无关,它应该只表示所有元素的子集。您似乎希望以不同的方式执行查询,因此我建议在
QueryEngine
中使用新方法:

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

一种可能性是执行控制反转:
查询引擎询问
范围
是否处理页面,
范围
独立回答
,类似于

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);
  }
}
接口范围{
布尔过程(第页);
}
接口查询引擎{
无效查询(范围、设置页面){
Set pagesToProcess=new HashSet();
用于(第页:页){
if(范围、流程(第页)){
pagesToProcess.add(第页);
}
}
查询(页面处理);
}
}
类IncludeScope实现作用域{
私有静态最终集,包括_页面=。。。
公共布尔进程(第页){
返回,包括页面。包含(第页);
}
}
类ExcludeScope实现作用域{
私有静态最终集,不包括_页面=。。。
公共布尔进程(第页){
返回!不包括页面。包含(页面);
}
}

如果您的
ExcludeScope
返回了不应处理的页面,我会说您的接口契约被破坏了-如果您声明接口方法返回了要处理的页面,那么返回不应使用
ExcludeScope
处理的页面是矛盾的。是的,我同意。是否应该有操作员在这种情况下,基于操作的方法?如非用于排除的运算符,或所有页面中用于查询的运算符?您还可以反转控件-例如,
QueryEngine
为每个页面询问是否应处理页面,并且
scope
返回
true
false
-然后,您的
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);
  }
}