重构具有多个'和#39;的if语句。和'或#39;声明

时间:2014-04-16 12:30:33

标签: ruby ruby-on-rails-4 ruby-on-rails-3.2 refactoring

在ruby中重构这些代码的最佳方法是什么?

 def check(message_type)
    if (message_type == 'reminder' and self.copy_reminder == true) or
            (message_type == 'rrm' and self.is_rrm == true and self.copy_rrm == true) or
            (message_type == 'alert' and self.is_rrm == true and self.copy_alert == true) or
            (message_type == 'reply' and self.is_rrm == true and self.copy_user_response == true)
          call_some_method
end

1 个答案:

答案 0 :(得分:3)

请勿在布尔条件下使用andor,请使用&&||andor用于控制流程。阅读属性时不要使用self.,您根本不需要它。不要检查这样的布尔值some_thing == truesome_thing 是否足够

我更喜欢将复杂的条件转移到私有方法中。这使得实际的方法更具可读性。

  def check(message_type)
    call_some_method if valid_message_type?(message_type)
  end

private

  def valid_message_type?(message_type)
    case message_type
    when 'reminder' then copy_reminder
    when 'rrm'      then is_rrm && copy_rrm
    when 'alert'    then is_rrm && copy_alert
    when 'reply'    then is_rrm && copy_user_response
    end
  end