Rubyコーディング規約

はじめに

本文書は、Rubyによりコーディングを行う際の規約について述べる。 実際のプロジェクトに適用する際には、このコーディング規約をカスタ マイズして用いることを推奨する。

ソースコードの整形

インデント

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

例:

if x > 0
  if y > 0
    puts "x > 0 && y > 0"
  end
end

一行の桁数

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

空行

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

例:

class Foo
  ...
end

class Bar
  ...
end

誤った例:

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

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

例:

class Foo
  attr :bar

  def baz
    ...
  end

  def quux
    ..
  end
end

誤った例:

class Foo

  attr :bar

  def baz
    ...
  end

  def quux
    ...
  end

end

コメント

メソッド定義の中にはコメントは記述しない。(コメントが必要だと思わ れるようなコードにはリファクタリングを行う。)

ただし、クラス・モジュールやパブリックなメソッドには仕様をRDocス タイルで記述する。

例:

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

構文に関する規約

クラスの構成要素

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

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

アクセサの定義

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

メソッドの定義

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

例:

def foo(x, y)
  ...
end

def foo
  ...
end

誤った例:

def foo x, y
  ...
end

def foo()
  ...
end

クラスメソッドの定義

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

例:

class Foo
  def self.foo
    ...
  end
end

誤った例:

class Foo
  def Foo.foo
    ...
  end
end

メソッド呼び出し

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

例:

foo(1, "abc")
obj.foo(1, "abc")
bar
print "x = ", x, "\n"

誤った例:

foo 1, "abc"
obj.foo 1, "abc"
bar()

ブロック

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

例:

foo(x, y) do
  ...
end

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

誤った例:

foo(x, y) {
  ...
}

x = bar(y, z) {
  ...
}

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

例:

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

誤った例:

s = ary.collect do |i| i.to_s end.join(",")

return

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

例:

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

誤った例:

def add(x, y)
  x + y
end

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

誤った例:

if x > 0 then
  puts "x > 0"
end

unless x
  puts "x is false"
else
  puts "x is true"
end

puts "foo && bar && baz && quux" if foo &&
  bar && baz && quux

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

例:

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

誤った例:

if x == 1
  ...
elsif x == 2
  ...
end

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

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

例:

if x > 0
  msg = "x > 0"
else
  msg = "x <= 0"
end

誤った例:

msg = if x > 0
        "x > 0"
      else
        "x <= 0"
      end

繰り返し

whiledoは省略する。また、while !xのような場合は、 until xに置き換える。

例:

while cond
  ...
end

until cond
  ...
end

誤った例:

while cond do
  ...
end

また、無限ループにはloopを使用する。

例:

loop do
  ...
end

誤った例:

while true
  ...
end

論理演算子

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

三項演算子

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

文字列リテラル

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

命名規約

全般

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

クラス・モジュール名

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

例:

ExampleClass  
HTTPClient

誤った例:

Example_Class
EXAMPLE_CLASS
HttpClient
HTTPclient
HTTP_Client

メソッド名

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

例:

add_something

誤った例:

addsSomething
Add_Something

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

例:

visible?

誤った例:

is_visible
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を定義

Copyright (C) 2007 Shugo Maeda

licensed under Creative Commons Attribution License