Ruby约定用于链接多行的调用
这是什么约定?
我使用以下风格,但不确定是否是首选,因为如果我错过了最后一点,我可能会遇到很多问题,而没有意识到这一点。
query = reservations_scope.for_company(current_company).joins{property.development}. group{property.development.id}. group{property.development.name}. group{property.number}. group{created_at}. group{price}. group{reservation_path}. group{company_id}. group{user_id}. group{fee_paid_date}. group{contract_exchanged_date}. group{deposit_paid_date}. group{cancelled_date}. select_with_reserving_agent_name_for(current_company, [ "developments.id as dev_id", "developments.name as dev_name", "properties.number as prop_number", "reservations.created_at", "reservations.price", "reservations.fee_paid_date", "reservations.contract_exchanged_date", "reservations.deposit_paid_date", "reservations.cancelled_date" ]).reorder("developments.name") query.to_a # ....
那么链接 多行的方法是什么呢?我更喜欢哪一个呢?
注 :我无法从Ruby编码风格指南中find一个很好的例子。
在Ruby风格指南中实际上有一个部分:
采用一致的多行方式链接风格。 Ruby社区有两种stream行的风格,这两种风格都被认为是领先的
.
(选项A)和尾随.
(选项B)。
(选项A)当在另一行上继续链式方法调用时,请保持
.
在第二行。# bad - need to consult first line to understand second line one.two.three. four # good - it's immediately clear what's going on the second line one.two.three .four
(选项B)当在另一行上继续链接方法调用时,请包含
.
在第一行,表示该expression方式继续。# bad - need to read ahead to the second line to know that the chain continues one.two.three .four # good - it's immediately clear that the expression continues beyond the first line one.two.three. four
在这里可以find关于这两种替代风格的优点的讨论。
在Ruby 1.9+中可以这样写:
query = reservations_scope .for_company(current_company) .joins{property.development} .group{property.development.id} .group{property.development.name} .group{property.number} .group{created_at} .group{price} .group{reservation_path} .group{company_id} .group{user_id}
我想,可读性更强。
这里有四个选项的利弊完整列表 。 有两个选项在其他答案中没有提到。
.
在行结束
items.get.lazy. take(10). force
独特的优点:
(没有 – 所有的专业人员与另一个选项共享)
独特的缺点:
- 持续的线路本身看起来很奇怪。 你必须阅读前面的一行才能理解这是一个延续。
- 缩进不是一个可靠的指标,线路从前一行继续 – 它可能仅仅意味着一个块的开始。
.
在行首
items.get.lazy .take(10) .force
独特的优点:
- 编辑代码时,更改最后一行的顺序更容易 – 无需删除和添加
.
或\
。
独特的缺点:
- 当你读到最初的一行时,expression还在继续
- 如果你在你的代码库中使用它,那么当你阅读一行代码时,你必须经常检查这一行,以确保它不影响最初的代码行。
- 如果你注释掉一个连续的行,或者在行之间添加一个注释,那么代码会默默地破坏
- 您不能将此代码粘贴到IRB / Pry中,而不会被误解
- 在Ruby 1.8及以下版本中不支持
变体: .
在行首,缩进到前面.
items.get.lazy .take(10) .force
优点,相对于“ .
在行首“:
- 当你读到第一行时,现在立即清楚expression式继续
缺点,相对于“ .
在行首“:
- 每行代码必须适合较less的横向空间
- 需要手动alignment
.
小号- 如果您有用于alignment文本的编辑器插件,则更容易,但仍比使用默认缩进规则更有效。
- 即使您的编辑设置包含一个用于alignment的插件,您的同事的设置可能不会。
- 用比例字体查看时,代码看起来没有alignment
在线结束.
在下一行的开始
items.get.lazy \ .take(10) \ .force
独特的优点:
(没有 – 所有的专业人员与另一个选项共享)
独特的缺点:
- 需要更多的打字
- 创造更多的视觉噪音
之所以select该行的最后一个点是因为它允许您将代码粘贴到IRB会话中。 另外,如果在行首使用点,则不能在多行代码中间注释行。 这里有一个很好的讨论: https : //github.com/bbatsov/ruby-style-guide/pull/176