1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyプログラミングにおけるネーミングスタイルガイド

2022-02-12 19:37:13

英語での識別子の命名。

 # bad - identifier using non-ascii characters
  заплата = 1_000

  # bad - identifier is a Bulgarian word, written with Latin letters (instead of Cyrillic)
  zaplata = 1_000

  # good
  salary = 1_000



    変数とメソッドにsnake_case形式で名前を付けます。

 # bad
  :'some symbol'
  :someSymbol
  :someSymbol

  someVar = 5

  def someMethod
   ...
  end

  def SomeMethod
   ...
  end

  # good
  :some_symbol

  def some_method
   ...
  end



    スネークケース:句読点は削除され、スペースは単一のアンダースコアに置き換えられます。通常、文字は同じケース (UPPER_CASE_EMBEDDED _UNDERSCORE または lower_case_embedded_underscore) を共有しますが、ケースを混ぜることができます。

    クラスやモジュールの命名には、CamelCase 形式を使用します。(HTTPのように頭文字を省略した大文字の使用はそのままにしてください。
    RFC、XML)

# bad
  class Someclass
   ...
  end

  class Some_Class
   ...
  end

  class SomeXml
   ...
  end

  # good
  class SomeClass
   ...
  end

  class SomeXML
   ...
  end



    ファイル名はsnake_caseで、例えばhello_world.rbのようにします。

    各ソースファイルにはクラス/モジュールを1つだけ入れることを目指します。ファイル名はクラスやモジュールにちなんだものにしますが、CamelCaseをsnake_caseに置き換えます。

    定数の命名には SCREAMING_SNAKE_CASE を使用する。

  # bad
  SomeConst = 5

  # good
  SOME_CONST = 5



    判定を示すメソッド名の末尾にクエスチョンマーク(例:Array#empty? を付ける(メソッドはtrueかfalseを返す)。
    ブール値を返さないメソッドは、クエスチョンマークで終わらせてはいけません。

    潜在的にquot;dangerous"となりうるメソッド名(例:自己またはパラメータを変更するメソッド、exit! (終了完了アイテムのような exit ではない)など)、危険なメソッドの安全版がある場合は、感嘆符で終わらせるべきです。

 # bad - there is not matching 'safe' method
  class Person
   def update!
   end
  end

  # good
  class Person
   def update
   end
  end

  # good
  class Person
   def update!
   end

   def update
   end
  end



    可能であれば、危険なメソッド(bang)を元に、対応する安全なメソッド(non-bang)を定義してください。

  class Array
   def flatten_once!
    res = []

    each do |e|
     [*e].each { |f| res << f }
    end

    replace(res)
   end

   def flatten_once
    dup.flatten_once!
   end
  end



    ショートブロック内でreduceを使用する際の名前付きパラメータ|a、e|(アキュムレータ、エレメント)。

  #Combines all elements of the enum enumeration by applying a binary operation, specified by a block or a symbol that names a method or operator.
  #Sum some numbers
  (5..10).reduce(:+) #=> 45#reduce
  # Same using a block and inject
  (5..10).inject {|sum, n| sum + n } #=> 45 #inject inject
  # Multiply some numbers
  (5..10).reduce(1, :*) #=> 151200
  # Same using a block
  (5..10).inject(1) {|product, n| product * n } #=> 151200



    二項演算子を定義するときは、引数の名前を other にします(<< と [] は意味合いが異なるので例外です)。

  def +(other)
   # body omitted
  end



    map は collect よりも、find は detect よりも、select は find_all よりも、reduce は object よりも、size は length よりも優先されます。韻を踏んだメソッド名(collect, detect, objectなど)はSmallTalk言語から受け継いだもので、他の言語ではあまり一般的ではありません。find_allの代わりにselectを使うことは推奨されます。selectはrejectとうまく連動し、その名前は非常にわかりやすいからです。

    count を size の代わりに使わないでください。Array for Enumerable 以外のオブジェクトは、コレクション全体を反復して
    はそのサイズを決定します。

  # bad
  some_hash.count

  # good
  some_hash.size



    map + flatten の組み合わせではなく、flat_map を使用することを推奨します。
    これは、2より深い配列には適用されません。例えば users.first.songs == ['a', ['b', 'c']] の場合、flat_map の代わりに map + flatten の組合せを使用します。
    flat_map は配列を一段階平坦化しますが、flatten は配列全体を平坦化します。

  # bad
  all_songs = users.map(&:songs).flatten.uniq

  # good
  all_songs = users.flat_map(&:songs).uniq



    reverse.eachの代わりにreverse_eachを使用します。reverse_eachは新しい配列を割り当てないため、良いことです。

  # bad
  array.reverse.each { ... }

  # good
  array.reverse_each { ... }