Kal*_*see 6 ruby statement-modifiers
我刚刚开始使用Ruby,并在RubyMine建议我更改此代码时发现语句修饰符:
if !VALID_DIRECTIONS.include?(direction)
raise ArgumentError, "Invalid direction"
end
Run Code Online (Sandbox Code Playgroud)
对此:
raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction)
Run Code Online (Sandbox Code Playgroud)
我喜欢它如何使代码更简洁.但是,我可以看到它乍一看可能具有误导性并强加可读性问题,因为它将效果置于条件之前.然后,也许那只是因为我已经习惯了C风格的语言.
有没有人因使用语句修饰符而遇到麻烦,或者你觉得他们已经改进了你的代码?此外,是否有人有使用修饰符的一般指导原则(即,对某些操作特别有效,或对其他操作无效)?
语句修饰符使ruby表现得更像英语,这很好:
我建议你使用看起来最自然,最优雅的形式.如有疑问,请以两种形式大声朗读声明.就个人而言,我倾向于只使用语句修饰语来进行简短的陈述,例如return :nope if input.nil?- 对于更长或更复杂的陈述,它可以让读者更长时间地掌握,因为眼睛只能覆盖一定的空间,所以有人只会阅读第二眼看到的修饰语.
我发现我通常可以毫不费力地阅读那些尾随条件(因为它们有时被称为),前提是仍然遵循其他代码可读性指南.在同一行上放置一个60个字符的表达式和一个40个字符的条件,你最终会得到一个100个字符的文本,这肯定是不可读的,完全独立于尾随条件的问题.
在您展示的特定代码示例中,非常明显的是必须有条件跟随.谁首先想要raise的话ArgumentError甚至没有看过这些论点?
此外,尾随条件类似于数学和函数语言中的guard子句,它们也倾向于在它们保护的表达式之后编写.
最后但并非最不重要的一点是,在方法的开头放置几个raise Bar if foo和return nil if quux表达式,作为一种防护,实际上被认为是好的风格,以简化方法的控制流程.还是那句话:因为这些都在方法的开始,这是一种明显的是,有有是一个条件,否则,return从方法的开头荷兰国际集团就没有意义.
PS:我实际上会在unless那里使用,以摆脱否定.在更复杂的条件下,我发现unless有时候很难解析,但在这种情况下,它更明显,至少恕我直言.