2017-09-25 31 views
0

我有一个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

看一看这样的:https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html – Niklas

+0

感谢,有趣的,我不知道关于这些重构方法 – BraveVN

回答

2

我会建议将逻辑移动到一个模块并在那里定义每个案例的方法,然后您可以将该模块包含在需要这些方法的案例开关中。

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 
+1

好主意,谢谢。它仍然有很多行,但它不错 – BraveVN

+0

看到我更新的答案,如果它可能适用:) – lacostenycoder

+1

我明白,使用元编程在我的情况会有点棘手,但我会尝试。谢谢 – BraveVN