2017-09-25 71 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