如何写出复杂的条件

时间:2013-04-08 15:48:19

标签: ruby coding-style conditional-statements

当你有一个简单的条件和可能复杂的身体时,条件结构很容易写:

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

在这种情况下,有没有好的方法来写它?

4 个答案:

答案 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

我非常感谢您的想法,随时发表评论!