使用适当的设计替换if / else特定顺序(基于if / else的规则/优先级)

时间:2014-06-23 12:04:41

标签: algorithm oop design-patterns data-structures

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

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 / elses系列是适用于最通用的最具体的标准 如果没有规则适用,则什么也不做 这有效,但顺序取决于if / elses,每当我想添加一个新规则时,我在" right"中添加一个新的if / else。位置。
所以这不是理想的解决方案。我想知道重构我的代码的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

你没有指定任何语言,所以我的答案主要与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); }
}

现在,这只是为了给你一个如何工作的例子,你可以决定一种不同的方式来存储优先级或者能够将参数传递给当前标准的东西。