Edited at

Rubyコーディング規約

More than 3 years have passed since last update.

規約に限らず自分でコーディングする際に気を付けていることです.


事前準備: チュートリアル


ブランチ管理


コーディング規約


  • 基本的にCookpadのRuby コーディング規準に準拠します


    • ただしHashの空白囲みはしません



  • 不要なselfは記述しません

  • 不要なreturnは記述しません

  • 不要なバックスラッシュは記述しません

  • ファイルの末尾は改行1個で終わらせます

  • 委譲の際はForwardableを利用します

  • 変数名、メソッド名ではどのような場合でも省略形を使いません

  • 一般的な法則に準拠します


    • SOLID


      • SRP: Single Responsibility Principal

      • OCP: Open Closed Principal

      • LSP: Liskov Substitution Principle

      • ISP : Interface Segregation Principle

      • DIP : Dependency Inversion Principle



    • デメテルの法則(最小知識の法則)

    • 驚き最小の原則

    • ボーイスカウトの規則

    • YAGNI: You ain't gonna need it

    • DRY: Don't Repeat Yourself

    • KISS: Keep it simple, stupid




RSpec



  • Better Specs に従います


  • Shared Contextをうまく利用します

  • Ajaxのテストではコントローラテストでxhrメソッドを利用します

  • FactoryGirlではDB saveが不要な場合はbuildを使います


  • shoulda-matchersを積極的に利用します

  • Cucumberは記述コストが高いので使いません. 代わりにカスタムマッチャをうまく利用します. http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#sec-cucumber

  • Sexy Validationを利用します

  • カスタムマッチャを適切に利用する

  • privateなメソッドのテストは書かない


    • テストが必要ならクラスを分けてpublicにする




Module


  • ヘルパーモジュールの場合は-ableという名前にします


Rails


  • 規約通りの設定は省略する


MySQL


  • テンポラリテーブルは'CREATE TEMPORARY TABLE'で作成する

  • 特に理由がなければCREATE TABLEでCHARSETとCOLLATEは設定しない

  • インデックス


    • カーディナリティを考慮

    • カバリングインデックスを考慮




Model



  • スキーマ定義


    • 外部キーにはintegerではなくreferencesを利用します


    • null: falseでnot null制約を設定します

    • 1カラムのインデックスはindex: trueで設定します

    • 1行文字列はstring型に, 複数行文字列はtext型にします

    • natural keyにはadd_index :items, [:key1, :key2], unique: trueでUNIQUE制約を設定します



  • 階層化する場合はtable_name_prefixメソッドを定義する


  • パラメタの変数名はモデルではattributes、コントローラではparamsと名付けする



SQL



  • INSERT INTO table(c1, c2)でカラムを省略しない


View



  • render model, render modelsでの_modelパーシャル呼び出しを積極的に利用します


Controller


Locale


  • エラーメッセージの末尾には句点(。)をつける

  • ネストした設定はネスト先のモデルでまとめて設定する


フォーム


  • collection_check_boxにはappend_hiddenオプションを設定

  • 「〜」「未満、以下、以上」はどちらかに揃えます

  • placeholderは積極的に設定します

  • ラジオボタンにはラベルを設定します

label

= f.radio_button :blood_type, :a, checked: f.object.blood_type
| A型


  • 入力不備のアラートは空の場合には基本的に出しません

  • 未選択状態の場合は「▼項目名」のように選択肢と異なることがわかるようにします

  • 必須項目には必須マークを表示します


ワークフロー


  • チケットへのコメントの際は前のコメントを再確認します


プルリクエスト


  • プルリクエスト作成前に各コミットを自分でレビューします


Github


  • インデントの差分確認ではw=1を指定する