Ruby:如果条件更有可读的嵌套方式?

时间:2014-01-07 03:38:28

标签: ruby-on-rails ruby

Ruby(或使用Rails模型助手)是否有更易读的方式来编写以下内容:

def get_question
    if self.is_question?
        self.trackable
    elsif self.is_answer?
        self.trackable.question
    elsif self.is_comment?
        if self.trackable.is_question?
            self.trackable.commentable
        elsif self.trackable.is_answer?
            self.trackable.commentable.question
        end
    end
end

必须有更多的" Ruby方式"写这篇文章对其他开发者来说更​​容易阅读。

1 个答案:

答案 0 :(得分:3)

我倾向于写这样的事情:

def get_question
  return self.trackable                      if  self.is_question? 
  return self.trackable.question             if  self.is_answer? 
  return nil                                 if !self.is_comment? 
  return self.trackable.commentable          if  self.trackable.is_question? 
  return self.trackable.commentable.question if  self.trackable.is_answer? 
  return nil
end

这非常有用,但我不知道它是否有资格作为Ruby-idiomatic。是的,最后有一个不必要的return,但我喜欢它的对称性,以及它如何使视觉上的一切排列。

在现实生活中,我可能希望用question上的self.trackable方法替换所有逻辑。然后,每件事都可以实现question(或to_questionget_question,或在更广泛的背景下最有意义的任何名称):

# Inside questions...
def question
  self
end

# Inside answers...
# Nothing special needed, we've already got one.

以及其他可能的self.trackable事情。这会让你的get_question看起来像这样:

def get_question
  self.trackable.respond_to?(:question) ? self.trackable.question : nil
end

如果您知道get_question也会回复self.trackable,则您可以完全取消question