
こんにちは、hachi8833です。
「Rubyスタイルガイドを読む」シリーズのバックナンバーを改定し、「Rubyスタイルガイド(解説付き)」と題して総もくじ記事といたしました。
本スタイルガイドの元になっているbbatsov/ruby-style-guideは、同じ著者によるRuboCop gemで使われているスタイルです。
誤りや原文の追加・更新にお気づきの場合は、末尾のフォームまたは@techrachoでお知らせください。
1. ソースコードレイアウト
(1)エンコード、クラス定義、スペースなど
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 1-01 | 【統一】 | ファイルエンコーディングはUTF-8にする |
| 1-02 | 【統一】 | インデントはスペース2文字で表現する |
| 1-03 | 【統一】 | 改行文字はUnixスタイル(LFのみ)とする |
| 1-04 | 【統一】 | セミコロン;は文の区切りとしては使わない |
| 1-05 | 【統一】 | 本文のない、空のクラス定義は1行で書くのが好ましい |
| 1-06 | 【統一】 | 1行に多数の式を書くメソッド(シングルラインメソッド)は避ける |
| 1-07 | 【統一】 | 演算子の前後にはスペースを置き、カンマ・コロン・セミコロンの後ろにもスペースを置く |
| 1-07a | 【例外】 | 累乗演算子**の場合はスペースを前後に置かない |
| 1-08 | 【統一】 | ()や[]のすぐ内側にはスペースを置かず、{}のすぐ内側にはスペースを置く |
| 1-08a | 【例外】 | 式展開(interpolation)では波かっこ{}のすぐ内側にスペースを置かない |
(2)インデント、記号など
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 1-09 | 【統一】 | 感嘆符!の後ろにはスペースを置かない |
| 1-10 | 【統一】 | 範囲演算子..や...の前後にはスペースを置かない |
| 1-11 | 【統一】 | case文内部のwhenのインデントの深さはcaseと同じにする |
| 1-12 | 【統一】 | 変数に代入する条件式の後続文は、条件式と同じ位置にインデントを揃える |
| 1-12a | 【選択】 | 1-12のインデントスタイルは「良好1」「良好2」から選べる |
| 1-13 | 【統一】 | メソッド定義とメソッド定義の間には空行を置き、論理上のパラグラフ区切りにも空行を置く |
| 1-14 | 【統一】 | メソッド呼び出しの末尾パラメーターの後ろにはカンマを置かない(特にメソッド呼び出しが1行の場合) |
| 1-15 | 【統一】 | メソッドのパラメータでデフォルト値を与える場合、=の前後にはスペースを置く) |
| 1-16 | 【統一】 | \で行を継続するのは避ける(文字列の結合での利用のみ認める) |
| 1-17 | 【統一】【選択】 | ドット.によるメソッドチェーンの行分割はOption A(1-17a)とOption B(1-17b)のいずれかに揃える |
| 1-18 | 【統一】 | メソッド呼び出しを2行以上に分割する場合はパラメータを揃える |
| 1-19 | 【統一】 | 配列リテラルの要素を複数行に分割する場合は縦を揃える |
| 1-19a | 【選択】 | 配列リテラルのブラケット[も次の行に送ってよい |
| 1-20 | 【統一】 | 桁数の多い数値はアンダースコア_で区切る |
| 1-21 | 【統一】 | 数値のprefixは小文字で書く(0x、0o、0bなど) |
| 1-22 | 【統一】 | APIドキュメントにはRDocを使い、RDocコメント行とdefの間に空行を置かない |
| 1-23 | 【統一】 | 1行は80文字以内とする |
| 1-24 | 【統一】 | 行末にスペース文字(ホワイトスペース)を置かない |
| 1-25 | 【統一】 | ファイルの末尾には空行を1つ置く |
| 1-26 | 【統一】 | =beginと=endによるブロックコメントは使わない |
2. 文法
(1)メソッド定義、引数、多重代入など
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-01 | 【統一】 | ::は、定数(クラスやモジュールも含む)、コンストラクタ(Array()やNokogiri::HTML()など)の参照にのみ使う |
| 2-02 | 【統一】 | メソッド定義にパラメータがない場合は、def行のメソッドにかっこ()をつけない |
| 2-03 | 【統一】 | メソッド呼び出しのかっこ()は省略しない(特に第1引数がかっこ()を使った式の場合) |
| 2-03a | 【例外】 | 次の場合のみかっこ()を省略する:「引数のないメソッド呼び出し」「内部DSLの一部となっているメソッド呼び出し」「ステータスをキーワードで指定するメソッド」 |
| 2-04 | 【統一】 | オプション引数は引数リストの末尾に置く |
| 2-05 | 【統一】 | 変数定義での多重代入は避ける |
(2)アンダースコア、多重代入、三項演算子、if/unless
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-06 | 【統一】 | 多重代入の左辺で単独のアンダースコア_変数を末尾に置くことはなるべく避ける |
| 2-07 | 【統一】 | forは原則使わない |
| 2-08 | 【統一】 | thenは、ifやunlessが複数行の場合は使わない |
| 2-09 | 【統一】 | ifやunlessと条件は常に同じ行に書く |
| 2-10 | 【統一】 | 三項演算子(?と:)の利用を推奨する |
| 2-11 | 【統一】 | 三項演算子はネストしないこと |
| 2-12 | 【統一】 | if x; ...は三項演算子にする |
| 2-13 | 【統一】 | ifやunlessが値を返す機能を積極的に使う |
| 2-14 | 【統一】 | case文で、1行で終わるwhen節ではthenを使う(when x; ...は使わない) |
(3)演算子とif/unless
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-15 | 【統一】 | 否定は!演算子で表すこと(notは使わない) |
| 2-16 | 【統一】 | !!は避ける |
| 2-17 | 【統一】 | 論理演算には常に演算子&&と||を使う(andとorは使わない) |
| 2-18 | 【統一】 | 三項演算子(?と:)は複数行では使わない |
| 2-19 | 【統一】 | 実行行が1つの場合は後置のif/unlessを推奨する(&&や||による制御フローでもよい) |
| 2-20 | 【統一】 | 複雑な複数行ブロックでの後置if/unlessは避ける |
| 2-21 | 【統一】 | 後置のif/unless/while/untilはネストしないこと(必要なら&&/||で) |
| 2-22 | 【統一】 | 否定条件はなるべくunlessや制御フロー||を使って読みやすくする |
| 2-23 | 【統一】 | unlessとelseを併用しないこと |
| 2-24 | 【統一】 | 制御式の条件はかっこ( )で囲まない |
(4)ループ
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-25 | 【統一】 | 複数行のwhileやuntilでは条件の後にdoを置かない |
| 2-26 | 【統一】 | whileやuntilの本文が単文の場合は後置にするのが望ましい |
| 2-27 | 【統一】 | 否定条件をwhileで表すよりも、条件を肯定にしてuntilにする方が望ましい |
| 2-28 | 【統一】 | 無限ループはKernel#loopで書くこと |
| 2-29 | 【統一】 | begin/end/untilやbegin/end/whileではなく、Kernel#loopとbreakを使う |
| 2-30 | 【統一】 | 暗黙のハッシュを引数として渡す場合、外側の波かっこ{ }は省略する |
| 2-31 | 【統一】 | 内部DSLの一部であるメソッドでは、引数の波かっこ{ }と丸かっこ( )を両方省略する |
(5)ブロック、proc
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-32 | 【統一】 | ブロックの各要素でメソッドを1つだけ呼び出す場合は、proc呼び出しのショートハンド「&:」を使う |
| 2-33 | 【統一】 | ブロック記法: 1行に収まる場合は原則{...}を使い、制御フローやメソッド定義では常にdo...endを使う |
| 2-34 | 【統一】 | 引数を別のブロックに渡すだけのブロックは、明示的なブロック引数で書き直す |
| 2-35 | 【統一】 | 不必要なreturnは避ける |
| 2-36 | 【統一】 | 不必要なselfは避ける |
| 2-37 | 【統一】 | ローカル変数をメソッドでシャドウイングすることは避ける |
(6)演算子など
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-38 | 【統一】 | 分岐の条件部分で=による代入の結果を値として使う場合は、条件全体をかっこ( )で囲むこと |
| 2-39 | 【統一】 | できるだけ自己代入演算子(+=など)を使う |
| 2-40 | 【統一】【ヒント】 | 「変数が初期化されていない場合のみ初期化する」場合は、||=を使う |
| 2-41 | 【統一】 | 論理値の初期化には||=を使わないこと |
| 2-42 | 【統一】【ヒント】 | 「その変数が存在する場合のみ値を代入する」 処理には&&=を使う |
| 2-43 | 【統一】 | ===はなるべく避ける |
| 2-44 | 【統一】 | eql?は必要ない限り使わない: 極力==を使う |
| 2-45 | 【統一】 | Perl由来の特殊変数($:や$;など)は極力避けること |
| 2-46 | 【統一】 | メソッド名と開きかっこ( の間にはスペースを置かない |
(7)lambda、標準入出力など
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-47 | 【統一】 | Rubyインタプリタは常に-wオプションをつけて実行すること |
| 2-48 | 【統一】 | メソッド定義はネストしないこと(ネスト定義が必要ならlambdaを使う) |
| 2-49 | 【統一】 | ブロックが1行のみなら、lambdaの略記->()を使い、ブロックが複数行なら略記でないlambdaメソッドを使う |
| 2-50 | 【統一】 | lambdaの略記->() { }でパラメータがある場合は丸かっこ( )を省略しないこと |
| 2-51 | 【統一】 | lambdaの略記->() { }でパラメータがない場合は丸かっこ( )を省略すること |
| 2-52 | 【統一】 | Proc.newは避け、procを使う |
| 2-53 | 【統一】 | lambdaやprocの実行にはproc.call()を使う: proc[]やproc.()は避ける |
| 2-54 | 【統一】 | 使わないブロックパラメータ名やローカル変数名の冒頭には_を付ける(_のみでもよい) |
| 2-55 | 【統一】 | 標準入出力は$stdout/$stderr/$stdinに統一する |
| 2-56 | 【統一】 | $stderr.putsは避け、#warnを使うこと |
| 2-57 | 【統一】 | String#%は避け、sprintfまたはformatを使うこと |
(8)配列や論理値など
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 2-58 | 【統一】 | 文字列を引数に取るArray#*はわかりにくいので避け、Array#joinを使うこと |
| 2-59 | 【統一】【ヒント】 | 「変数が配列でない場合は配列に変換する」処理はArray()で書くこと |
| 2-60 | 【統一】 | 範囲演算子やComparable#between?を使って比較をできるだけ簡潔に書く |
| 2-61 | 【統一】 | 比較条件ではeven?やzero?などの述語メソッドが望ましい(==の直接使用は避ける) |
| 2-62 | 【統一】 | nilでないことのチェック(nilチェック)は、論理値を扱っていることが確実でない限り行わないこと |
| 2-63 | 【統一】 | BEGINブロックは避ける |
| 2-64 | 【統一】 | ENDブロックは避け、Kernel#at_exitにする |
| 2-65 | 【統一】 | フリップフロップは避ける |
| 2-66 | 【統一】 | 制御で条件をネストすることは避ける |
| 2-67 | 【統一】 | ループではnextの利用が望ましい |
| 2-68 | 【目安】 | #collectより#map、#detectより#find、#find_allよりselect、#injectより#reduce、#lengthより#sizeを優先 |
| 2-69 | 【統一】 | #countを#sizeの意味で使わないこと |
| 2-70 | 【統一】 | #mapと#flattenではなく#flat_mapを使うこと |
| 2-71 | 【統一】 | #reverse.eachよりも#reverse_eachが望ましい |
3. 命名
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 3-01 | 【統一】 | 識別子の命名には英語を使う |
| 3-02 | 【統一】 | シンボル名、メソッド名、変数名はスネークケースにする |
| 3-03 | 【統一】 | シンボル名、メソッド名、変数名に付ける数字は文字と接すること |
| 3-04 | 【統一】 | クラス名とモジュール名はキャメルケースにする |
| 3-05 | 【統一】 | ファイル名とディレクトリ名はスネークケースにする |
| 3-06 | 【統一】 | ソースファイル名にはクラス名やモジュール名のキャメルケースをスネークケースに変えたものを使う |
| 3-07 | 【統一】 | その他の定数名は「スクリーミングスネークケース」にする |
| 3-08 | 【統一】 | 述語メソッド名の末尾には疑問符?を置くこと |
| 3-09 | 【統一】 | 述語メソッドの冒頭にisやdoesやcanといった助動詞はなるべく置かないようにする |
| 3-10 | 【統一】 | 破壊的でないメソッドと破壊的なメソッドがある場合、破壊的メソッド名の末尾には感嘆符!を置くことで区別する |
| 3-11 | 【統一】 | 可能な場合は、!付きの破壊的メソッドに対応する!なしの「破壊的でない」メソッドも定義すること |
| 3-12 | 【統一】 | 2項演算子の定義では引数をotherに揃える |
4. コメント、アノテーション、マジックコメント
コメント
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 4-01 | 【統一】 | コード自身に語らせろ(コメントは最小限に) |
| 4-02 | 【統一】 | コメントは英語(≒自国語)で書くこと |
| 4-03 | 【統一】 | コメント記号#とコメント記号の間は1スペース開けること |
| 4-04 | 【統一】 | 1語より長いコメント文は冒頭を大文字にし、句読点を省略せず、ピリオドの後にスペースをひとつ置く |
| 4-05 | 【統一】 | 無駄なコメントは削ぎ落とすこと |
| 4-06 | 【統一】 | コメントを古いままにしないこと |
| 4-07 | 【統一】 | ダメなコードをカバーしようとするコメントを書くな |
アノテーション
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 4-08 | 【統一】 | アノテーションは、説明したいコードのすぐ上に書くこと |
| 4-09 | 【統一】 | アノテーションは、最初にキーワード、次にコロンとスペースを置き、それから問題を記述すること |
| 4-10 | 【統一】 | 1行に収まりきれない場合は、2行目以降の#以降のスペースを3文字増やす |
| 4-10a | 【例外】 | 問題点が自明なら、該当箇所の後ろにキーワードだけのアノテーションをつけてもよい |
| 4-11 | 【統一】 | アノテーションのキーワードには以下を使う |
- TODO
- 後日追加が必要な、不足の機能
- FIXME
- 修正の必要な箇所
- OPTIMIZE
- パフォーマンス低下の原因となる箇所
- HACK
- リファクタリングの必要なマズいコード
- REVIEW
- 意図したとおりに動くかどうかチェックが必要
- その他
- 必要ならキーワードを足してもよいが、READMEでキーワードを説明すること
マジックコメント
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 4-12 | 【統一】 | マジックコメントはすべて最上部に置くこと |
| 4-13 | 【統一】 | 1行に複数のマジックコメントを書かない |
| 4-14 | 【統一】 | マジックコメントと他の部分との間には空行を1つ置く |
5. クラスとモジュール
(1)構造
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 5-01 | 【統一】 | クラス定義は以下の構造で統一する |
| 5-02 | 【統一】 | mixinが複数ある場合は別々に書く |
| 5-03 | 【統一】 | 1つのファイル内で、複数行の大きなクラスを別のクラス内で直接ネストしない |
| 5-04 | 【統一】 | クラスメソッドしか持たないクラスは、モジュールに書き換えるのが望ましい |
| 5-05 | 【統一】 | extend selfはmodule_functionに書き換えるのが望ましい |
(2)クラス設計・アクセサ・ダックタイピングなど
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 5-06 | 【統一】 | クラス設計の階層はLiskovの置換原則に従う |
| 5-07 | 【統一】 | クラスはできるだけSOLIDに設計すること |
| 5-08 | 【統一】 | ドメインオブジェクトを表現するクラスには常に適切なto_sメソッドを実装すること |
| 5-09 | 【統一】 | 重要度の低いアクセサやミューテータはattr_*で定義する |
| 5-10 | 【統一】 | アクセサやミューテータの名前にget_やset_を使うことは避ける |
| 5-11 | 【統一】 | attrは原則使わない |
| 5-12 | 【ヒント】 | Struct#newを積極的に使う |
| 5-13 | 【禁止】 | Struct#newで初期化したインスタンスを継承しないこと |
| 5-14 | 【ヒント】 | クラスによってはファクトリーメソッドの追加を検討する |
| 5-15 | 【ヒント】 | 継承よりもダックタイピングを積極的に使うこと |
(3)クラスメソッド、スコープ、エイリアスなど
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 5-16 | 【統一】 | クラス変数(@@で始まる変数)はできるだけ避ける |
| 5-17 | 【統一】 | メソッドの公開範囲を用途に応じて適切に設定する |
| 5-18 | 【統一】 | privateとprotectedは対象となるメソッド定義とインデントを揃える |
| 5-19 | 【統一】 | クラスメソッドはdef self.methodで定義する |
| 5-20 | 【統一】 | メソッドをレキシカルクラススコープでエイリアスする場合はaliasを使うのが望ましい |
| 5-21 | 【統一】 | モジュールやクラスやシングルトンクラスのメソッドを実行時にエイリアスする場合は常にalias_methodを使う |
| 5-22 | 【統一】 | クラスやモジュールの中で同じクラスやモジュール内の他のメソッドを呼ぶ場合は、呼び出しのself.を省略する |
6. 例外処理
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 6-01 | 【統一】 | 例外処理ではraiseを使う方がfailより望ましい |
| 6-02 | 【統一】 | raiseで引数を2つ与える場合、RuntimeErrorは明示的に指定しない |
| 6-03 | 【統一】 | raiseでは、例外クラスのインスタンスを引数に渡すのではなく、例外クラスとメッセージを2つの引数として与えるのが望ましい |
| 6-04 | 【統一】 | ensureブロックでは結果を返さないこと |
| 6-05 | 【統一】 | 可能であればbeginブロックは省略する |
| 6-06 | 【統一】 | 「contingency method」でbeginブロックを減らす |
| 6-07 | 【統一】 | 例外を握りつぶさないこと |
| 6-08 | 【統一】 | 後置のrescueは避ける |
| 6-09 | 【統一】 | 例外処理を制御フローに使わないこと |
| 6-10 | 【統一】 | Exceptionクラスをrescueすることは避ける |
| 6-11 | 【必須】 | 詳細な例外処理はrescueチェーンの上位に置き、大域的な例外処理は下位に置くこと |
| 6-12 | 【統一】 | プログラムで取得した外部リソースは必ずensureブロックで解放すること |
| 6-13 | 【統一】 | リソース取得メソッドは、不要になったリソースを自動でクリーンアップするタイプのものを使う |
| 6-14 | 【統一】 | 例外処理には標準ライブラリを使うのが望ましい |
7. コレクション(Array、Hash、Setなど)
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 7-01 | 【統一】 | 配列やハッシュの作成は[]や{}によるリテラル表記が望ましい |
| 7-02 | 【統一】 | 配列のリテラル表記で語の配列が必要な場合は%wが望ましい |
| 7-03 | 【統一】 | 配列のリテラル表記でシンボルの配列が必要な場合は%iが望ましい |
| 7-04 | 【統一】 | 配列のリテラルやハッシュのリテラルで最後の項目直後のカンマは避ける |
| 7-05 | 【統一】 | 大きな配列を途中から作成することは避ける |
| 7-06 | 【統一】 | 配列の最初の要素には#first、最後の要素には#lastでアクセスするのが望ましい |
| 7-07 | 【統一】 | 要素を重複させたくない場合はArrayではなくSetを利用する |
| 7-08 | 【統一】 | ハッシュのキーは文字列よりもシンボルが望ましい |
| 7-09 | 【統一】 | ミュータブルなオブジェクトをハッシュのキーにすることは避ける |
| 7-10 | 【統一】 | ハッシュのキーがシンボルならシンボル:で表記する |
| 7-11 | 【統一】 | Ruby 1.9記法とロケット演算子記法を同一ハッシュリテラル内で混ぜないこと |
| 7-12 | 【統一】 | ハッシュではHash#key?やHash#value?を使うこと |
| 7-13 | 【統一】 | ハッシュではHash#each_keyやHash#values_eachを使うこと |
| 7-14 | 【統一】 | ハッシュのキーの存在を前提にする場合はHash#fetchを使うこと |
| 7-15 | 【統一】 | ハッシュ値のデフォルト値が欲しい場合はHash#fetchでデフォルト値を与えること |
| 7-16 | 【ヒント】 | Hash#fetchで取る値を評価するコードに副作用がある場合やコストが高い場合は、コードをデフォルト値で与えるよりもコードをブロックで与える方が望ましい |
| 7-17 | 【統一】 | ハッシュから複数の値を一度に取り出す場合はHash#values_atを使うこと |
| 7-18 | 【統一】 | ハッシュの要素の順序が保持されることを前提としてコードを書くこと |
| 7-19 | 【統一】 | コレクションの全要素をスキャン中に要素を変更しないこと |
| 7-20 | 【統一】 | コレクションにはできるだけ[n]以外の読み出しメソッドでアクセスすること |
| 7-21 | 【統一】 | コレクションにアクセサを実装する場合はnilチェックすること |
8. 数値、文字列、日時(日付・時刻・時間)
数値
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 8-01 | 【統一】 | 整数値のチェックにはIntegerを使うこと |
| 8-02 | 【統一】 | 乱数生成では範囲演算子...の利用が望ましい |
文字列
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 8-03 | 【統一】 | 文字列の結合は+ではなく、式展開と文字列フォーマットが望ましい |
| 8-04 | 【統一】 | 一重引用符(シングルクォート: ')と二重引用符(ダブルクォート: ")の用法をいずれかに統一すること |
| 8-04a | 【選択】 | A: 一重引用符'を優先するスタイル |
| 8-04b | 【選択】 | B: 二重引用符"を優先するスタイル |
| 8-05 | 【統一】 | ?xのような文字列リテラル構文は使わないこと |
| 8-06 | 【統一】 | 文字列にインスタンス変数やグローバル変数を式展開で挿入する場合に{}を省略しないこと |
| 8-07 | 【ヒント】 | 式展開するオブジェクトでObject#to_sを呼ばないこと |
| 8-08 | 【ヒント】 | 大きなデータの作成にはString#+ではなく、String#<<を使うこと |
| 8-09 | 【統一】【ヒント】 | 文字列置き換えや削除は可能な限りString#gsub以外のメソッドを使うこと |
| 8-10 | 【ヒント】 | 複数行に渡る文字列をヒアドキュメントで扱う場合は、各行冒頭のスペース文字も読み込まれていることに注意する |
| 8-11 | 【統一】 | ヒアドキュメントで複数行のインデントを保つにはRuby 2.3の「<<~終了文字列」記法を使うこと |
日付・時間
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 8-12 | 【統一】 | システム時間の取得はTime.nowが望ましい |
| 8-13 | 【統一】 | DateTimeはカレンダーを過去に遡って再編成する必要がない限り使わないこと |
9. 正規表現、%リテラル、メタプログラミングなど
正規表現
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 9-01 | 【統一】 | 「文字列変数['テキスト']」で単純な文字列を検索するのであれば正規表現にしないこと |
| 9-02 | 【選択】 | コードをシンプルにするために、文字列のインデックスに正規表現を直接書いてもよい |
| 9-03 | 【統一】【ヒント】 | 正規表現でキャプチャの結果が不要な場合はキャプチャなしグループ(?:)を使うこと |
| 9-04 | 【統一】 | 最後にマッチしたグループの取り出しにPerl由来の$記法($1や$2など)を使わないこと |
| 9-05 | 【統一】 | キャプチャグループは番号での指定ではなく名前付きグループでの指定が望ましい |
| 9-06 | 【統一】 | 文字クラス[ ]の中ではドット.やかっこの類をエスケープしないこと |
| 9-07 | 【必須】 | 重要: パターンの冒頭と末尾は^や$ではなく、\Aと\zで表すこと |
| 9-08 | 【統一】 | 複雑な正規表現はx修飾子で読みやすくすること |
| 9-09 | 【ヒント】 | 複雑な置換では、#subや#gsubにブロックやハッシュを与えてもよい |
リテラル
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 9-10 | 【統一】 | 二重引用符を含む1行の文字列を式展開する場合は%()(%Qの省略形)を使う: 複数行ならヒアドキュメントを使う |
| 9-11 | 【統一】 | %()(または同等の%q())は、一重引用符と二重引用符を両方含む文字列以外では使わないこと |
| 9-12 | 【統一】 | 正規表現リテラル%rは、正規表現に/文字が含まれていなければ使わないこと |
| 9-13 | 【統一】 | コマンドリテラル%xは避ける(コマンド自体にバッククォートがある場合を除く) |
| 9-14 | 【統一】 | シンボルリテラル%sの利用は避けること |
| 9-15 | 【統一】 | %リテラルで使うかっこは、リテラルの種類に応じて使い分けること(文字列: ()、配列: []、正規表現: {}) |
メタプログラミング
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 9-16 | 【統一】 | 必要のないメタプログラミングは避けること |
| 9-17 | 【統一】 | コアクラスにモンキーパッチを当てないこと |
| 9-18 | 【統一】 | class_evalは文字列の式展開形式ではなくブロック形式が望ましい |
| 9-19 | 【統一】 | 文字列の式展開でclass_evalなどのevalメソッドを使う場合は、式展開を具体的に示すコメントを追加すること |
| 9-20 | 【統一】 | method_missingは避け、代わりに委譲、プロキシ、define_methodの利用を検討すること |
| 9-21 | 【統一】 | sendは避け、public_sendを使うこと |
| 9-22 | 【統一】 | sendよりもアンダースコア付きの__send__が望ましい |
その他
| 通し番号 | カテゴリ | スタイル |
|---|---|---|
| 9-23 | 【統一】 | ruby -wオプションを使って安全なコードを書くこと |
| 9-24 | 【統一】 | オプションパラメータにハッシュを使うことは避ける |
| 9-25 | 【目安】 | 1つのメソッドのコードは10行以内に収めること |
| 9-26 | 【統一】 | パラメータリストは最大5個までにする |
| 9-27 | 【統一】 | 「グローバルな」メソッドがどうしても必要な場合は、Kernelクラスのprivateメソッドにすること |
| 9-28 | 【統一】 | グローバル変数は使わないこと: 必要な場合はモジュールのインスタンス変数を使う |
| 9-29 | 【統一】 | コマンドラインオプションが複雑になったらOptionParserを使い、細かなオプションではruby -sを使う |
| 9-30 | 【統一】 | 理由がない限り、状態の保持を避けて関数的に書くこと |
| 9-31 | 【統一】 | 受け取ったパラメータを変更しないこと(破壊的なメソッドを除く) |
| 9-32 | 【統一】 | ブロックのネストは3階層までにする |
| 9-33 | 【統一】 | コーディングスタイルを一貫させること |
| 9-34 | 【統一】 | 常識を働かせること |
凡例
本スタイルガイドのコード例で使われている英数字と記号はすべてASCII(半角文字)です。本文中のみあえて全角丸かっこ()を使うことがあります。
原文にはありませんが、各スタイルや解説の冒頭に以下のカテゴリを追加します。
カテゴリの前には「章番号-項番号」形式の通し番号とパーマネントリンクを追加します。
- 【統一】: Rubyで利用できる複数の記法を統一する指示です(狭い意味でのスタイルガイド)
- 【選択】: 案件や現状に応じて選んでよいスタイルを示します
- 【必須】: Rubyの特定の機能などで必須の記法を示します(スタイルよりも意味が強い)
- 【禁止】: Rubyでどんな場合にも使ってはならない禁止事項を示します(スタイルよりも意味が強い)
- 【例外】: スタイルや禁止事項などの例外を示します
- 【目安】: スタイルよりも制約の少ない目安を示します
- 【ヒント】: スタイルに限定されない、知っておくと有用な知識であることを示します