正确使用Ruby语句修饰符
我刚刚开始使用Ruby,并在RubyMine建议我更改此代码时发现语句修饰符:
if !VALID_DIRECTIONS.include?(direction) raise ArgumentError, "Invalid direction" end
对此:
raise ArgumentError, "Invalid direction" if !VALID_DIRECTIONS.include?(direction)
我喜欢它如何使代码更简洁。 但是,我可以看到它乍一看可能具有误导性并强加可读性问题,因为它将效果置于条件之前。 然后,也许那只是因为我已经习惯了C风格的语言。
有没有人因使用语句修饰符而遇到麻烦,或者你觉得他们改进了你的代码? 此外,是否有人有使用修饰符的一般指导原则(即,对某些操作特别有效,或者对其他操作无效)?
我发现我通常可以毫不费力地阅读那些尾随条件(因为它们有时被称为),前提是仍然遵循其他代码可读性指南。 在同一行上放置一个60个字符的表达式和一个40个字符的条件,你最终会得到一个100个字符的文本,这肯定是不可读的,完全独立于尾随条件的问题。
在您显示的特定代码示例中,非常明显的是必须有条件跟随。 谁想要在没有先查看ArgumentError
情况下raise
ArgumentError
?
此外,尾随条件类似于数学和函数语言中的guard子句,它们也倾向于在它们保护的表达式之后写入。
最后但并非最不重要的是, raise Bar if foo
并且在方法开头的return nil if quux
表达式(作为一种防护)实际上被认为是好的样式,那么为了简化方法的控制流程,放置几个raise Bar if foo
并return nil if quux
。 再说一遍:因为这些都是在方法的开头,很明显必须有一个条件,否则从方法的开头return
是没有意义的。
PS:我实际上会使用unless
那里,以摆脱否定。 在更复杂的条件下,我发现unless
有时难以解析,但在这种情况下,它更明显,至少恕我直言。
语句修饰符使ruby表现得更像英语,这很好:
- 如果下雨,待在家里
- 如果下雨就呆在家里
我建议你使用看起来最自然,最优雅的forms。 如有疑问,请以两种forms大声朗读声明。 就个人而言,我倾向于只使用语句修饰符来表示简短的语句,例如return :nope if input.nil?
– 对于更长或更复杂的陈述,它可以让读者更长时间地掌握,因为眼睛仅覆盖一定量的空间,因此有人只会在第二眼看到修改器。
起初对我来说有点奇怪,但我不认为它会带来可读性问题。 在Ruby中工作很多时,它非常有意义。 只有当我与其他语言来回切换时,它才会引人注目。 但是,当您沉浸在Ruby代码中时,您会发现它是一种简洁明了的编写一行条件的方法。 此外,习惯使用unless
。 你的代码行可能(也许应该)写成:
raise ArgumentError, "Invalid direction" unless VALID_DIRECTIONS.include?(direction)
这是一种纯粹主观的风格问题。 使用你觉得舒服的任何东西。