Ruby

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を指定する