我有一个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
哪种方式更好?
答案 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 1
或condition 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