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 コミュニティでは 2 つの一般的なスタイルがあり、どちらも優れていると見なされています。先頭.(オプション A) と末尾.(オプション B) です。

  • (オプション A)別の行で連鎖メソッド呼び出しを続行する場合.は、2 行目を保持します。

    # 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

以下は、4 つのオプションの長所と短所の完全なリストです。オプションのうちの 2 つは、他の回答では言及されていません。

長所と短所は、独自のものと共有のものに分けることができます。共通の長所は、別のオプションの独自の短所の逆です。同様に、共通の短所は、別のオプションの独自の長所の逆です。また、2 つのオプションには長所があり、他の 2 つのオプションには短所があります。

説明の繰り返しを避けるために、各オプションに共通する長所と短所を、その点の要約だけで説明します。共有された長所または短所に関する完全な詳細は、別のオプションの固有のセクションにある逆の短所または長所の説明で入手できます。2 つのオプションの長所と他の 2 つのオプションの短所については、完全な説明を "<code>. 行頭で」。

共通の長所と短所を繰り返すのではなく暗黙のままにする短いリストについては、この回答のこの古いバージョンを参照してください。


.行末に

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

長所

他の 1 つのオプションのみと 共有:
  • 連続する行は自由にコメントアウトでき、行間にコメントを追加できます
  • IRB/Pry に貼り付け可能
  • Ruby 1.8 でサポート
他の 2 つのオプションと共有:
  • 冒頭の行を読むと、表情が続いていることがよくわかります
  • 連続する行のための十分な水平スペース
  • 文字を列に手動で配置する必要はありません
  • プロポーショナル フォントで表示すると見栄えが良い
  • 句読点を最小限に抑え、タイピングと視覚的なノイズを減らします

短所

個性的:
  • 連続する行は、それ自体が奇妙に見えます。それらが継続であることを理解するには、前の行を読む必要があります。
    • インデントは、行が前の行から続くことを示す信頼できる指標ではありません。単にブロックの開始を意味するだけです。
他の 1 つのオプションのみと 共有:
  • コードを編集するとき、最後の行をコメントアウトしたり並べ替えたりするのが難しくなります

.行頭で

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

長所

他の 1 つのオプションのみと 共有:
  • .コードを編集するときは、最後の行をコメント アウトするか、順序を変更する方が簡単です。またはを削除して追加する必要はありません\
他の 2 つのオプションと共有:
  • 連続するセリフは単体で見ると理解できる
  • 連続する行のための十分な水平スペース
  • 文字を列に手動で配置する必要はありません
  • プロポーショナル フォントで表示すると見栄えが良い
  • 句読点を最小限に抑え、タイピングと視覚的なノイズを減らします

短所

個性的:
  • 最初の行を読んでも、式が続くかどうかすぐにはわかりません。
    • コードベースでこれを使用する場合、行を読み取るときは、最初の行の意味に影響を与えないように、常に次の行をチェックする必要があります。
他の 1 つのオプションのみと 共有:
  • #継続する行をコメントアウトするか、行間にコメントを追加すると、コードは警告なしで中断します
  • このコードを IRB/Pry に貼り付けることはできませんが、誤解されることはありません
  • Ruby 1.8 以下ではサポートされていません

.行頭で、前の行にインデント.

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

長所

他の 1 つのオプションのみと 共有:
  • .コードを編集するときは、最後の行をコメント アウトするか、順序を変更する方が簡単です。またはを削除して追加する必要はありません\
他の 2 つのオプションと共有:
  • 冒頭の行を読むと、表情が続いていることがよくわかります
  • 連続するセリフは単体で見ると理解できる
  • 句読点を最小限に抑え、タイピングと視覚的なノイズを減らします

短所

個性的:
  • 各行のコードは、より少ない水平スペースに収まる必要があります
  • .s を列 に手動で配置する必要があります
    • テキストを整列するためのエディター プラグインがあれば簡単ですが、デフォルトのインデント規則を使用するよりも作業が必要です。
    • あなたの編集設定に位置合わせ用のプラグインが含まれていても、同僚の設定には含まれていない場合があります。
  • プロポーショナル フォントで表示すると、コードがずれて見える
他の 1 つのオプションのみと 共有:
  • #継続する行をコメントアウトするか、行間にコメントを追加すると、コードは警告なしで中断します
  • このコードを IRB/Pry に貼り付けることはできませんが、誤解されることはありません
  • Ruby 1.8 以下ではサポートされていません
他の 2 つのオプションと共有:
  • コードを編集するとき、最後の行をコメントアウトしたり並べ替えたりするのが難しくなります

\行末、.次の行の先頭

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

長所

他の 1 つのオプションのみと 共有:
  • 連続する行は自由にコメントアウトでき、行間にコメントを追加できます
  • IRB/Pry に貼り付け可能
  • Ruby 1.8 でサポート
他の 2 つのオプションと共有:
  • 冒頭の行を読むと、表情が続いていることがよくわかります
  • 連続するセリフは単体で見ると理解できる
  • 連続する行のための十分な水平スペース
  • 文字を列に手動で配置する必要はありません
  • プロポーショナル フォントで表示すると見栄えが良い

短所

個性的:
  • より多くの入力が必要
  • より視覚的なノイズを作成します
他の 1 つのオプションのみと 共有:
  • コードを編集するとき、最後の行をコメントアウトしたり並べ替えたりするのが難しくなります
于 2015-04-07T02:34:44.210 に答える