46

对此有何约定?

我使用以下样式,但不确定它是否是首选样式,因为如果我最后错过了一个点,我可能会在没有意识到的情况下遇到很多问题。

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 编码风格指南中找到一个好的示例。

4

4 回答 4

60

Ruby 风格指南中实际上有一个部分:

采用一致的多行方法链接样式。Ruby 社区有两种流行的样式,它们都被认为是好的——前导.(选项 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)在另一行继续链式方法调用时,.在第一行包含 以指示表达式继续。

    # 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
    

可以在 此处找到关于两种替代样式优点的讨论。

于 2013-05-27T09:37:13.060 回答
35

在 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}

我认为更具可读性。

于 2012-10-16T00:55:37.513 回答
28

这是四个选项的利弊的完整列表。在任何其他答案中都没有提到其中的两个选项。

优点和缺点可以分为独特的和共享的。共享的优点是另一种选择的独特缺点的反面。同样,共同的缺点是另一种选择的独特优点的反面。还有一些观点对两个选项有利,对另外两个选项不利。

为避免重复解释,我仅对这一点进行总结来描述每个选项的共同优点和缺点。有关共享的赞成或反对的完整详细信息,请参阅另一个选项的独特部分中的反向反对或赞成的描述。对于两个选项的优点和另外两个选项的优点,我随意选择将完整的解释放在以“<code>开头的集合中。在行首”。

有关将共享的利弊隐含而不是重复它们的较短列表,请参阅此答案的旧版本


.在行尾

items.get.lazy.
  take(10).
  force

优点

仅与一个其他选项 共享:
  • 续行可自由注释,行间可加注释
  • 可粘贴到 IRB/Pry 中
  • 在 Ruby 1.8 中受支持
与其他两个选项共享:
  • 当您阅读初始行时,很明显表达式仍在继续
  • 有足够的水平空间用于连续线条
  • 不需要手动将字符对齐到列中
  • 以比例字体查看时看起来不错
  • 使用最少的标点符号,减少打字和视觉噪音

缺点

独特:
  • 连续的线条本身看起来很奇怪。您必须阅读前一行以了解它们是延续。
    • 缩进不是一行从前一行延续的可靠指标——它可能仅仅意味着一个块的开始。
仅与一个其他选项 共享:
  • 编辑代码时,很难注释掉或重新排序最后一行

.在行首

items.get.lazy
  .take(10)
  .force

优点

仅与一个其他选项 共享:
  • 编辑代码时,更容易注释掉或更改最后一行的顺序——无需删除和添加.or \
与其他两个选项共享:
  • 连续线单独看时可以理解
  • 有足够的水平空间用于连续线条
  • 不需要手动将字符对齐到列中
  • 以比例字体查看时看起来不错
  • 使用最少的标点符号,减少打字和视觉噪音

缺点

独特:
  • 当您阅读第一行时,并不清楚表达式是否继续
    • 如果您在代码库中使用它,那么当您阅读一行时,您必须始终检查后面的行以确保它不会影响初始行的含义。
仅与一个其他选项 共享:
  • 如果您#注释掉连续的行,或在行之间添加注释,代码会静默中断
  • 您无法将此代码粘贴到 IRB/Pry 中而不会被误解
  • Ruby 1.8 及更低版本不支持

.在行首,缩进到上一行.

items.get.lazy
         .take(10)
         .force

优点

仅与一个其他选项 共享:
  • 编辑代码时,更容易注释掉或更改最后一行的顺序——无需删除和添加.or \
与其他两个选项共享:
  • 当您阅读初始行时,很明显表达式仍在继续
  • 连续线单独看时可以理解
  • 使用最少的标点符号,减少打字和视觉噪音

缺点

独特:
  • 每行的代码必须适合更少的水平空间
  • 需要手动将 s 对齐.到列 中
    • 如果您有一个用于对齐文本的编辑器插件会更容易,但仍然比使用默认缩进规则更多工作。
    • 即使您的编辑设置包含对齐插件,您同事的设置也可能不包含。
  • 以比例字体查看时,代码看起来会错位
仅与一个其他选项 共享:
  • 如果您#注释掉连续的行,或在行之间添加注释,代码会静默中断
  • 您无法将此代码粘贴到 IRB/Pry 中而不会被误解
  • Ruby 1.8 及更低版本不支持
与其他两个选项共享:
  • 编辑代码时,很难注释掉或重新排序最后一行

\在行尾,.在下一行的开头

items.get.lazy \
  .take(10) \
  .force

优点

仅与一个其他选项 共享:
  • 续行可自由注释,行间可加注释
  • 可粘贴到 IRB/Pry 中
  • 在 Ruby 1.8 中受支持
与其他两个选项共享:
  • 当您阅读初始行时,很明显表达式仍在继续
  • 连续线单独看时可以理解
  • 有足够的水平空间用于连续线条
  • 不需要手动将字符对齐到列中
  • 以比例字体查看时看起来不错

缺点

独特:
  • 需要更多打字
  • 产生更多视觉噪音
仅与一个其他选项 共享:
  • 编辑代码时,很难注释掉或重新排序最后一行
于 2015-04-07T02:34:44.210 回答
12

我在行尾选择点的原因是它允许您将代码粘贴到 IRB 会话中。此外,如果在行首使用点,则不能在多行代码中间注释行。这是一个很好的讨论:https ://github.com/bbatsov/ruby-style-guide/pull/176

于 2014-08-08T12:41:06.767 回答