有几种方法可以重构代码,具体取决于您对scoring_pointsand的假设experience_level。
例如,如果scoring_points是一个上限为 5 的数字,那么您可以说:
PASS = {
'beginner' => 5,
'expert' => 3,
}.freeze
def set_status(scoring_points)
return 'passed' if(!PASS[experience_level] || scoring_points >= PASS[experience_level])
increase_failed_attempts
'failed'
end
因为scoring_points == 5和scoring_points >= 5是等价的。
您可以通过调用删除!PASS[experience_level]支票,#to_i因为nil.to_i == 0:
PASS = {
'beginner' => 5,
'expert' => 3,
}.freeze
def set_status(scoring_points)
return 'passed' if(scoring_points >= PASS[experience_level].to_i)
increase_failed_attempts
'failed'
end
如果您知道这experience_level将始终是您案例中的三个值之一,那么您可以添加一个显式PASS条目'institutional'而不是#to_i调用:
PASS = {
'institutional' => 0,
'beginner' => 5,
'expert' => 3,
}.freeze
def set_status(scoring_points)
return 'passed' if(scoring_points >= PASS[experience_level])
increase_failed_attempts
'failed'
end
您还可以Kernel#then或多或少地为increase_failed_attempts调用提供自己的返回值:
PASS = {
'institutional' => 0,
'beginner' => 5,
'expert' => 3,
}.freeze
def set_status(scoring_points)
return 'passed' if(scoring_points >= PASS[experience_level])
increase_failed_attempts.then { 'failed' }
end
有了它,您可以更换防护装置:
PASS = {
'institutional' => 0,
'beginner' => 5,
'expert' => 3,
}.freeze
def set_status(scoring_points)
scoring_points >= PASS[experience_level] ? 'passed' : increase_failed_attempts.then { 'failed' }
end
我可能最终会选择第三或第四个选项。