用于链接多行调用的Ruby约定

Dmy*_*iak 42 ruby coding-style ruby-on-rails

这有什么约定?

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

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 # ....
Run Code Online (Sandbox Code Playgroud)

那么在多行链接方法的约定是什么?我更喜欢哪一种?

注意:我无法从Ruby编码风格指南中找到一个很好的例子.

Boz*_*sov 51

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
    
    Run Code Online (Sandbox Code Playgroud)
  • (选项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
    
    Run Code Online (Sandbox Code Playgroud)

可以在这里找到关于两种替代风格的优点的讨论 .

  • @Bozhidar-Batsov,这个有 rubocop 设置吗? (2认同)

det*_*zed 32

在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}
Run Code Online (Sandbox Code Playgroud)

我认为,更具可读性.

  • 在ruby 1.8中,我认为你需要将点放在行的末尾,否则它将无法解析.因此,如果你的代码需要在ruby 1.8.x上运行,你需要把点放在最后...... (2认同)

Ror*_*ane 22

以下是四个选项的优缺点列表.其他答案中没有提到其中两个选项.

利弊可以分为独特的和共享的.共享专业人士是另一种选择的独特骗局的逆转.同样,共享缺点是另一个选项的独特专家的反转.对于其他两个选项和缺点,还有一些点是优点.

为了避免重复解释,我只用这一点的摘要来描述每个选项的共享优缺点.有关共享pro或con的完整详细信息,请参见其他选项的独特部分中的反向con或pro的说明.对于两个选项的优点和其他两个选项的优点,我任意选择将完整的解释放在以" .at line beginning"开头的集合中.

对于较短的列表,隐藏共享的优点和缺点而不是重复它们,请参阅此答案的旧版本.


. 在线端

items.get.lazy.
  take(10).
  force
Run Code Online (Sandbox Code Playgroud)

优点

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

缺点

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

. 在线开始

items.get.lazy
  .take(10)
  .force
Run Code Online (Sandbox Code Playgroud)

优点

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

缺点

独特:
  • 当您读取初始行时,表达式不会立即显示
    • 如果在代码库中使用它,那么当您读取一行时,必须始终检查该行,以确保它不会影响初始行的含义.
仅与其他一个选项共享:
  • 如果您#注释掉一个连续的行,或者在行之间添加注释,代码将默默地中断
  • 如果没有被误解,您无法将此代码粘贴到IRB/Pry中
  • Ruby 1.8及更低版本不支持

. 在行开头,缩进到前一个 .

items.get.lazy
         .take(10)
         .force
Run Code Online (Sandbox Code Playgroud)

优点

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

缺点

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

\在终点,.在下一行的开头

items.get.lazy \
  .take(10) \
  .force
Run Code Online (Sandbox Code Playgroud)

优点

仅与其他一个选项共享:
  • 可以自由地注释连续行,并且可以在行之间添加注释
  • 可以进入IRB/Pry
  • 在Ruby 1.8中受支持
与其他两个选项共享:
  • 当您阅读初始行时,很明显表达式仍在继续
  • 当他们自己看时,可以理解连续的线条
  • 大量水平空间用于连续线条
  • 不需要手动将字符对齐到列中
  • 以比例字体查看时看起来很好

缺点

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


ros*_*eld 10

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

  • 与交错注释行一样正确.如果能够做到这一点并且仍然使用点开始语法将会很棒. (2认同)