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