如果我必须使用除非/如果和块,代码可能会变得很长。这看起来一点也不好看,我的问题是如何处理这种情况,正确的格式是什么,例如在这种假设的情况下?
if some_array.each.all? {|argument| argument.method_one == @some_value} && another_array.method_two == @completely_different_value
#
#some stuff here
#
end
如果我必须使用除非/如果和块,代码可能会变得很长。这看起来一点也不好看,我的问题是如何处理这种情况,正确的格式是什么,例如在这种假设的情况下?
if some_array.each.all? {|argument| argument.method_one == @some_value} && another_array.method_two == @completely_different_value
#
#some stuff here
#
end
你可以把它分成几行。我认为这种格式更容易阅读
result1 = some_array.each.all? { |argument| argument.method_one == @some_value }
result2 = another_array.method_two == @completely_different_value
if result1 && result2
#
#some stuff here
#
end
我建议将部分提取到变量中
condition1 = some_array.each.all? do |argument|
argument.method_one == @some_value
end
condition2 = another_array.method_two == @completely_different_value
if condition1 && condition2
#
# some stuff here
#
end
或将条件变成方法
def condition1?(arr)
arr.some_array.each.all? do |argument|
argument.method_one == @some_value
end
end
def condition2?(arr)
arr.method_two == @completely_different_value
end
if condition1?(some_array) && condition2?(another_array)
#
# some stuff here
#
end
提取到方法中的优点是您的代码通常更容易测试。
有很多方法可以完成您的任务。
最常见的方法是在 shell 提示符下使用反斜杠:
if some_array.each.all? { |argument| \
argument.method_one == @some_value \
} \
&& another_array.method_two == @completely_different_value \
puts a
end
您也可以在 s 处静默换行dot
(点必须放在Ruby < 1.9的行尾或Ruby 1.9+ 的下一行的开头。)
"foo bar baz".
reverse.
split.
map(&:capitalize).
join ' '
# ⇒ "Zab Rab Oof"