Ruby on rails Ruby:编写嵌套if条件的更具可读性的方法?

Ruby on rails Ruby:编写嵌套if条件的更具可读性的方法?,ruby-on-rails,ruby,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.trac

在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方式”的编写方法,以便其他开发人员更容易阅读。

我倾向于这样写:

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
def get_question
  self.trackable.respond_to?(:question) ? self.trackable.question : nil
end
这是一个非常好的习惯用法,但我不知道它是否符合Ruby习惯用法。是的,在结尾有一个不必要的
返回
,但我喜欢对称性,以及它如何使所有东西在视觉上排列整齐

在现实生活中,我可能想用
self.trackable
上的
question
方法替换所有逻辑。然后每件事都可以实现
问题
(或者
到_-question
得到_-question
,或者在更广泛的上下文中最有意义的任何名称):

其他可能的
self.trackable
事物也是如此。这将使您的
get\u问题看起来像这样:

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
def get_question
  self.trackable.respond_to?(:question) ? self.trackable.question : nil
end

或者,如果你知道
self.trackable
也会回答
问题,那么你可以完全取消
get\u question
,因为我在下半场给你+1,因为我也会这样做。
返回。。。如果…
格式在本例中不容易遵循,但我想它可以突出说明OP需要按照您建议的方式进行重构。我非常喜欢
响应
的想法。太棒了@KenY-N:是的,我同意这种格式在这种情况下有点强制,如果a&&b&&c…
构造展开
时效果会更好。你可以而且应该删除所有
self
s。@sawa:是的,你可以,但如果你把它们放在里面,我发现代码可读性会更好。