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

时间:2012-10-16 00:48:23

标签: ruby-on-rails ruby coding-style

这有什么约定?

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

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 coding style guide的好例子。

4 个答案:

答案 0 :(得分:50)

Ruby style guide中实际上有一节介绍:

  

采用一致的多行方式链式。那里有两个   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
    
  •   
     

可以找到关于两种替代风格的优点的讨论   here

答案 1 :(得分: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}

我认为更具可读性。

答案 2 :(得分:22)

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

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

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

对于较短的列表,隐含共享的优点和缺点而不是重复它们,请参阅此答案的this old version


.在第一行

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

赞成

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

缺点

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

.在第一行开头

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

赞成

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

缺点

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

第一行

.,缩进到上一个.

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

赞成

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

缺点

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

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

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

赞成

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

缺点

独特:
  • 需要更多输入
  • 创造更多视觉噪音
共享只有一个其他选项:
  • 编辑代码时,更难注释掉或重新排序最后一行

答案 3 :(得分:10)

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