3

我有这个嵌套的 if 语句,我不知道如何重构它......它非常简单,但我无法得到正确的想法,希望有人能提供帮助。

首先我有一个嵌套的 if 语句(坏):

unless record.valid?
  if condition_1
    action_1
  elsif condition_2
    action_2
  elsif condition_3
    action_3
  end
end

然后我尝试了这个,但这看起来并没有更好(没有任何内容的if语句也很糟糕):

if record.valid?
  # do nothing
elsif condition_1
  action_1
elsif condition_2
  action_2
elsif condition_3
  action_3
end

有没有人知道如何重构这些语句以使其看起来更好?

更新:解决方案(基于@thomasfedb 和@undur_gongor)

我最终做的只是:

return if record.valid?

if condition_1
  action_1
elsif condition_2
  action_2
elsif condition_3
  action_3
end
4

3 回答 3

7

如果您利用 Ruby 的各种if/unless语法和case语句,您可能会发现它更简洁。如果您要包装是一种方法,您也可以利用return.

def check_record(record)
  return unless record.valid?

  case record.some_property
  when 1
    do_something
  when 2
    do_whatever
  when 3
    do_a_dance
  end
end
于 2013-06-20T11:20:51.373 回答
6
Mapping = { :has_value_1? => :method_1, 
            :has_value_2? => :method_2, 
            :has_value_3? => :method_3 }

unless record.valid?
  Mapping.each_pair do | k, v | 
    next unless record.send(k)
    record.send(v)
    break
  end
end

请注意,在非常旧的 Ruby 版本(1.9 之前)中,哈希没有排序。在这种情况下,如果属性的顺序很重要,您需要一组对。其余代码将几乎相同。

更新问题后(并基于thomasfedb 的建议):

def check_record(record)
  return unless record.valid?

  return action_1 if condition_1
  return action_2 if condition_2
  return action_3 if condition_3

  nil
end
于 2013-06-20T11:18:09.290 回答
1

我会将所有这些东西隐藏在一个对象中。不要让客户,尤其是你自己,一次又一次地重复这一点。写一次。调用一种方法并将所有关于该做什么的决定放在其中,对客户隐藏它。用户不必检查状态来决定要求对象做什么。将所有这些封装在对象本身内。

于 2013-06-20T11:15:43.230 回答