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方式"写这篇文章对其他开发者来说更容易阅读。
答案 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_question
,get_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
。