【问题标题】:Replace if/else on certain order with a proper design (rule/priority based if/else)用适当的设计替换特定顺序的 if/else(基于规则/优先级的 if/else)
【发布时间】:2014-06-23 12:04:40
【问题描述】:

我有一个基于规则实现逻辑的类方法。结构如下:

sub process {  
   # declarations etc    
   # other code     
   # core logic:    
   if($conditions->{size} == $item_size) {  
     #do something here as it matches the rule based on size
     return $result;  
     }  

     if($conditions->{area} == $item_area_dispatch) {  
      #do something that matches the area criteria
      return $result;  
      }   

      if($conditions->{country} == $item_country) {  
      #do something that matches the country criteria   
      return $result;
     }    
}    

基本上有一系列 if/else 语句来验证某些条件是否适用并执行相应的逻辑。
从上到下的 if/else 系列是适用的最通用的最具体的标准 如果没有适用的规则,则什么也不做。
这可行,但顺序取决于 if/else,每当我想添加新规则时,我都会在“正确”位置添加新的 if/else。
所以这不是理想的解决方案。我想知道为此重构我的代码的最佳方法是什么?

【问题讨论】:

标签: algorithm oop design-patterns data-structures


【解决方案1】:

您没有指定任何语言,所以我的回答主要与 C++/Java 相关,但我想所有其他 oop 语言都应该提供相同的功能。您应该将您的标准封装在一个对象中。比如:

enum Priority {
  HIGHEST = 0,
  HIGHER = 1,
  ...
  LOWEST = 9
}

class Criterion {
  public final Priority priority;

  public abstract boolean evaluate(YourObject object);

  Criterion(Priority priority) { this.priority = priority; }
}

class SearchCriteria {
  List<Criterion>[] criteria = new ArrayList<Criterion>[10];

  void addCriterion(Criterion criterion) {
    criteria[criterion.priority].add(criterion;
  }

  boolean evaluate(YourObject object) {
    for (List<Criterion> list : criteria)
      for (Criterion c : list)
        if (c.evaluate(object))
          return true;

    return false;
  }
}

class CountryCriterion extends Criterion {
  public final Country country;
  CountryCriterion(Country country) { super(Priority.HIGHER); this.country = country; }

  boolean evaluate(YourObject object) { return object.country.equals(country); }
}

现在,这只是为您提供一个示例,说明这可能如何工作,您可以决定以不同的方式存储优先级或能够将参数传递给当前标准的方式。

【讨论】:

  • +1 我想到了类似的东西,但懒得写下来。可能会使Criterion 与Priority 进行比较,并将它们放入有序列表或优先队列中。
猜你喜欢
  • 2017-08-03
  • 2014-04-13
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多