当你有一个简单的条件和可能复杂的身体时,条件结构很容易写:
if simple_condition_expressed_in_one_liner
complicated_body_that_may_be_long
complicated_body_that_may_be_long
complicated_body_that_may_be_long
end
但有时,你有一个复杂的条件和一个像这样简单的身体:
if condition1 and
condition2 and
condition3 and
some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line
simple_body
end
在这种情况下,有没有好的方法来写它?
答案 0 :(得分:5)
我总是试图重构为较小的描述性方法。
使用您的示例,而不是:
until (print "Username : "; gets.chomp == "user") and
(print "Password : "; gets.chomp == "pa$$word")
puts "Error, incorrect details"
end
我会用:
def correct_user
print "Username : "
gets.chomp == "user"
end
def correct_password
print "Password : "
gets.chomp == "pa$$word"
end
until correct_user and correct_password
puts "Error, incorrect details"
end
答案 1 :(得分:2)
我个人将整个条件语句放入一个单独的方法中。这可能听起来很像已经建议的但我将整个事情放入方法而不是分解它。
simple_body if complicated_condition
def complicated_condition
condition1 and
condition2 and
condition3 and
some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line
end
我可能会也可能不会将条件分解为更多方法,具体取决于条件是什么以及我最后是否会最终使用这些方法(太多用于一个目的的方法开始变成代码气味)。
它使代码可读(我可以浏览代码并查看它正在做什么)并且可维护(如果需要,我可以改变条件,我确切地知道它在哪里)。
如果我把它放到课堂上,我会把方法放在private
下,因为'外部'没有理由需要使用它。
修改强>
如果条件在条件中使用时需要变量的值,则可以考虑将binding
传递给方法。
opt = :mysql
simple_body if complicated_condition(binding)
opt = :oracle
simple_body if complicated_condition(binding)
def complicated_condition(b)
condition1 and
condition2 and
condition3 and
some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
eval('opt', b) == :mysql
end
答案 2 :(得分:1)
您应该考虑将其拆分为单独的方法。 在阅读代码时,很难在心理上映射条件:
if(condition1 and condition2 and ...)
与
if(isValidCondition())..
答案 3 :(得分:0)
complex_condition
方法调用时,Early returns可能是候选人。
simple_body if complex_condition
def complex_condition
condition1 or return # or return unless condition1
condition2 or return
condition3 or return
condition4 or return
condition5
end
def condition4
some_more_complicated_condition_that_cannot_be_written_on_a_single_line
end
def condition5
still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line
end
我非常感谢您的想法,随时发表评论!