Rubyのコーディング規約【プログラミング初心者向け教材】

プログラミング

プログラミングには様々なお作法や暗黙的なルール、パターンがあります。

プログラムの命名規則やフォーマットなどについてのお作法やルールをまとめたものがコーディング規約になります。

このルールを知らないと他人に正しくコードを読んでもらえなかったり、チーム内で自分だけ違う書き方をしてしまうということになります。

コーディング規約は基本的に組織やチーム毎に内容を決めて作成しますが、多くの場合は元にしているものがあります。

そこで本記事では、Rubyでよく使われる一般的なコーディング規約についてまとめます。

ある程度一人でプログラミングができるようになった方や、組織やチームにまだコーディング規約がない方は、参考にしていただければと思います。

Rubyのコーディング規約

Rubyのコーディング規約のまとめとして、以下の内容を採り上げます。

  • コーディング規約の種類
  • 命名に関する規約
  • フォーマットやレイアウトに関する規約
  • コメントに関する規約
  • 構文に関する規約

コーディング規約の種類

Rubyのコーディング規約は、代表的なものとして以下があげられます。

  • Rubyのコーディングスタイル [日本語]
    • Ruby Association(公式)で紹介しているコーディング規約です。おそらくRubyにおける最初のコーディング規約(スタイル)だと思います。1999年作成です。
  • Rubyコーディング規約 [日本語]
    • Ruby Association(公式)で紹介しているコーディング規約です。2007年作成です。
  • Ruby コーディング規準 [日本語]
    • クックパッド株式会社でのが作成したRubyコードのスタイル規準です。2014年作成でメンテナンスが続けられています。

本記事では、公式で紹介されている『Rubyコーディング規約』の内容をまとめます。

命名に関する規約

全般

  • 原則として、単語の省略は行わない。
  • スコープが狭いループ変数には、i、j、kという名前をこの順序で使用する。
  • スコープが狭い変数名には、クラス名を省略したものを使用してよい。(例:eo = ExampleObject.new)
命名 規則
クラス名
モジュール名
パスカルケース(アッパーキャメルケース)とする。
HTTPのような略語の場合はすべて大文字のままとする。
ExampleClass
HTTPClient
メソッド名
スネークケース(小文字のみ)とする。
動詞の原形を使用する。
真偽値を返すメソッド名は、動詞または形容詞に ? を付け、形容詞に is_ は付けない。
破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、破壊的なメソッドには ! を付ける。
add_something
visible?
split
split!
定数名
スネークケース(大文字のみ)とする。
EXAMPLE_CONSTANT
変数名
スネークケース(小文字のみ)とする。
tmp
local_variable
@instance_variable
$global_variable
ファイル名
チェインケースとする。
ファイル中の主な定義クラスの名前を変換したものをファイル名に使用する。
モジュールを名前空間として使用する場合は、ディレクトリを使用して階層構造を表現する。
foo.rb
foo-bar.rb
foo/bar-baz.rb

フォーマットやレイアウトに関する規約

インデント

インデント幅は2とします。
インデントにはスペースのみを使用し、タブは使用しません。

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

一行の桁数

一行の桁数は最大80文字までとします。

空行

複数のクラスを定義する場合は、区切りとして空行を挿入します。

class Foo
  ...
end

class Bar
  ...
end

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

class Foo
  attr :bar

  def baz
    ...
  end

  def quux
    ...
  end
end

コメントに関する規約

メソッド定義の中にはコメントは記述しません。(コメントが必要だと思われる場合にはリファクタリングすることを考えます)
ただし、クラス・モジュールやパブリックなメソッドには仕様をRDocスタイルで記述します。

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

構文に関する規約

クラスの構成要素

クラス内の要素は以下の順序で記述します。

  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(",")

retrun

メソッドの値を返す場合は、必ず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

# 誤った例
msg = if x > 0
        "x > 0"
      else
        "x <= 0"
      end

繰り返し

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

while cond
  ...
end

until cond
  ...
end

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

loop do
  ...
end

論理演算子

論理演算子には ! や && や || を使用します。(not / and / or は使用しません)

三項演算子

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

文字列リテラル

文字列リテラルは、基本的にダブルクォート “…” を使用します。
ただし、特殊文字を解釈させたくない場合のみ、シングルクォート ‘…’ を使用します。
また、原則的にヒアドキュメントは使用しません。

ツールを使って自動的にチェックできるようにしよう

コーディング規約は、多くの場合、プロジェクトや組織ごとに異なります。

それらをすべて覚えてプログラミングするのは、返って効率が悪くなる場合があるので、主要な部分は覚えて、細かい部分はツールでチェックできるようにすると良いです。

IDEにツールが備わっている場合もありますし、それぞれのコーディング規約に沿ったチェックツールが提供されている場合もあります。

それらを上手く活用し、自分たち向けにカスタマイズして、誰もが同じ規約のもとで、同じようにコードが書けるようにするのがベターです。

また、Rubyのコーディング規約というわけではありませんが、コーディング時に気を付けるべき様々な点がまとめられた書籍『リーダブルコード』もおすすめです。

当ブログでも以前に紹介していますので、気になる方はぜひチェックしてみてください。

エンジニアのおすすめ本『リーダブルコード』
ある程度一人でプログラミングができるようになってさらに上達したい方、チームメンバーから褒めてもらえるようなより良いプログラムを書きたいと思っている方、チームで開発しているプログラムが統一感がなく属人的になっていることに悩んでいる方向けに、書籍『リーダブルコード』を紹介します。

今回はRubyのコーディング規約について紹介しました。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました