改善'案例' - '何时'表现

时间:2017-09-25 10:05:44

标签: ruby refactoring

我有一个case构造,有大约50个条件,每个条件具有不同的逻辑,不能合并在一起或重复使用。每次添加新案例时,构造都会变大。目前需要约150行代码。

case variable
when 'condition 1'
    some complicated logic for condition 1
when 'condition 2'
    some complicated logic for condition 2
...
when 'condition 50'
    some complicated logic for condition 50
end

有没有重构这段代码?我正在考虑两种方式:

  • 我创建一个常量数组来存储所有条件,并创建一个循环来检查variable。 (但我不能将逻辑应用于每个案例。)
  • 我将每个条件的逻辑放入不同的方法中。 (但它仍然很混乱,并且遍布很多行。)

    case variable
    when 'condition 1'
      condition_1(arg)
    when 'condition 2'
      condition_2(arg)
    ...
    when 'condition 50'
      condition_50(arg)
    end
    
    def condition_1(arg)
      some complicated logic for condition 1
    end
    
    def condition_2(arg)
      some complicated logic for condition 2
    end
    
    ...
    
    def condition_50(arg)
      some complicated logic for condition 50
    end
    

哪种方式更好?

1 个答案:

答案 0 :(得分:2)

我建议将逻辑移到一个模块并在那里定义每个case的方法,然后你可以在类中包含需要那些方法在case开关内的模块。

module MyModule
  def case_1(data)
    #process your data logic here
  end
  def case_2(data)
    #process your data logic here
  end
end

然后在你的班级里面做

class MyClass
  include MyModule

  def some_method(arg)
    case variable
    when 'condition 1'
    case_1(arg)
    when 'condition 2'
    case_2(arg)
  end


end

但是,如果要调用的方法的名称可以从一致的模式派生,例如condition 1condition 2那么您根本不需要这个案例,可以进行元编程可以根据参数调用方法名称。您可以使用define_method执行此操作。请参阅https://apidock.com/ruby/Module/define_method,您仍然可以在模块中执行此操作以保持逻辑。但是使用lambda调用方法

所以在你的课堂内

class MyClass
  include MyModule

  def some_method(arg)
    method_name = lambda  {|arg| meth = "case_#{arg}".to_sym}
    method_name.call(arg)
  end

end
相关问题