プログラミングには様々なお作法や暗黙的なルール、パターンがあります。
プログラムの命名規則やフォーマットなどについてのお作法やルールをまとめたものがコーディング規約になります。
このルールを知らないと他人に正しくコードを読んでもらえなかったり、チーム内で自分だけ違う書き方をしてしまうということになります。
コーディング規約は基本的に組織やチーム毎に内容を決めて作成しますが、多くの場合は元にしているものがあります。
そこで本記事では、Rubyでよく使われる一般的なコーディング規約についてまとめます。
ある程度一人でプログラミングができるようになった方や、組織やチームにまだコーディング規約がない方は、参考にしていただければと思います。
Rubyのコーディング規約
Rubyのコーディング規約のまとめとして、以下の内容を採り上げます。
- コーディング規約の種類
- 命名に関する規約
- フォーマットやレイアウトに関する規約
- コメントに関する規約
- 構文に関する規約
コーディング規約の種類
Rubyのコーディング規約は、代表的なものとして以下があげられます。
本記事では、公式で紹介されている『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
構文に関する規約
クラスの構成要素
クラス内の要素は以下の順序で記述します。
- モジュールのインクルード
- 定数の定義
- クラス変数・クラスのインスタンス変数の定義
- パブリックなクラスメソッドの定義
- アクセサの定義
- initializeの定義
- パブリックなインスタンスメソッドの定義
- プロテクティッドなクラスメソッドの定義
- プロテクティッドなアクセサの定義
- プロテクティッドなインスタンスメソッドの定義
- プライベートなクラスメソッドの定義
- プライベートなアクセサの定義
- プライベートなインスタンスメソッドの定義
- ネストしたクラスの定義
アクセサの定義
アクセサの定義には、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のコーディング規約について紹介しました。
参考になれば幸いです。
コメント