sea side she side

写真と山、資格が好きなアラフォーエンジニアのブログ

Rubyコーディング規約

      2011/03/15

主に自分へのメモ。

shugo.netさんのに一部自分のスタイルを追加したもの。

ソースコードの整形

インデント

プログラムを読みやすくするため、インデントを適宜行う。インデント幅は2とする。また、インデントにはスペースのみを使用し、タブは使用しない(環境によりタブ幅が異なるため)。

桁数

一行の桁数は最大80桁までとする。

空行

複数のクラスの区切りには空行を挿入する。

class Foo
...
end
class Bar
...
end

また、クラス内の各構成要素の区切りにも空行を挿入する。ただし、最初の構成要素の前や、最後の構成要素の後には空行は挿入しない。

class Foo
attr :bar
def baz
...
end
def quux
...
end
end
コメント

メソッド定義の中にはコメントは記述しない(コメントが必要だと思われるようなコードにはリファクタリングを行う)。ただし、クラス・モジュールやパブリックなメソッドには仕様をRDocスタイルで記述する。また、コメント記号のあとにはスペースを一ついれる。

# コンマ区切の文字列+str+を分割し、結果を配列にして返す。
def split_csv(str)
return str.split(/,/)
end
セミコロン

文末の「;」(せみころん) は省略する。

命名規約

全般
  1. 原則として、単語の省略は行わない。
  2. スコープが狭いループ変数には、i, j, kという名前をこの順序で使 用する。
  3. スコープが狭い変数名には、クラス名を省略したものを使用してよい。 (例: eo = ExampleObject.new)
クラス・モジュール名

クラス・モジュール名は、各単語の一文字目を大文字にし、`_'などの区切文字は使用しない。ただし、HTTPなどの略語の場合はすべて大文字のままとする。

ExampleClass
HTTPClient
メソッド名

メソッド名は、すべて小文字とし、単語の区切りに`_'を用いる。メソッド名には動詞の原形を使用する。

add_something

真偽値を返すメソッド名は、動詞または形容詞に`?'を付け、形容詞に `is_'は付けない。

visible?

また、破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、破壊的なメソッドには`!'を付ける。

split
split! # splitの破壊的バージョン
定数名

クラス・モジュール名以外の定数名は、すべて大文字とし、単語の区切りに`_'を用いる。

EXAMPLE_CONSTANT
変数名

変数名は、すべて小文字とし、単語の区切りに`_'を用いる。

tmp
local_variable
@instance_variable
$global_variable
ファイル名

ファイル名は、すべて小文字とし、単語の区切りに`-'を用いる。また、ファイル中の主な定義クラスの名前を変換したものをファイル名に使用する。(モジュールを名前空間として使用する場合は、ディレクトリを使用して階層構造を表現する。)

foo.rb # クラスFooを定義
foo-bar.rb # クラスFooBarを定義
foo/bar-baz.rb # クラスFoo::BarBazを定義

構文に関する規約

クラスの構成要素

クラスの構成要素は以下の順序で記述する。

  1. モジュールのインクルード
  2. 定数の定義
  3. クラス変数・クラスのインスタンス変数の定義
  4. パブリックなクラスメソッドの定義
  5. アクセサの定義
  6. initializeの定義
  7. パブリックなインスタンスメソッドの定義
  8. プロテクティッドなクラスメソッドの定義
  9. プロテクティッドなアクセサの定義
  10. プロテクティッドなインスタンスメソッドの定義
  11. プライベートなクラスメソッドの定義
  12. プライベートなアクセサの定義
  13. プライベートなインスタンスメソッドの定義
  14. ネストしたクラスの定義
アクセサの定義

アクセサの定義には、attr_accessor・attr_reader・ attr_writerを使用する(attrは使用しない)。

メソッドの定義

メソッド定義の仮引数リストには括弧を付ける。ただし、引数がない場合は、括弧を省略する。

def foo(x, y)
...
end
def foo
...
end
クラスメソッドの定義

クラスメソッドの定義にはselfを使用する。

class Foo
def self.foo
...
end
end
メソッド呼び出し

メソッド呼び出しの引数リストには括弧を付ける。ただし、引数がない場合は、括弧を省略する。また、printやputsやpの場合は、引数の括弧を省略してもよい。

foo(1, "abc")
obj.foo(1, "abc")
bar
print "x = ", x, "\n"
ブロック

ブロックは基本的にdo ... endを使用する。

foo(x, y) do
...
end
x = bar(y, z) do
...
end

ただし、メソッドチェインを行う場合は{ ... }を使用する。

s = ary.collect { |i| i.to_s }.join(",")
return

メソッドの値を返す場合は、必ずreturnを使用する。また、returnの括弧は省略する。

def add(x, y)
return x + y
end
yield

yieldの呼び出し方法はメソッド呼び出しに準ずる。

条件分岐

if式のthenは省略する。また、if !xのような場合は、 unless xに置き換える。ただし、unlessの場合、 elseは使用しない。また、条件が十分に簡単で、一行で書ける場合は、if/while修飾子を使用してもよい。

if x > 0
puts "x > 0"
else
puts "x <= 0"
end
unless x
puts "x is false"
end
puts "x is true" if x

caseを使用できる場合は、caseを使用する。また、thenは省略する。

case x
when 1
...
when 2
...
end

条件分岐の式の値は使用しない。

if x > 0
msg = "x > 0"
else
msg = "x <= 0"
end
繰り返し

whileのdoは省略する。また、while !xのような場合は、until xに置き換える。また基本的にforは使わない。

while cond
...
end
until cond
...
end

また、無限ループにはスコープの問題の回避するなど特別な場合をのぞきloopを使用する。

loop do
...
end
論理演算子

論理演算には!や&&や||を使用する。 (not/and/orは使用しない。)

三項演算子

明らかに可読性に問題がない場合を除いて、三項演算子はなるべく使用しない。とくに、括弧が必要なほど条件が複雑な場合や、複数行になってしまう場合は、三項演算子は使用しない。

文字列リテラル

文字列リテラルには基本的に"..."を使用する。ただし、特殊文字を解釈させたくない場合のみ、'...'を使用する。また、原則的にヒアドキュメントは使用しない。

alias

aliasの引数にシンボルを渡す表記はしない(aliasはメソッド呼び出しではなくて構文であるからこそ引数の間にカンマがないため)。

alias newname origname
alias :newname :oldname # 誤り

 - IT