├── .gitattributes
├── CONTRIBUTING.md
└── README.ja.md
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.md whitespace=trailing-space,tab-in-indent
2 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | * [Fork](https://help.github.com/articles/fork-a-repo) the project on GitHub.
2 | * Make your feature addition or bug fix in a feature branch. (Include a description of your changes)
3 | * Push your feature branch to GitHub.
4 | * Send a [Pull Request](https://help.github.com/articles/using-pull-requests).
--------------------------------------------------------------------------------
/README.ja.md:
--------------------------------------------------------------------------------
1 | # はじめに
2 |
3 | > ロールモデルが重要なのだ。
4 | > -- アレックス・マーフィー巡査 / ロボコップ
5 |
6 | Rubyディベロッパーとして、私は常にあることに悩まされてきました —
7 | Pythonにはプログラミングスタイルのすばらしい基準 ([PEP-8][]) がある一方で、
8 | Rubyにはコーディングスタイルやベストプラクティスに関する公式のガイドがこれまで存在してきませんでした。
9 | 私にはスタイルは重要なことだとしか思われないのにです。
10 | Rubyが持っているような素晴らしいハッカーコミュニティは、
11 | 誰もが羨むようなドキュメントを作り出す力があるはずなのにです。
12 |
13 | このガイドは、私達の社内製Rubyコーディング規約から生まれました
14 | (著者は[私](https://github.com/bbatsov))。
15 | しかし仕事をするうちに、自分の仕事はRubyコミュニティの人たち全員に興味を持ってもらえるものではないかと思い始めました。
16 | また、内製コーディング規約といったものをこの惑星はこれ以上必要としていないのではないかとの思いもありました。
17 | そうではない、コミュニティ駆動の、コミュニティに認められた、
18 | Rubyのための慣習、語法、スタイル規定は、
19 | 確実にRubyコミュニティに有益たりえると確信したのです。
20 |
21 | このガイドを公開して以来、私は世界中の優れたRubyコミュニティのメンバーから、
22 | たくさんのフィードバックを受けています。
23 | 全ての提案、サポートに感謝します!
24 | お互いに、また全てのRubyディベロッパーにとって有益なリソースを、
25 | 一緒に作ることができています。
26 |
27 | また、もしあなたがRailsのことに興味があるなら、
28 | こちらの補足も確認してみてください。
29 | [Ruby on Rails Style Guide][rails-style-guide].
30 |
31 | # The Ruby Style Guide
32 |
33 | このRubyスタイルガイドでおすすめしているベストプラクティスは、実在のRubyプログラマが他の実在のRubyプログラマのために、メンテナンスしやすいコードを書いていくためのものです。
34 | 実社会での使われ方を反映したスタイルガイドは、実社会で使われるし、
35 | たとえそれがどんなに素晴らしい理想であっても、
36 | 利用者が拒絶するようなスタイルに固執するスタイルガイドは結局全く使われなくなる危険性があります。
37 |
38 | このガイドは、関連するルールごとにいくつかのセクションに分かれています。
39 | ルールの後ろにその根拠も付け加えるように努めています
40 | (そのような根拠が省略されているときは、自明のものと判断したとお考えください)。
41 |
42 | 私はこれら全てのルールをどこからともなく考えついたわけではありません —
43 | これらのほとんどは、私の職業SEとしての長い経験と、
44 | Rubyコミュニティのメンバーからの意見や提案、
45 | また、["Programming Ruby"][pickaxe]や、
46 | ["The Ruby Programming Language"][trpl]のような、
47 | 様々な評価の高いRubyプログラミング関連資料に基づいています。
48 |
49 | Rubyコミュニティ内でもスタイルについての統一見解が存在しないという領域もいくらか存在します
50 | (文字列リテラルの引用記号、ハッシュリテラルの内側のスペース、複数行のメソッドチェーンのドットの位置、などなど)。
51 | そのようなシナリオでは、いずれの有力なスタイルも許容されるので、
52 | どれを選んで、一貫して用いるかはあなた次第です。
53 |
54 | 新たな慣習が生まれたり、Ruby自身が変化することで慣習が時代遅れになったりしたことに従いながら、このガイドは時代とともに進化してきました。
55 |
56 | 多くのプロジェクトは、それ自身のコーディング規約を持っています
57 | (しばしばこのガイドを基に生成されています)。
58 | ルールの衝突が発生した場合は、
59 | そのプロジェクトにおいては、プロジェクト固有のガイドを優先してください。
60 |
61 | このガイドのPDFやHTMLのコピーは[Pandoc][]を使って生成できます。
62 |
63 | [RuboCop][]は、
64 | このスタイルガイドに基づいたコード分析器です。
65 |
66 | 以下の言語の翻訳が利用可能です:
67 |
68 | * [中国語(簡体)](https://github.com/JuanitoFatas/ruby-style-guide/blob/master/README-zhCN.md)
69 | * [中国語(繁体)](https://github.com/JuanitoFatas/ruby-style-guide/blob/master/README-zhTW.md)
70 | * [アラビア語エジプト方言](https://github.com/HassanTC/ruby-style-guide/blob/master/README-EgAr.md)
71 | * [フランス語](https://github.com/gauthier-delacroix/ruby-style-guide/blob/master/README-frFR.md)
72 | * [日本語](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md)
73 | * [韓国語](https://github.com/dalzony/ruby-style-guide/blob/master/README-koKR.md)
74 | * [ポルトガル語 (pt-BR)](https://github.com/rubensmabueno/ruby-style-guide/blob/master/README-PT-BR.md)
75 | * [ロシア語](https://github.com/arbox/ruby-style-guide/blob/master/README-ruRU.md)
76 | * [スペイン語](https://github.com/alemohamad/ruby-style-guide/blob/master/README-esLA.md)
77 | * [ベトナム語](https://github.com/CQBinh/ruby-style-guide/blob/master/README-viVN.md)
78 |
79 | ## 目次
80 |
81 | * [レイアウト](#レイアウト)
82 | * [構文](#構文)
83 | * [命名規則](#命名規則)
84 | * [コメント](#コメント)
85 | * [注釈](#注釈)
86 | * [マジックコメント](#マジックコメント)
87 | * [クラスとモジュール](#クラスとモジュール)
88 | * [例外](#例外)
89 | * [コレクション](#コレクション)
90 | * [数値](#数値)
91 | * [文字列](#文字列)
92 | * [日時](#日時)
93 | * [正規表現](#正規表現)
94 | * [パーセントリテラル](#パーセントリテラル)
95 | * [メタプログラミング](#メタプログラミング)
96 | * [雑則](#雑則)
97 | * [ツール](#ツール)
98 |
99 | ## レイアウト
100 |
101 | > ほとんどすべての人が、彼ら自身のものを除くすべてのスタイルが
102 | > 醜くて、読むに耐えないと確信している。
103 | > 「彼ら自身のものを除く」を除けば、おそらく正しいのだが…
104 | > -- Jerry Coffin (インデントについて)
105 |
106 | *
107 | ソースファイルのエンコーディングには`UTF-8`を用いましょう。
108 | [[link](#utf-8)]
109 |
110 | *
111 | インデントには **スペース** 2つを用いましょう(別名ソフトタブ)。 ハードタブを用いてはいけません。
112 | [[link](#spaces-indentation)]
113 |
114 | ```ruby
115 | # 悪い例 - 4つのスペース
116 | def some_method
117 | do_something
118 | end
119 |
120 | # 良い例
121 | def some_method
122 | do_something
123 | end
124 | ```
125 |
126 | *
127 | Unix-styleの改行にしましょう。
128 | (\*BSD/Solaris/Linux/macOS ユーザーはデフォルトで設定されています。
129 | Windows ユーザーは特に注意が必要です。)
130 | [[link](#crlf)]
131 |
132 | * もしGitを使っていれば、プロジェクトにWindowsの改行が紛れ込まないように、以下の設定を追加したほうがよいかもしれません:
133 |
134 | ```bash
135 | $ git config --global core.autocrlf true
136 | ```
137 |
138 | *
139 | 命令文や式の区切りに`;`を用いてはいけません。
140 | 当然、1行につき式1つにしましょう。
141 | [[link](#no-semicolon)]
142 |
143 | ```ruby
144 | # 悪い例
145 | puts 'foobar'; # 余分なセミコロンです
146 |
147 | puts 'foo'; puts 'bar' # 2つの式が1行にあります
148 |
149 | # 良い例
150 | puts 'foobar'
151 |
152 | puts 'foo'
153 | puts 'bar'
154 |
155 | puts 'foo', 'bar' # putsの場合はこれも可です
156 | ```
157 |
158 | *
159 | 本文のないクラスは1行のフォーマットを用いましょう。
160 | [[link](#single-line-classes)]
161 |
162 | ```ruby
163 | # 悪い例
164 | class FooError < StandardError
165 | end
166 |
167 | # 悪くない例
168 | class FooError < StandardError; end
169 |
170 | # 良い例
171 | FooError = Class.new(StandardError)
172 | ```
173 |
174 | *
175 | 1行のメソッドは避けましょう。
176 | この用法は実際にはよく見かけるものではあるのですが、
177 | 構文に奇妙な点があるため、使用は望ましくないです。
178 | 仮に使うとしても、
179 | 1行メソッドに含めるのは多くとも式1つまでにすべきです。
180 | [[link](#no-single-line-methods)]
181 |
182 | ```ruby
183 | # 悪い例
184 | def too_much; something; something_else; end
185 |
186 | # 悪くない例 - 最初の ; は必要です
187 | def no_braces_method; body end
188 |
189 | # 悪くない例 - 2つ目の ; は任意です
190 | def no_braces_method; body; end
191 |
192 | # 悪くない例 - 文法上は正しいです、ただし; がない記述は少し読みづらいです
193 | def some_method() body end
194 |
195 | # 良い例
196 | def some_method
197 | body
198 | end
199 | ```
200 |
201 | 本文が空のメソッドはこのルールの例外です。
202 |
203 | ```ruby
204 | # 良い例
205 | def no_op; end
206 | ```
207 |
208 | *
209 | 演算子の前後、コンマ、コロン、セミコロンの後ろにはスペースを入れましょう。
210 | スペースはRubyのインタープリタには(ほとんどの場合)重要ではありませんが、
211 | スペースの適切な使用は、読みやすいコードを書くための鍵です。
212 | [[link](#spaces-operators)]
213 |
214 | ```ruby
215 | sum = 1 + 2
216 | a, b = 1, 2
217 | class FooError < StandardError; end
218 | ```
219 |
220 | 演算子について、いくつか例外があります。まずは、指数演算子です:
221 |
222 | ```ruby
223 | # 悪い例
224 | e = M * c ** 2
225 |
226 | # 良い例
227 | e = M * c**2
228 | ```
229 |
230 | 同様に、有理数のリテラル(rational literals)も例外です:
231 |
232 | ```ruby
233 | # 悪い例
234 | o_scale = 1 / 48r
235 |
236 | # 良い例
237 | o_scale = 1/48r
238 | ```
239 |
240 | 同様に、safe navigation operator(ぼっち演算子)も例外です:
241 | ```ruby
242 | # 悪い例
243 | foo &. bar
244 | foo &.bar
245 | foo&. bar
246 |
247 | # 良い例
248 | foo&.bar
249 | ```
250 |
251 | *
252 | `(`, `[`の後ろ、`]`, `)`の前にはスペースは入れません。
253 | `{`の前後、`}`の前にはスペースが必要です。
254 | [[link](#spaces-braces)]
255 |
256 | ```ruby
257 | # 悪い例
258 | some( arg ).other
259 | [ 1, 2, 3 ].each{|e| puts e}
260 |
261 | # 良い例
262 | some(arg).other
263 | [1, 2, 3].each { |e| puts e }
264 | ```
265 |
266 | `{` と `}` については多少の解説が必要でしょう。
267 | ブロック、ハッシュリテラル、そして文字列埋め込み式にそれぞれ使われるからです。
268 |
269 | ハッシュリテラルでは、2つのスタイルが許容できます。
270 | 1つ目の書き方は、わずかながら少し読みやすいです(そして、Rubyコミュニティでより広く使われているのはこちらかもしれません)。
271 | 2つ目の書き方は、ブロックとハッシュを視覚的に差別化できるという点で有利です。
272 | どちらでも片方を採用すれば、常に同じ方式を採用しましょう。
273 |
274 | ```ruby
275 | # 良い例 - スペースを { の後と } の前に入れる
276 | { one: 1, two: 2 }
277 |
278 | # 良い例 - スペースを { の後と } の前に入れない
279 | {one: 1, two: 2}
280 | ```
281 |
282 | 文字列埋め込み式では、中括弧の内側に空白を入れないでください。
283 |
284 | ```ruby
285 | # 悪い例
286 | "From: #{ user.first_name }, #{ user.last_name }"
287 |
288 | # 良い例
289 | "From: #{user.first_name}, #{user.last_name}"
290 | ```
291 |
292 | *
293 | `!`の後にはスペースは入れません。
294 | [[link](#no-space-bang)]
295 |
296 | ```ruby
297 | # 悪い例
298 | ! something
299 |
300 | # 良い例
301 | !something
302 | ```
303 |
304 | *
305 | 範囲リテラルの内側にスペースは入れません。
306 | [[link](#no-space-inside-range-literals)]
307 |
308 | ```ruby
309 | # 悪い例
310 | 1 .. 3
311 | 'a' ... 'z'
312 |
313 | # 良い例
314 | 1..3
315 | 'a'...'z'
316 | ```
317 |
318 | *
319 | `when`は`case`と同じ深さに揃えましょう。
320 | このスタイルは"The Ruby Programming Language"と"Programming Ruby"の双方で確立されたものです。
321 | `case`及び`switch`をインデントしないのは、
322 | もともとこれらはブロックにならないという事実から来ています。
323 | また、`when`及び`else`キーワードはラベルです。
324 | (C言語においては、これらは`JMP`命令のためのラベルにすぎません)
325 | [[link](#indent-when-to-case)]
326 |
327 | ```ruby
328 | # 悪い例
329 | case
330 | when song.name == 'Misty'
331 | puts 'Not again!'
332 | when song.duration > 120
333 | puts 'Too long!'
334 | when Time.now.hour > 21
335 | puts "It's too late"
336 | else
337 | song.play
338 | end
339 |
340 | # 良い例
341 | case
342 | when song.name == 'Misty'
343 | puts 'Not again!'
344 | when song.duration > 120
345 | puts 'Too long!'
346 | when Time.now.hour > 21
347 | puts "It's too late"
348 | else
349 | song.play
350 | end
351 | ```
352 |
353 | *
354 | 条件式を変数に代入するときは、
355 | 条件分岐のインデントは普段と同じ基準で揃えましょう。
356 | [[link](#indent-conditional-assignment)]
357 |
358 | ```ruby
359 | # 悪い例 - かなり複雑です
360 | kind = case year
361 | when 1850..1889 then 'Blues'
362 | when 1890..1909 then 'Ragtime'
363 | when 1910..1929 then 'New Orleans Jazz'
364 | when 1930..1939 then 'Swing'
365 | when 1940..1950 then 'Bebop'
366 | else 'Jazz'
367 | end
368 |
369 | result = if some_cond
370 | calc_something
371 | else
372 | calc_something_else
373 | end
374 |
375 | # 良い例 - 何が行われているか明らかです
376 | kind = case year
377 | when 1850..1889 then 'Blues'
378 | when 1890..1909 then 'Ragtime'
379 | when 1910..1929 then 'New Orleans Jazz'
380 | when 1930..1939 then 'Swing'
381 | when 1940..1950 then 'Bebop'
382 | else 'Jazz'
383 | end
384 |
385 | result = if some_cond
386 | calc_something
387 | else
388 | calc_something_else
389 | end
390 |
391 | # 良い例 (少しだけ幅の効率がよいです)
392 | kind =
393 | case year
394 | when 1850..1889 then 'Blues'
395 | when 1890..1909 then 'Ragtime'
396 | when 1910..1929 then 'New Orleans Jazz'
397 | when 1930..1939 then 'Swing'
398 | when 1940..1950 then 'Bebop'
399 | else 'Jazz'
400 | end
401 |
402 | result =
403 | if some_cond
404 | calc_something
405 | else
406 | calc_something_else
407 | end
408 | ```
409 |
410 | *
411 | メソッド定義式の間には空行をいれ、
412 | メソッド同士は論理的なかたまりに分けましょう。
413 | [[link](#empty-lines-between-methods)]
414 |
415 | ```ruby
416 | def some_method
417 | data = initialize(options)
418 |
419 | data.manipulate!
420 |
421 | data.result
422 | end
423 |
424 | def some_method
425 | result
426 | end
427 | ```
428 |
429 | *
430 | 空行を複数連続して用いてはいけません。
431 | [[link](#two-or-more-empty-lines)]
432 |
433 | ```ruby
434 | # 悪い例 - 空行が2つあります
435 | some_method
436 |
437 |
438 | some_method
439 |
440 | # 良い例
441 | some_method
442 |
443 | some_method
444 | ```
445 |
446 | *
447 | アクセス修飾子の前後には空行を用いましょう。
448 | [[link](#empty-lines-around-access-modifier)]
449 |
450 | ```ruby
451 | # 悪い例
452 | class Foo
453 | attr_reader :foo
454 | def foo
455 | # do something...
456 | end
457 | end
458 |
459 | # 良い例
460 | class Foo
461 | attr_reader :foo
462 |
463 | def foo
464 | # do something...
465 | end
466 | end
467 | ```
468 |
469 | *
470 | メソッド、クラス、モジュール、ブロックの本文の前後には、空行を用いてはいけません。
471 | [[link](#empty-lines-around-bodies)]
472 |
473 | ```ruby
474 | # 悪い例
475 | class Foo
476 |
477 | def foo
478 |
479 | begin
480 |
481 | do_something do
482 |
483 | something
484 |
485 | end
486 |
487 | rescue
488 |
489 | something
490 |
491 | end
492 |
493 | end
494 |
495 | end
496 |
497 | # 良い例
498 | class Foo
499 | def foo
500 | begin
501 | do_something do
502 | something
503 | end
504 | rescue
505 | something
506 | end
507 | end
508 | end
509 | ```
510 |
511 | *
512 | メソッド呼び出しの最後の引数の後ろのコンマは避けましょう。
513 | 引数が複数行にわかれていない時は、特に避けましょう。
514 | [[link](#no-trailing-params-comma)]
515 |
516 | ```ruby
517 | # 悪い例 - 簡単に引数を移動・追加・削除できますが、それでもお奨めできません
518 | some_method(
519 | size,
520 | count,
521 | color,
522 | )
523 |
524 | # 悪い例
525 | some_method(size, count, color, )
526 |
527 | # 良い例
528 | some_method(size, count, color)
529 | ```
530 |
531 | *
532 | メソッドの引数に初期値を割り当てるとき、
533 | `=`演算子の周りにはスペースを入れましょう。
534 | [[link](#spaces-around-equals)]
535 |
536 | ```ruby
537 | # 悪い例
538 | def some_method(arg1=:default, arg2=nil, arg3=[])
539 | # do something...
540 | end
541 |
542 | # 良い例
543 | def some_method(arg1 = :default, arg2 = nil, arg3 = [])
544 | # do something...
545 | end
546 | ```
547 |
548 | いくつかのRuby本は最初のスタイルを提案していますが、
549 | 実践的には2つ目の方がより有力とされています。
550 | (そして、おそらくこちらのほうが読みやすいでしょう)
551 |
552 | *
553 | `\`を用いた行の継続は可能であれば避けましょう。
554 | 可能であればというのは、つまり、文字列連結以外のすべての場合でです。
555 | [[link](#no-trailing-backslash)]
556 |
557 | ```ruby
558 | # 悪い例
559 | result = 1 - \
560 | 2
561 |
562 | # 良い例 (ただし、それでも極めて醜い)
563 | result = 1 \
564 | - 2
565 |
566 | long_string = 'First part of the long string' \
567 | ' and second part of the long string'
568 | ```
569 |
570 | *
571 | 一貫した複数行のメソッドチェーンのスタイルを採用しましょう。
572 | Rubyコミュニティには2つのよく使われるスタイル — 先頭に`.`を付けるもの (Option A)、
573 | 末尾に`.`を付けるもの (Option B) — があり、
574 | どちらも良いと考えられています。
575 | [[link](#consistent-multi-line-chains)]
576 |
577 | * **(Option A)** メソッドチェーンを次の行へつなげる時は、
578 | `.`は次の行に置きましょう。
579 |
580 | ```ruby
581 | # 悪い例 - 2行目を理解するのに1行目を調べなければなりません
582 | one.two.three.
583 | four
584 |
585 | # 良い例 - 2行目で何が行われているかすぐに理解できます
586 | one.two.three
587 | .four
588 | ```
589 |
590 | * **(Option B)** メソッドチェーンを次の行につなげる時は、
591 | 式が続くことを示すように最初の行に`.`を置きましょう。
592 |
593 | ```ruby
594 | # 悪い例 - メソッドチェーンが続いているかを知るには、次の行を読む必要があります
595 | one.two.three
596 | .four
597 |
598 | # 良い例 - 最初の行を越えて式が続くか一目瞭然です
599 | one.two.three.
600 | four
601 | ```
602 |
603 | 双方のスタイルのメリットに関する議論は[こちら](https://github.com/rubocop-hq/ruby-style-guide/pull/176)で見ることができます。
604 |
605 | *
606 | メソッド呼び出しが複数行に及ぶときは、引数は揃えましょう。
607 | 1行の長さの制約のために、引数を揃えるのに適していない時は、
608 | 最初の引数以降をインデント1つ分で揃えるスタイルも許容できます。
609 | [[link](#no-double-indent)]
610 |
611 | ```ruby
612 | # 初期状態 (1行がとても長いです)
613 | def send_mail(source)
614 | Mailer.deliver(to: 'bob@example.com', from: 'us@example.com', subject: 'Important message', body: source.text)
615 | end
616 |
617 | # 悪い例 (インデントが倍)
618 | def send_mail(source)
619 | Mailer.deliver(
620 | to: 'bob@example.com',
621 | from: 'us@example.com',
622 | subject: 'Important message',
623 | body: source.text)
624 | end
625 |
626 | # 良い例
627 | def send_mail(source)
628 | Mailer.deliver(to: 'bob@example.com',
629 | from: 'us@example.com',
630 | subject: 'Important message',
631 | body: source.text)
632 | end
633 |
634 | # 良い例 (通常のインデントです)
635 | def send_mail(source)
636 | Mailer.deliver(
637 | to: 'bob@example.com',
638 | from: 'us@example.com',
639 | subject: 'Important message',
640 | body: source.text
641 | )
642 | end
643 | ```
644 |
645 | *
646 | 複数行に及ぶ配列は、要素を揃えましょう。
647 | [[link](#align-multiline-arrays)]
648 |
649 | ```ruby
650 | # 悪い例 - インデント1つです
651 | menu_item = %w[Spam Spam Spam Spam Spam Spam Spam Spam
652 | Baked beans Spam Spam Spam Spam Spam]
653 |
654 | # 良い例
655 | menu_item = %w[
656 | Spam Spam Spam Spam Spam Spam Spam Spam
657 | Baked beans Spam Spam Spam Spam Spam
658 | ]
659 |
660 | # 良い例
661 | menu_item =
662 | %w[Spam Spam Spam Spam Spam Spam Spam Spam
663 | Baked beans Spam Spam Spam Spam Spam]
664 | ```
665 |
666 | *
667 | 可読性のため、大きな数値にはアンダースコアをつけましょう。
668 | [[link](#underscores-in-numerics)]
669 |
670 | ```ruby
671 | # 悪い例 - 0はいくつありますか?
672 | num = 1000000
673 |
674 | # 良い例 - 人の頭でもより簡単に解析できます
675 | num = 1_000_000
676 | ```
677 |
678 | *
679 | 数値リテラルのプレフィックスには、英小文字を使用しましょう。
680 | 8進数には`0o`を、16進数には`0x`を、2進数には`0b`を使用します。
681 | 10進数には`0d`を使用しません。
682 | [[link](#numeric-literal-prefixes)]
683 |
684 | ```ruby
685 | # 悪い例
686 | num = 01234
687 | num = 0O1234
688 | num = 0X12AB
689 | num = 0B10101
690 | num = 0D1234
691 | num = 0d1234
692 |
693 | # good - プレフィックスと数字の分離が容易
694 | num = 0o1234
695 | num = 0x12AB
696 | num = 0b10101
697 | num = 1234
698 | ```
699 |
700 | *
701 | APIドキュメントを書くなら、[YARD][yard]とその規約に従いましょう。
702 | コメント行と`def`の間に空行を入れてはいけません。
703 | [[link](#api-documentation)]
704 |
705 | *
706 | 1行は80字までにしましょう。
707 | [[link](#80-character-limits)]
708 |
709 | *
710 | 行末のスペースは避けましょう。
711 | [[link](#no-trailing-whitespace)]
712 |
713 | *
714 | ファイルの終端には改行を入れましょう。
715 | [[link](#newline-eof)]
716 |
717 | *
718 | ブロックコメントは使ってはいけません。
719 | 前にスペースが入ると機能しませんし、
720 | 通常のコメントと違い、簡単に見分けが付きません。
721 | [[link](#no-block-comments)]
722 |
723 | ```ruby
724 | # 悪い例
725 | =begin
726 | comment line
727 | another comment line
728 | =end
729 |
730 | # 良い例
731 | # comment line
732 | # another comment line
733 | ```
734 |
735 | ## 構文
736 |
737 | *
738 | `::`は、定数(クラスやモジュールも含みます)や
739 | コンストラクタ(例えば`Array()`や`Nokogiri::HTML()`)を参照するときにのみ使いましょう。
740 | 通常のメソッド呼び出しでは`::`の使用は避けましょう。
741 | [[link](#double-colons)]
742 |
743 | ```ruby
744 | # 悪い例
745 | SomeClass::some_method
746 | some_object::some_method
747 |
748 | # 良い例
749 | SomeClass.some_method
750 | some_object.some_method
751 | SomeModule::SomeClass::SOME_CONST
752 | SomeModule::SomeClass()
753 | ```
754 |
755 | *
756 | クラスメソッドを定義する目的で`::`を使ってはいけません。
757 | [[link](#colon-method-definition)]
758 |
759 | ```ruby
760 | # 悪い例
761 | class Foo
762 | def self::some_method
763 | end
764 | end
765 |
766 | # 良い例
767 | class Foo
768 | def self.some_method
769 | end
770 | end
771 | ```
772 |
773 | *
774 | 引数があるとき、`def`は括弧と共に使いましょう。
775 | 引数がない場合は括弧は省略しましょう。
776 | [[link](#method-parens)]
777 |
778 | ```ruby
779 | # 悪い例
780 | def some_method()
781 | # 本文省略
782 | end
783 |
784 | # 良い例
785 | def some_method
786 | # 本文省略
787 | end
788 |
789 | # 悪い例
790 | def some_method_with_parameters param1, param2
791 | # 本文省略
792 | end
793 |
794 | # 良い例
795 | def some_method_with_parameters(param1, param2)
796 | # 本文省略
797 | end
798 | ```
799 |
800 | *
801 | メソッド呼び出しの引数の周りに括弧を使用しましょう。
802 | `f((3 + 2) + 1)`のようにメソッドの最初の引数が開き括弧で始まる場合は、
803 | 特に括弧を用いましょう。
804 | [[link](#method-invocation-parens)]
805 |
806 | ```ruby
807 | # 悪い例
808 | x = Math.sin y
809 | # 良い例
810 | x = Math.sin(y)
811 |
812 | # 悪い例
813 | array.delete e
814 | # 良い例
815 | array.delete(e)
816 |
817 | # 悪い例
818 | temperance = Person.new 'Temperance', 30
819 | # 良い例
820 | temperance = Person.new('Temperance', 30)
821 | ```
822 |
823 | 以下の場合は常に括弧を省略します
824 |
825 | * 引数のないメソッド:
826 |
827 | ```ruby
828 | # 悪い例
829 | Kernel.exit!()
830 | 2.even?()
831 | fork()
832 | 'test'.upcase()
833 |
834 | # 良い例
835 | Kernel.exit!
836 | 2.even?
837 | fork
838 | 'test'.upcase
839 | ```
840 |
841 | * 内部DSLに含まれるメソッド(例えばRake, Rails, RSpec):
842 |
843 | ```ruby
844 | # 悪い例
845 | validates(:name, presence: true)
846 | # 良い例
847 | validates :name, presence: true
848 | ```
849 |
850 | * Rubyで「キーワード」と認識されているメソッド:
851 |
852 | ```ruby
853 | class Person
854 | # 悪い例
855 | attr_reader(:name, :age)
856 | # 良い例
857 | attr_reader :name, :age
858 |
859 | # body omitted
860 | end
861 | ```
862 |
863 | 以下の場合は括弧を省略することができます
864 |
865 | * Rubyで「キーワード」と認識されているが、宣言的ではないメソッド:
866 |
867 | ```Ruby
868 | # 良い例
869 | puts(temperance.age)
870 | system('ls')
871 | # こちらも良い例
872 | puts temperance.age
873 | system 'ls'
874 | ```
875 |
876 | *
877 | オプショナル引数は引数リストの最後に定義しましょう。
878 | 引数リストの先頭にオプショナル引数があるメソッドを呼んだ場合、
879 | Rubyの挙動は予測不能です。
880 | [[link](#optional-arguments)]
881 |
882 | ```ruby
883 | # 悪い例
884 | def some_method(a = 1, b = 2, c, d)
885 | puts "#{a}, #{b}, #{c}, #{d}"
886 | end
887 |
888 | some_method('w', 'x') # => '1, 2, w, x'
889 | some_method('w', 'x', 'y') # => 'w, 2, x, y'
890 | some_method('w', 'x', 'y', 'z') # => 'w, x, y, z'
891 |
892 | # 良い例
893 | def some_method(c, d, a = 1, b = 2)
894 | puts "#{a}, #{b}, #{c}, #{d}"
895 | end
896 |
897 | some_method('w', 'x') # => '1, 2, w, x'
898 | some_method('w', 'x', 'y') # => 'y, 2, w, x'
899 | some_method('w', 'x', 'y', 'z') # => 'y, z, w, x'
900 | ```
901 | *
902 | メソッドにbooleanを渡す時にはキーワード引数を使いましょう。
903 |
904 | ```Ruby
905 | # 悪い例
906 | def some_method(bar = false)
907 | puts bar
908 | end
909 |
910 | # 悪い例 - キーワード引数が導入される以前によく見られたハックです
911 | def some_method(options = {})
912 | bar = options.fetch(:bar, false)
913 | puts bar
914 | end
915 |
916 | # 良い例
917 | def some_method(bar: false)
918 | puts bar
919 | end
920 |
921 | some_method # => false
922 | some_method(bar: true) # => true
923 | ```
924 |
925 | *
926 | オプショナル引数のハッシュではなくキーワード引数を使いましょう。
927 |
928 | ```Ruby
929 | # 悪い例
930 | def some_method(options = {})
931 | bar = options.fetch(:bar, false)
932 | puts bar
933 | end
934 |
935 | # 良い例
936 | def some_method(bar: false)
937 | puts bar
938 | end
939 | ```
940 |
941 | *
942 | 変数を定義するために多重代入を使うのは避けましょう。
943 | 多重代入を使っていいのはメソッド戻り値を変数に代入する時、
944 | splat演算子とともに使う時、
945 | 変数の値を相互に入れ替えたい時に限ります。
946 | 多重代入は代入をそれぞれ別に実施した場合と比べて可読性に劣ります。
947 | [[link](#parallel-assignment)]
948 |
949 | ```ruby
950 | # 悪い例
951 | a, b, c, d = 'foo', 'bar', 'baz', 'foobar'
952 |
953 | # 良い例
954 | a = 'foo'
955 | b = 'bar'
956 | c = 'baz'
957 | d = 'foobar'
958 |
959 | # 良い例 - 変数の値の入れ替え
960 | # この用法は変数に入っている値を相互に入れ替えることができるので
961 | # 特例として認められます。
962 | a = 'foo'
963 | b = 'bar'
964 |
965 | a, b = b, a
966 | puts a # => 'bar'
967 | puts b # => 'foo'
968 |
969 | # 良い例 - メソッドの戻り値
970 | def multi_return
971 | [1, 2]
972 | end
973 |
974 | first, second = multi_return
975 |
976 | # 良い例 - splatとともに使う場合
977 | first, *list = [1, 2, 3, 4] # first => 1, list => [2, 3, 4]
978 |
979 | hello_array = *'Hello' # => ["Hello"]
980 |
981 | a = *(1..3) # => [1, 2, 3]
982 | ```
983 |
984 | *
985 | 多重代入においては不要なアンダースコア変数を後ろに並べないようにしましょう。
986 | アンダースコア変数は名前が付いていたほうがコンテキストを明示できるので、
987 | 名前をつけておいたほうが良いでしょう。
988 | アンダースコア変数は、その代入より左にスプラット変数が存在する場合には必要です。
989 | その場合、スプラット変数はアンダースコア変数ではありません。
990 | [[link]](#trailing-underscore-variables)
991 |
992 | ```ruby
993 | # 悪い例
994 | foo = 'one,two,three,four,five'
995 | # 有用な情報を提供しない不要な代入です。
996 | first, second, _ = foo.split(',')
997 | first, _, _ = foo.split(',')
998 | first, *_ = foo.split(',')
999 |
1000 | # 良い例
1001 | foo = 'one,two,three,four,five'
1002 | # このアンダースコア変数は、最後の要素を除いた全ての要素が必要で
1003 | # あることを示すために必要です。
1004 | *beginning, _ = foo.split(',')
1005 | *beginning, something, _ = foo.split(',')
1006 |
1007 | a, = foo.split(',')
1008 | a, b, = foo.split(',')
1009 | # 未使用変数への代入は必須ではありませんが、この代入は有用な情報を
1010 | # 提供します。
1011 | first, _second = foo.split(',')
1012 | first, _second, = foo.split(',')
1013 | first, *_ending = foo.split(',')
1014 | ```
1015 |
1016 | *
1017 | `for`は、どうしても使わなければいけない明確な理由が明言できる人以外は、使ってはいけません。
1018 | 多くの場合は代わりにイテレータを使うべきです。
1019 | `for`は`each`をつかって実装されています(だから、より遠回しです)が、
1020 | `for`は(`each`と違い)新しいスコープを導入せず、
1021 | そのブロック内で定義された変数は、ブロックの外からも見えます。
1022 | [[link](#no-for-loops)]
1023 |
1024 | ```ruby
1025 | arr = [1, 2, 3]
1026 |
1027 | # 悪い例
1028 | for elem in arr do
1029 | puts elem
1030 | end
1031 |
1032 | # elemはループの外からも参照できることに注意しましょう
1033 | elem # => 3
1034 |
1035 | # 良い例
1036 | arr.each { |elem| puts elem }
1037 |
1038 | # elemはeachブロックの外からは参照できません
1039 | elem # => NameError: undefined local variable or method `elem'
1040 | ```
1041 |
1042 | *
1043 | `then`は複数行にまたがる`if`/`unless`では使ってはいけません。
1044 | [[link](#no-then)]
1045 |
1046 | ```ruby
1047 | # 悪い例
1048 | if some_condition then
1049 | # 本文省略
1050 | end
1051 |
1052 | # 良い例
1053 | if some_condition
1054 | # 本文省略
1055 | end
1056 | ```
1057 |
1058 | *
1059 | 複数行にまたがる`if`/`unless`では、条件式は常に`if`/`unless`と同じ行に置きましょう。
1060 | [[link](#same-line-condition)]
1061 |
1062 | ```ruby
1063 | # 悪い例
1064 | if
1065 | some_condition
1066 | do_something
1067 | do_something_else
1068 | end
1069 |
1070 | # 良い例
1071 | if some_condition
1072 | do_something
1073 | do_something_else
1074 | end
1075 | ```
1076 |
1077 | *
1078 | 三項演算子(`?:`)を`if/then/else/end`構文よりも優先的に使いましょう。
1079 | そちらの方がより一般的だし、あきらかに簡潔です。
1080 | [[link](#ternary-operator)]
1081 |
1082 | ```ruby
1083 | # 悪い例
1084 | result = if some_condition then something else something_else end
1085 |
1086 | # 良い例
1087 | result = some_condition ? something : something_else
1088 | ```
1089 |
1090 | *
1091 | 三項演算子の1つの分岐には1つだけ式を入れましょう。
1092 | つまり、三項演算子はネストしてはいけません。
1093 | そのようなケースでは`if/else`の方がよいです。
1094 | [[link](#no-nested-ternary)]
1095 |
1096 | ```ruby
1097 | # 悪い例
1098 | some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else
1099 |
1100 | # 良い例
1101 | if some_condition
1102 | nested_condition ? nested_something : nested_something_else
1103 | else
1104 | something_else
1105 | end
1106 | ```
1107 |
1108 | *
1109 | `if x; ...`を使ってはいけません。代わりに三項演算子を使いましょう。
1110 | [[link](#no-semicolon-ifs)]
1111 |
1112 | ```ruby
1113 | # 悪い例
1114 | result = if some_condition; something else something_else end
1115 |
1116 | # 良い例
1117 | result = some_condition ? something : something_else
1118 | ```
1119 |
1120 | *
1121 | `if`や`case`が式で、値を返すという事実を活用しましょう。
1122 | [[link](#use-if-case-returns)]
1123 |
1124 | ```ruby
1125 | # 悪い例
1126 | if condition
1127 | result = x
1128 | else
1129 | result = y
1130 | end
1131 |
1132 | # 良い例
1133 | result =
1134 | if condition
1135 | x
1136 | else
1137 | y
1138 | end
1139 | ```
1140 |
1141 | *
1142 | 1行の`case`文では`when x then ...`を使いましょう。
1143 | 代わりの表現である`when x: ...`は、Ruby 1.9で廃止されました。
1144 | [[link](#one-line-cases)]
1145 |
1146 | *
1147 | `when x; ...`を使ってはいけません。前のルールを見てください。
1148 | [[link](#no-when-semicolons)]
1149 |
1150 | *
1151 | `not`の代わりに`!`を使いましょう。
1152 | [[link](#bang-not-not)]
1153 |
1154 | ```ruby
1155 | # 悪い例 - 演算子優先順位のため、()が必要になります
1156 | x = (not something)
1157 |
1158 | # 良い例
1159 | x = !something
1160 | ```
1161 |
1162 | *
1163 | `!!`は避けましょう。
1164 | [[link](#no-bang-bang)]
1165 |
1166 | `!!`は値をbooleanに変換しますが、制御式の条件で明示的な変換は必要ありません。
1167 | あなたの意図を隠すだけです。
1168 | `nil`チェックをしたい場合、代わりに`nil?`を使用しましょう。
1169 |
1170 | ```ruby
1171 | # 悪い例
1172 | x = 'test'
1173 | # 難読なnil判定
1174 | if !!x
1175 | # body omitted
1176 | end
1177 |
1178 | # 良い例
1179 | x = 'test'
1180 | if x
1181 | # body omitted
1182 | end
1183 | ```
1184 |
1185 | *
1186 | `and`と`or`の使用は禁止です。可読性を良くするとしても、バグを埋め込む可能性が高いため使用に値しません。
1187 | boolean式では常に、代わりに`&&`と`||`を使いましょう。
1188 | フロー制御では`if`と`unless`を使いましょう。`&&`と`||`も許容されますが、あまり明確ではありません。
1189 | [[link](#no-and-or-or)]
1190 |
1191 | ```ruby
1192 | # 悪い例
1193 | # boolean式
1194 | ok = got_needed_arguments and arguments_are_valid
1195 |
1196 | # 制御構文
1197 | document.save or raise("Failed to save document!")
1198 |
1199 | # 良い例
1200 | # boolean式
1201 | ok = got_needed_arguments && arguments_are_valid
1202 |
1203 | # 制御構文
1204 | raise("Failed to save document!") unless document.save
1205 |
1206 | # ok
1207 | # 制御構文
1208 | document.save || raise("Failed to save document!")
1209 | ```
1210 |
1211 | *
1212 | 複数行にまたがる三項演算子`?:`は避けましょう; 代わりに`if`/`unless`を使いましょう。
1213 | [[link](#no-multiline-ternary)]
1214 |
1215 | *
1216 | 本文が1行のときは、`if`/`unless`修飾子を優先的に使いましょう。
1217 | 他の良い代替案としては`&&`/`||`を使った制御構文があります。
1218 | [[link](#if-as-a-modifier)]
1219 |
1220 | ```ruby
1221 | # 悪い例
1222 | if some_condition
1223 | do_something
1224 | end
1225 |
1226 | # 良い例
1227 | do_something if some_condition
1228 |
1229 | # もう1つの良い例
1230 | some_condition && do_something
1231 | ```
1232 |
1233 | *
1234 | 複数行に渡るような些細とは言えない規模のブロックに`if`/`unless`修飾子を用いるのは避けましょう。
1235 | [[link](#no-multiline-if-modifiers)]
1236 |
1237 | ```ruby
1238 | # 悪い例
1239 | 10.times do
1240 | # 複数行のbody省略
1241 | end if some_condition
1242 |
1243 | # 良い例
1244 | if some_condition
1245 | 10.times do
1246 | # 複数行のbody省略
1247 | end
1248 | end
1249 | ```
1250 |
1251 | *
1252 | `if`/`unless`/`while`/`until` 修飾子をネストして利用しないようにしましょう。
1253 | 可能であれば `&&`/`||` を使いましょう。
1254 | [[link](#no-nested-modifiers)]
1255 |
1256 | ```ruby
1257 | # 悪い例
1258 | do_something if other_condition if some_condition
1259 |
1260 | # 良い例
1261 | do_something if some_condition && other_condition
1262 | ```
1263 |
1264 | *
1265 | 否定形のときは`if`より`unless`を優先的に使いましょう。(もしくは`||`構文を使いましょう)。
1266 | [[link](#unless-for-negatives)]
1267 |
1268 | ```ruby
1269 | # 悪い例
1270 | do_something if !some_condition
1271 |
1272 | # 悪い例
1273 | do_something if not some_condition
1274 |
1275 | # 良い例
1276 | do_something unless some_condition
1277 |
1278 | # もう1つの良い例
1279 | some_condition || do_something
1280 | ```
1281 |
1282 | *
1283 | `unless`を`else`付きで使ってはいけません。
1284 | 肯定条件を先にして書き換えましょう。
1285 | [[link](#no-else-with-unless)]
1286 |
1287 | ```ruby
1288 | # 悪い例
1289 | unless success?
1290 | puts 'failure'
1291 | else
1292 | puts 'success'
1293 | end
1294 |
1295 | # 良い例
1296 | if success?
1297 | puts 'success'
1298 | else
1299 | puts 'failure'
1300 | end
1301 | ```
1302 |
1303 | *
1304 | 条件式の周囲を括弧で括らないようにしましょう。
1305 | [[link](#no-parens-around-condition)]
1306 |
1307 | ```ruby
1308 | # 悪い例
1309 | if (x > 10)
1310 | # body omitted
1311 | end
1312 |
1313 | # 良い例
1314 | if x > 10
1315 | # body omitted
1316 | end
1317 | ```
1318 |
1319 | 留意しなければならないのは、このルールには例外([条件式中の安全な代入](#safe-assignment-in-condition))があるということです。
1320 |
1321 | *
1322 | 複数行の`while/until`では、`while/until condition do`を使ってはいけません。
1323 | [[link](#no-multiline-while-do)]
1324 |
1325 | ```ruby
1326 | # 悪い例
1327 | while x > 5 do
1328 | # 本文省略
1329 | end
1330 |
1331 | until x > 5 do
1332 | # 本文省略
1333 | end
1334 |
1335 | # 良い例
1336 | while x > 5
1337 | # 本文省略
1338 | end
1339 |
1340 | until x > 5
1341 | # 本文省略
1342 | end
1343 | ```
1344 |
1345 | *
1346 | 本文が1行のときは、`while/until`修飾子を利用しましょう。
1347 | [[link](#while-as-a-modifier)]
1348 |
1349 | ```ruby
1350 | # 悪い例
1351 | while some_condition
1352 | do_something
1353 | end
1354 |
1355 | # 良い例
1356 | do_something while some_condition
1357 | ```
1358 |
1359 | *
1360 | 否定形のときは、`while`よりも`until`を使いましょう。
1361 | [[link](#until-for-negatives)]
1362 |
1363 | ```ruby
1364 | # 悪い例
1365 | do_something while !some_condition
1366 |
1367 | # 良い例
1368 | do_something until some_condition
1369 | ```
1370 |
1371 | *
1372 | 無限ループが必要な時は、`while/until`の代わりに`Kernel#loop`を用いましょう。
1373 | [[link](#infinite-loop)]
1374 |
1375 | ```ruby
1376 | # 悪い例
1377 | while true
1378 | do_something
1379 | end
1380 |
1381 | until false
1382 | do_something
1383 | end
1384 |
1385 | # 良い例
1386 | loop do
1387 | do_something
1388 | end
1389 | ```
1390 |
1391 | *
1392 | 後判定ループの場合、`begin/end/until`や`begin/end/while`より、`break`付きの`Kernel#loop`を使いましょう。
1393 | [[link](#loop-with-break)]
1394 |
1395 | ```ruby
1396 | # 悪い例
1397 | begin
1398 | puts val
1399 | val += 1
1400 | end while val < 0
1401 |
1402 | # 良い例
1403 | loop do
1404 | puts val
1405 | val += 1
1406 | break unless val < 0
1407 | end
1408 | ```
1409 |
1410 | *
1411 | 暗黙のオプションハッシュの外側の括弧は省略しましょう。
1412 | [[link](#no-braces-opts-hash)]
1413 |
1414 | ```ruby
1415 | # 悪い例
1416 | user.set({ name: 'John', age: 45, permissions: { read: true } })
1417 |
1418 | # 良い例
1419 | user.set(name: 'John', age: 45, permissions: { read: true })
1420 | ```
1421 |
1422 | *
1423 | 内部DSLの一部として使われるメソッドの引数では、外側の括弧類は省略しましょう
1424 | [[link](#no-dsl-decorating)]
1425 |
1426 | ```ruby
1427 | class Person < ActiveRecord::Base
1428 | # 悪い例
1429 | validates(:name, { presence: true, length: { within: 1..10 } })
1430 |
1431 | # 良い例
1432 | validates :name, presence: true, length: { within: 1..10 }
1433 | end
1434 | ```
1435 |
1436 | *
1437 | ブロック内で呼び出されるメソッドがただ1つである場合、簡略化されたproc呼び出しを用いましょう。
1438 | [[link](#single-action-blocks)]
1439 |
1440 | ```ruby
1441 | # 悪い例
1442 | names.map { |name| name.upcase }
1443 |
1444 | # 良い例
1445 | names.map(&:upcase)
1446 | ```
1447 |
1448 | *
1449 | 1行のブロックでは`do...end`より`{...}`を使いましょう。
1450 | 複数行のブロックでは`{...}`は避けましょう
1451 | (複数行のメソッドチェーンは常に醜いです)。
1452 | 制御構文(的な用法)やメソッド定義(的な用法)では常に`do...end`を使いましょう
1453 | (例えばRakefilesや特定のDSLなど)
1454 | メソッドチェーンでの`do...end`は避けましょう。
1455 | [[link](#single-line-blocks)]
1456 |
1457 | ```ruby
1458 | names = %w[Bozhidar Steve Sarah]
1459 |
1460 | # 悪い例
1461 | names.each do |name|
1462 | puts name
1463 | end
1464 |
1465 | # 良い例
1466 | names.each { |name| puts name }
1467 |
1468 | # 悪い例
1469 | names.select do |name|
1470 | name.start_with?('S')
1471 | end.map { |name| name.upcase }
1472 |
1473 | # 良い例
1474 | names.select { |name| name.start_with?('S') }.map(&:upcase)
1475 | ```
1476 |
1477 | `{...}`を用いた複数行のメソッドチェーンをOKと主張する人もいるかもしれないが、
1478 | 自問してみてほしい — そのコードは本当に読みやすいだろうか?
1479 | また、そのブロックの中はメソッドに切り出すことはできないのか?
1480 |
1481 | *
1482 | 単に他のブロックに引数を渡すだけのブロックリテラルを避けるため、
1483 | ブロック引数を明示することを検討しましょう。
1484 | ただしブロックが`Proc`に変換されることでのパフォーマンスに気をつけましょう。
1485 | [[link](#block-argument)]
1486 |
1487 | ```ruby
1488 | require 'tempfile'
1489 |
1490 | # 悪い例
1491 | def with_tmp_dir
1492 | Dir.mktmpdir do |tmp_dir|
1493 | Dir.chdir(tmp_dir) { |dir| yield dir } # 引数を渡しているだけのブロック
1494 | end
1495 | end
1496 |
1497 | # 良い例
1498 | def with_tmp_dir(&block)
1499 | Dir.mktmpdir do |tmp_dir|
1500 | Dir.chdir(tmp_dir, &block)
1501 | end
1502 | end
1503 |
1504 | with_tmp_dir do |dir|
1505 | puts "dir is accessible as parameter and pwd is set: #{dir}"
1506 | end
1507 | ```
1508 |
1509 | *
1510 | 制御構文上不要な`return`は避けましょう。
1511 | [[link](#no-explicit-return)]
1512 |
1513 | ```ruby
1514 | # 悪い例
1515 | def some_method(some_arr)
1516 | return some_arr.size
1517 | end
1518 |
1519 | # 良い例
1520 | def some_method(some_arr)
1521 | some_arr.size
1522 | end
1523 | ```
1524 |
1525 | *
1526 | 不要な`self`は避けましょう
1527 | (`self`のアクセサへの書き込み、メソッド名が予約語の場合、オーバーロード可能なオペレータの場合でのみ必要です)。
1528 | [[link](#no-self-unless-required)]
1529 |
1530 | ```ruby
1531 | # 悪い例
1532 | def ready?
1533 | if self.last_reviewed_at > self.last_updated_at
1534 | self.worker.update(self.content, self.options)
1535 | self.status = :in_progress
1536 | end
1537 | self.status == :verified
1538 | end
1539 |
1540 | # 良い例
1541 | def ready?
1542 | if last_reviewed_at > last_updated_at
1543 | worker.update(content, options)
1544 | self.status = :in_progress
1545 | end
1546 | status == :verified
1547 | end
1548 | ```
1549 |
1550 | *
1551 | 当然の帰結として、ローカル変数でメソッドをシャドウイングするのは、
1552 | それらが等価なものでない限り避けましょう。
1553 | [[link](#no-shadowing)]
1554 |
1555 | ```ruby
1556 | class Foo
1557 | attr_accessor :options
1558 |
1559 | # ok
1560 | def initialize(options)
1561 | self.options = options
1562 | # options と self.options はここでは等価
1563 | end
1564 |
1565 | # 悪い例
1566 | def do_something(options = {})
1567 | unless options[:when] == :later
1568 | output(self.options[:message])
1569 | end
1570 | end
1571 |
1572 | # 良い例
1573 | def do_something(params = {})
1574 | unless params[:when] == :later
1575 | output(options[:message])
1576 | end
1577 | end
1578 | end
1579 | ```
1580 |
1581 | *
1582 | 代入部分を括弧で囲まずに、`=`の返り値を条件式に用いてはいけません。
1583 | これは、Rubyistの中では *条件式内での安全な代入* としてとても有名です。
1584 | [[link](#safe-assignment-in-condition)]
1585 |
1586 | ```ruby
1587 | # 悪い例 (+ 警告が出ます)
1588 | if v = array.grep(/foo/)
1589 | do_something(v)
1590 | # some code
1591 | end
1592 |
1593 | # 良い例 (MRIはこれでも文句を言いますが、RuboCopでは問題ありません)
1594 | if (v = array.grep(/foo/))
1595 | do_something(v)
1596 | # some code
1597 | end
1598 |
1599 | # 良い例
1600 | v = array.grep(/foo/)
1601 | if v
1602 | do_something(v)
1603 | # some code
1604 | end
1605 | ```
1606 |
1607 | *
1608 | 利用できるときには省略された自己代入演算子を用いましょう。
1609 | [[link](#self-assignment)]
1610 |
1611 | ```ruby
1612 | # 悪い例
1613 | x = x + y
1614 | x = x * y
1615 | x = x**y
1616 | x = x / y
1617 | x = x || y
1618 | x = x && y
1619 |
1620 | # 良い例
1621 | x += y
1622 | x *= y
1623 | x **= y
1624 | x /= y
1625 | x ||= y
1626 | x &&= y
1627 | ```
1628 |
1629 | *
1630 | 変数がまだ初期化されていないときにだけ初期化したいのであれば、`||=`を使いましょう。
1631 | [[link](#double-pipe-for-uninit)]
1632 |
1633 | ```ruby
1634 | # 悪い例
1635 | name = name ? name : 'Bozhidar'
1636 |
1637 | # 悪い例
1638 | name = 'Bozhidar' unless name
1639 |
1640 | # 良い例 - nameがnilかfalseの場合のみ、Bozhidarで初期化します
1641 | name ||= 'Bozhidar'
1642 | ```
1643 |
1644 | *
1645 | boolean変数には`||=`を用いてはいけません
1646 | (現在の値が`false`であったときに何が起こるか考えてみましょう)。
1647 | [[link](#no-double-pipes-for-bools)]
1648 |
1649 | ```ruby
1650 | # 悪い例 - たとえenabledがfalseでもtrueが入ります
1651 | enabled ||= true
1652 |
1653 | # 良い例
1654 | enabled = true if enabled.nil?
1655 | ```
1656 |
1657 | *
1658 | 値が入っているかわからない変数の前処理には`&&=`を用いましょう。
1659 | `&&=`を使えば変数が存在するときのみ値を変更するので、
1660 | 存在確認に用いている不要な`if`を除去できます。
1661 | [[link](#double-amper-preprocess)]
1662 |
1663 | ```ruby
1664 | # 悪い例
1665 | if something
1666 | something = something.downcase
1667 | end
1668 |
1669 | # 悪い例
1670 | something = something ? something.downcase : nil
1671 |
1672 | # ok
1673 | something = something.downcase if something
1674 |
1675 | # 良い例
1676 | something = something && something.downcase
1677 |
1678 | # より良い例
1679 | something &&= something.downcase
1680 | ```
1681 |
1682 | *
1683 | case等価演算子`===`の露骨な使用は避けましょう。
1684 | その名が示す通り、`case`の条件判定で用いられており、
1685 | その外で用いられると混乱のもとになります。
1686 | [[link](#no-case-equality)]
1687 |
1688 | ```ruby
1689 | # 悪い例
1690 | Array === something
1691 | (1..100) === 7
1692 | /something/ === some_string
1693 |
1694 | # 良い例
1695 | something.is_a?(Array)
1696 | (1..100).include?(7)
1697 | some_string.match?(/something/)
1698 | ```
1699 |
1700 | *
1701 | `==`で用が足りるなら`eql?`は使わないようにしましょう。
1702 | `eql?`で実現されている、より厳密な等価性が必要になることは、実際には稀です。
1703 | [[link](#eql)]
1704 |
1705 | ```ruby
1706 | # 悪い例 - eql? は 文字列に対する == と同じです
1707 | 'ruby'.eql? some_str
1708 |
1709 | # good
1710 | 'ruby' == some_str
1711 | 1.0.eql? x # eql? はIntegerとFloatの1を識別したいのであれば意味があります
1712 | ```
1713 |
1714 | *
1715 | Perlスタイルの(`$:`や`$;`などのような)特別な変数の使用は避けましょう。
1716 | それらは極めて暗号的なので、ワンライナー以外での利用は推奨できません。
1717 | `English`ライブラリから提供される人にやさしいエイリアスを用いましょう。
1718 | [[link](#no-cryptic-perlisms)]
1719 |
1720 | ```ruby
1721 | # 悪い例
1722 | $:.unshift File.dirname(__FILE__)
1723 |
1724 | # 良い例
1725 | require 'English'
1726 | $LOAD_PATH.unshift File.dirname(__FILE__)
1727 | ```
1728 |
1729 | *
1730 | メソッド名と開き括弧の間にスペースを入れてはいけません。
1731 | [[link](#parens-no-spaces)]
1732 |
1733 | ```ruby
1734 | # 悪い例
1735 | f (3 + 2) + 1
1736 |
1737 | # 良い例
1738 | f(3 + 2) + 1
1739 | ```
1740 |
1741 | *
1742 | Rubyインタープリタを走らせるときは、常に`-w`オプションを付けましょう。
1743 | これまでのルールのどれかを忘れてしまった時に警告を出してくれます!
1744 | [[link](#always-warn-at-runtime)]
1745 |
1746 | *
1747 | ネストしたメソッド定義は行ってはいけません - 代わりにラムダを用いましょう。
1748 | ネストしたメソッド定義は実際には外側のメソッドと同じスコープ(例えばclass)でメソッドを生成します。
1749 | そのうえ、そのようにネストしたメソッドは、そのメソッドを含んでいるメソッドが呼び出されるたびに再定義されるでしょう。
1750 | [[link](#no-nested-methods)]
1751 |
1752 | ```ruby
1753 | # 悪い例
1754 | def foo(x)
1755 | def bar(y)
1756 | # 本文略
1757 | end
1758 |
1759 | bar(x)
1760 | end
1761 |
1762 | # 良い例 - 前の例と同じですが、foo呼び出し時にのbar再定義がおこりません
1763 | def bar(y)
1764 | # 本文略
1765 | end
1766 |
1767 | def foo(x)
1768 | bar(x)
1769 | end
1770 |
1771 | # こちらも良い例
1772 | def foo(x)
1773 | bar = ->(y) { ... }
1774 | bar.call(x)
1775 | end
1776 | ```
1777 |
1778 | *
1779 | 1行の本文を持つラムダには新しいリテラルを持ちましょう。
1780 | `lambda`は複数行にまたがるときに使いましょう。
1781 | [[link](#lambda-multi-line)]
1782 |
1783 | ```ruby
1784 | # 悪い例
1785 | l = lambda { |a, b| a + b }
1786 | l.call(1, 2)
1787 |
1788 | # 正しい例、ですがギクシャクしています
1789 | l = ->(a, b) do
1790 | tmp = a * 7
1791 | tmp * b / 50
1792 | end
1793 |
1794 | # 良い例
1795 | l = ->(a, b) { a + b }
1796 | l.call(1, 2)
1797 |
1798 | l = lambda do |a, b|
1799 | tmp = a * 7
1800 | tmp * b / 50
1801 | end
1802 | ```
1803 |
1804 | *
1805 | stabby lambdaを定義するときは、引数の周りの括弧は省略しないようにしましょう。
1806 | [[link](#stabby-lambda-with-args)]
1807 |
1808 | ```ruby
1809 | # 悪い例
1810 | l = ->x, y { something(x, y) }
1811 |
1812 | # 良い例
1813 | l = ->(x, y) { something(x, y) }
1814 | ```
1815 |
1816 | *
1817 | stabby lambdaに引数がないときは、引数のための括弧は省略しましょう。
1818 | [[link](#stabby-lambda-no-args)]
1819 |
1820 | ```ruby
1821 | # 悪い例
1822 | l = ->() { something }
1823 |
1824 | # 良い例
1825 | l = -> { something }
1826 | ```
1827 |
1828 | *
1829 | `Proc.new`より`proc`を使いましょう。
1830 | [[link](#proc)]
1831 |
1832 | ```ruby
1833 | # 悪い例
1834 | p = Proc.new { |n| puts n }
1835 |
1836 | # 良い例
1837 | p = proc { |n| puts n }
1838 | ```
1839 |
1840 | *
1841 | lambdaやprocの呼び出しには`proc[]`や`proc.()`より`proc.call()`を使いましょう。
1842 | [[link](#proc-call)]
1843 |
1844 | ```ruby
1845 | # 悪い例 - 列挙型のアクセスに似ているように見えます
1846 | l = ->(v) { puts v }
1847 | l[1]
1848 |
1849 | # こちらも悪い例 - 珍しい構文です
1850 | l = ->(v) { puts v }
1851 | l.(1)
1852 |
1853 | # 良い例
1854 | l = ->(v) { puts v }
1855 | l.call(1)
1856 | ```
1857 |
1858 | *
1859 | 使わないブロック引数やローカル変数の先頭には`_`を付けましょう。
1860 | 単に`_`を用いるのも許容されます
1861 | (少し説明不足ではありますが)。
1862 | この記法を使うことで、
1863 | RubyインタープリタやRuboCopのような対応しているツールでは
1864 | 変数を使っていないという警告を抑制できます。
1865 | [[link](#underscore-unused-vars)]
1866 |
1867 | ```ruby
1868 | # 悪い例
1869 | result = hash.map { |k, v| v + 1 }
1870 |
1871 | def something(x)
1872 | unused_var, used_var = something_else(x)
1873 | # some code
1874 | end
1875 |
1876 | # 良い例
1877 | result = hash.map { |_k, v| v + 1 }
1878 |
1879 | def something(x)
1880 | _unused_var, used_var = something_else(x)
1881 | # some code
1882 | end
1883 |
1884 | # 良い例
1885 | result = hash.map { |_, v| v + 1 }
1886 |
1887 | def something(x)
1888 | _, used_var = something_else(x)
1889 | # some code
1890 | end
1891 | ```
1892 |
1893 | *
1894 | `STDOUT/STDERR/STDIN`の代わりに`$stdout/$stderr/$stdin`を用いましょう。
1895 | `STDOUT/STDERR/STDIN`は定数であり、
1896 | Rubyでの定数は、実際は再代入できます(つまりリダイレクトに使えます)が、
1897 | もし実行するとインタープリタからの警告が出ます。
1898 | [[link](#global-stdout)]
1899 |
1900 | *
1901 | `$stderr.puts`の代わりに`warn`を用いましょう。
1902 | 簡潔さや明快さもさることながら、
1903 | `warn`は必要であれば警告を抑制することができます
1904 | (警告レベルを`-W0`を用いて0に設定することによって実現できます)。
1905 | [[link](#warn)]
1906 |
1907 | *
1908 | あまりに暗号めいている`String#%`メソッドよりも`sprintf`や`format`を使いましょう。
1909 | [[link](#sprintf)]
1910 |
1911 | ```ruby
1912 | # 悪い例
1913 | '%d %d' % [20, 10]
1914 | # => '20 10'
1915 |
1916 | # 良い例
1917 | sprintf('%d %d', 20, 10)
1918 | # => '20 10'
1919 |
1920 | # 良い例
1921 | sprintf('%d %d', first: 20, second: 10)
1922 | # => '20 10'
1923 |
1924 | format('%d %d', 20, 10)
1925 | # => '20 10'
1926 |
1927 | # 良い例
1928 | format('%d %d', first: 20, second: 10)
1929 | # => '20 10'
1930 | ```
1931 |
1932 | *
1933 | 名前付きフォーマット文字列を使用する場合、`%{name}`よりも`%s`を使いましょう。
1934 | `%s`は値の型に関する情報をエンコードするためです。
1935 | [[link]](#named-format-tokens)
1936 |
1937 | ```ruby
1938 | # 悪い例
1939 | format('Hello, %{name}', name: 'John')
1940 |
1941 | # 良い例
1942 | format('Hello, %s', name: 'John')
1943 | ```
1944 |
1945 | *
1946 | あまりに暗号めいている`Array#*`メソッドよりも`Array#join`を使いましょう。
1947 | [[link](#array-join)]
1948 |
1949 | ```ruby
1950 | # 悪い例
1951 | %w[one two three] * ', '
1952 | # => 'one, two, three'
1953 |
1954 | # 良い例
1955 | %w[one two three].join(', ')
1956 | # => 'one, two, three'
1957 | ```
1958 |
1959 | *
1960 | 配列かどうかわからない変数を配列とみなして処理したいときは、
1961 | 明示的に`Array`かどうかチェックすることや`[*var]`よりも、`Array()`を使いましょう。
1962 | [[link](#array-coercion)]
1963 |
1964 | ```ruby
1965 | # 悪い例
1966 | paths = [paths] unless paths.is_a? Array
1967 | paths.each { |path| do_something(path) }
1968 |
1969 | # 悪い例 (常に新しいArrayのインスタンスを生成します)
1970 | [*paths].each { |path| do_something(path) }
1971 |
1972 | # 良い例 (そして少し読みやすいです)
1973 | Array(paths).each { |path| do_something(path) }
1974 | ```
1975 |
1976 | *
1977 | ロジックを使って複雑な比較を行うよりも、
1978 | 可能な限り`Range`や`Comparable#between?`を用いましょう。
1979 | [[link](#ranges-or-between)]
1980 |
1981 | ```ruby
1982 | # 悪い例
1983 | do_something if x >= 1000 && x <= 2000
1984 |
1985 | # 良い例
1986 | do_something if (1000..2000).include?(x)
1987 |
1988 | # 良い例
1989 | do_something if x.between?(1000, 2000)
1990 | ```
1991 |
1992 | *
1993 | `==`を明示した比較よりも判定メソッドを用いましょう。
1994 | 数値の比較はOKです。
1995 | [[link](#predicate-methods)]
1996 |
1997 | ```ruby
1998 | # 悪い例
1999 | if x % 2 == 0
2000 | end
2001 |
2002 | if x % 2 == 1
2003 | end
2004 |
2005 | if x == nil
2006 | end
2007 |
2008 | # 良い例
2009 | if x.even?
2010 | end
2011 |
2012 | if x.odd?
2013 | end
2014 |
2015 | if x.nil?
2016 | end
2017 |
2018 | if x.zero?
2019 | end
2020 |
2021 | if x == 0
2022 | end
2023 | ```
2024 |
2025 | *
2026 | boolean値を扱わない限り、明示的な`nil`でないかの検査は避けましょう。
2027 | [[link](#no-non-nil-checks)]
2028 |
2029 | ```ruby
2030 | # 悪い例
2031 | do_something if !something.nil?
2032 | do_something if something != nil
2033 |
2034 | # 良い例
2035 | do_something if something
2036 |
2037 | # 良い例 - boolean値を扱うとき
2038 | def value_set?
2039 | !@some_boolean.nil?
2040 | end
2041 | ```
2042 |
2043 | *
2044 | `BEGIN`ブロックの使用は避けましょう。
2045 | [[link](#no-BEGIN-blocks)]
2046 |
2047 | *
2048 | `END`ブロックを使ってはいけません。代わりに`Kernel#at_exit`を使いましょう。
2049 | [[link](#no-END-blocks)]
2050 |
2051 | ```ruby
2052 | # 悪い例
2053 | END { puts 'Goodbye!' }
2054 |
2055 | # 良い例
2056 | at_exit { puts 'Goodbye!' }
2057 | ```
2058 |
2059 | *
2060 | フリップフロップの使用は避けましょう。
2061 | [[link](#no-flip-flops)]
2062 |
2063 | *
2064 | 制御構文で条件式のネストは避けましょう。
2065 | [[link](#no-nested-conditionals)]
2066 |
2067 | 不正なデータを弾きたいときはガード節を使いましょう。
2068 | ガード節とは、できるだけ素早く関数から抜けられるようにと
2069 | 関数の先頭に置かれている条件文のことです。
2070 |
2071 | ```ruby
2072 | # 悪い例
2073 | def compute_thing(thing)
2074 | if thing[:foo]
2075 | update_with_bar(thing[:foo])
2076 | if thing[:foo][:bar]
2077 | partial_compute(thing)
2078 | else
2079 | re_compute(thing)
2080 | end
2081 | end
2082 | end
2083 |
2084 | # 良い例
2085 | def compute_thing(thing)
2086 | return unless thing[:foo]
2087 | update_with_bar(thing[:foo])
2088 | return re_compute(thing) unless thing[:foo][:bar]
2089 | partial_compute(thing)
2090 | end
2091 | ```
2092 |
2093 | ループ内では条件判定ブロックよりも`next`を使いましょう。
2094 | ```ruby
2095 | # 悪い例
2096 | [0, 1, 2, 3].each do |item|
2097 | if item > 1
2098 | puts item
2099 | end
2100 | end
2101 |
2102 | # 良い例
2103 | [0, 1, 2, 3].each do |item|
2104 | next unless item > 1
2105 | puts item
2106 | end
2107 | ```
2108 | *
2109 | `collect`より`map`、`detect`より`find`、`find_all`より`select`
2110 | `inject`より`reduce`、`length`より`size`を使いましょう。
2111 | これは絶対のルールではないです。
2112 | 別名のほうが可読性に優れているなら、
2113 | そちらを使っていただいて構いません。
2114 | 韻を踏んでいるほうのメソッド名はSmalltalkから引き継いできたもので、
2115 | 他のプログラミング言語でそこまで一般的ではないです。
2116 | `find_all`よりも`select`が推奨されるのは、
2117 | `reject`との相性がよいことと、
2118 | メソッド名から挙動を推察することも容易だからです。
2119 | [[link](#map-find-select-reduce-size)]
2120 |
2121 | *
2122 | `size`の代わりに`count`を用いてはいけません。
2123 | `Array`以外の`Enumerable`オブジェクトでは、
2124 | `count`を使うと要素数の計算のためにコレクション全体を走査してしまいます。
2125 | [[link](#count-vs-size)]
2126 |
2127 | ```ruby
2128 | # 悪い例
2129 | some_hash.count
2130 |
2131 | # 良い例
2132 | some_hash.size
2133 | ```
2134 |
2135 | *
2136 | `map`と`flatten`の組み合わせの代わりに、`flat_map`を用いましょう。
2137 | これは深さが2より大きい配列には適用できません。
2138 | すなわち、`users.first.songs == ['a', ['b','c']]`のときは、
2139 | `flat_map`より`map + flatten`を用いましょう。
2140 | `flatten`は配列を全て平坦にするのに対し、`flat_map`は配列を1次元だけ平坦にします。
2141 | [[link](#flat-map)]
2142 |
2143 | ```ruby
2144 | # 悪い例
2145 | all_songs = users.map(&:songs).flatten.uniq
2146 |
2147 | # 良い例
2148 | all_songs = users.flat_map(&:songs).uniq
2149 | ```
2150 |
2151 | *
2152 | `reverse.each`の代わりに`reverse_each`を用いましょう。
2153 | 何故なら、`Enumerable`をincludeしているクラスの側で、
2154 | より効率のよい実装が行われていることがあるからです。
2155 | 最悪、クラスが特殊化を行っていない場合でも、`Enumerable`から継承される一般的な実装は、
2156 | `reverse.each`を用いた場合と同じ効率です。
2157 | [[link](#reverse-each)]
2158 |
2159 | ```ruby
2160 | # 悪い例
2161 | array.reverse.each { ... }
2162 |
2163 | # 良い例
2164 | array.reverse_each { ... }
2165 | ```
2166 |
2167 | ## 命名規則
2168 |
2169 | > プログラミングで真に困難な領域は、キャッシュの無効化と命名にしかない。
2170 | > -- Phil Karlton
2171 |
2172 | *
2173 | 識別子は英語で名づけましょう。
2174 | [[link](#english-identifiers)]
2175 |
2176 | ```ruby
2177 | # 悪い例 - 識別子がnon-asciiな文字列です
2178 | заплата = 1_000
2179 |
2180 | # 悪い例 - (キリル文字の代わりに)ラテン文字で書かれてはいますが、識別子がブルガリア語です
2181 | zaplata = 1_000
2182 |
2183 | # 良い例
2184 | salary = 1_000
2185 | ```
2186 |
2187 | *
2188 | シンボル、メソッド、変数には`snake_case`を用いましょう。
2189 | [[link](#snake-case-symbols-methods-vars)]
2190 |
2191 | ```ruby
2192 | # 悪い例
2193 | :'some symbol'
2194 | :SomeSymbol
2195 | :someSymbol
2196 |
2197 | someVar = 5
2198 |
2199 | def someMethod
2200 | # some code
2201 | end
2202 |
2203 | def SomeMethod
2204 | # some code
2205 | end
2206 |
2207 | # 良い例
2208 | :some_symbol
2209 |
2210 | some_var = 5
2211 |
2212 | def some_method
2213 | # some code
2214 | end
2215 | ```
2216 |
2217 | *
2218 | シンボル、メソッド、および変数名において、文字と数字を分離しないようにしましょう。
2219 | [[link](#snake-case-symbols-methods-vars-with-numbers)]
2220 |
2221 | ```ruby
2222 | # 悪い例
2223 | :some_sym_1
2224 |
2225 | some_var_1 = 1
2226 |
2227 | var_10 = 10
2228 |
2229 | def some_method_1
2230 | # some code
2231 | end
2232 |
2233 | # 良い例
2234 | :some_sym1
2235 |
2236 | some_var1 = 1
2237 |
2238 | var10 = 10
2239 |
2240 | def some_method1
2241 | # some code
2242 | end
2243 | ```
2244 |
2245 | *
2246 | クラスやモジュールには`CamelCase`を用いましょう。(HTTP、RFC、XMLのような頭字語は大文字を保ちましょう)。
2247 | [[link](#camelcase-classes)]
2248 |
2249 | ```ruby
2250 | # 悪い例
2251 | class Someclass
2252 | # some code
2253 | end
2254 |
2255 | class Some_Class
2256 | # some code
2257 | end
2258 |
2259 | class SomeXml
2260 | # some code
2261 | end
2262 |
2263 | class XmlSomething
2264 | # some code
2265 | end
2266 |
2267 | # 良い例
2268 | class SomeClass
2269 | # some code
2270 | end
2271 |
2272 | class SomeXML
2273 | # some code
2274 | end
2275 |
2276 | class XMLSomething
2277 | # some code
2278 | end
2279 | ```
2280 |
2281 | *
2282 | ファイル名には`snake_case`を用いましょう。例えば`hello_world.rb`のように。
2283 | [[link](#snake-case-files)]
2284 |
2285 | *
2286 | ディレクトリ名には`snake_case`を用いましょう。例えば`lib/hello_world/hello_world.rb`のように。
2287 | [[link](#snake-case-dirs)]
2288 |
2289 |
2290 | *
2291 | ソースファイル1つにつきただ1つのクラス/モジュールだけが書かれている状態を目指しましょう。
2292 | そのファイルの名前はそのクラス/モジュールと同じ名前で、ただしキャメルケースをスネークケースに変換して用いましょう。
2293 | [[link](#one-class-per-file)]
2294 |
2295 | *
2296 | 他の定数は`SCREAMING_SNAKE_CASE`を用いましょう。
2297 | [[link](#screaming-snake-case)]
2298 |
2299 | ```ruby
2300 | # 悪い例
2301 | SomeConst = 5
2302 |
2303 | # 良い例
2304 | SOME_CONST = 5
2305 | ```
2306 |
2307 | *
2308 | 述語メソッド(boolean値が返るメソッド)は疑問符で終わりましょう。
2309 | (すなわち`Array#empty?`のように)。
2310 | boolean値を返さないメソッドは、疑問符で終わるべきではないです。
2311 | [[link](#bool-methods-qmark)]
2312 |
2313 | *
2314 | 述語メソッドに `is`、` does`、 `can`のような助動詞をつけるべきではありません。
2315 | これらの単語は冗長で、Rubyコアライブラリの述語メソッドのスタイル
2316 | ( `empty?`や `include?`など)と矛盾しています。
2317 | [[link](#bool-methods-prefix)]
2318 |
2319 | ```ruby
2320 | # 悪い例
2321 | class Person
2322 | def is_tall?
2323 | true
2324 | end
2325 |
2326 | def can_play_basketball?
2327 | false
2328 | end
2329 |
2330 | def does_like_candy?
2331 | true
2332 | end
2333 | end
2334 |
2335 | # 良い例
2336 | class Person
2337 | def tall?
2338 | true
2339 | end
2340 |
2341 | def basketball_player?
2342 | false
2343 | end
2344 |
2345 | def likes_candy?
2346 | true
2347 | end
2348 | end
2349 | ```
2350 |
2351 | *
2352 | *危険* な可能性のあるメソッド
2353 | (引数や`self`を変更するようなメソッドや、
2354 | `exit!`(`exit`と違ってファイナライザが走らない)のようなもの)
2355 | は、その安全なバージョンがある場合には、 *危険* であることを明示する意味で感嘆符で終わりましょう。
2356 | [[link](#dangerous-method-bang)]
2357 |
2358 | ```ruby
2359 | # 悪い例 - 対応する「安全」なメソッドが存在しません
2360 | class Person
2361 | def update!
2362 | end
2363 | end
2364 |
2365 | # 良い例
2366 | class Person
2367 | def update
2368 | end
2369 | end
2370 |
2371 | # 良い例
2372 | class Person
2373 | def update!
2374 | end
2375 |
2376 | def update
2377 | end
2378 | end
2379 | ```
2380 |
2381 | *
2382 | 危険な(感嘆符付き)メソッドがあるときは、対応する安全な(感嘆符なし)メソッドを定義できないか検討しましょう。
2383 | [[link](#safe-because-unsafe)]
2384 |
2385 | ```ruby
2386 | class Array
2387 | def flatten_once!
2388 | res = []
2389 |
2390 | each do |e|
2391 | [*e].each { |f| res << f }
2392 | end
2393 |
2394 | replace(res)
2395 | end
2396 |
2397 | def flatten_once
2398 | dup.flatten_once!
2399 | end
2400 | end
2401 | ```
2402 |
2403 | *
2404 | 二項演算子や演算子風のメソッドを定義するときは、
2405 | 演算子の「対称性」を明確にするために引数名は`other`を用いましょう。
2406 | ここでいう対称性とは、演算子の両辺が典型的には同じ、
2407 | またはcoerce可能な型であるという意味です。
2408 | [[link](#other-arg)]
2409 |
2410 | * 対称性のある演算子や演算子風のメソッド(引数名を`other`とすべきもの): `+`, `-`, `*`, `/`, `%`, `**`, `==`,
2411 | `>`, `<`, `|`, `&`, `^`, `eql?`, `equal?`;
2412 | * 対称性のない演算子(引数名を`other`とすべきではない): `<<`, `[]` (コレクションとその要素の関係にある演算子),
2413 | `===` (パターンやマッチの関係性);
2414 |
2415 | このルールは演算子の両辺が同じセマンティクスを持っている場合 **のみ** に用いることに注意しましょう。
2416 | 典型的な例外としては、Ruby本体の`Array#*(int)`が挙げられます。
2417 |
2418 | ```ruby
2419 | # 良い例
2420 | def +(other)
2421 | # body omitted
2422 | end
2423 |
2424 | # 悪い例
2425 | def <<(other)
2426 | @internal << other
2427 | end
2428 |
2429 | # 良い例
2430 | def <<(item)
2431 | @internal << item
2432 | end
2433 |
2434 | # 悪い例
2435 | # Returns some string multiplied `other` times
2436 | def *(other)
2437 | # body omitted
2438 | end
2439 |
2440 | # 良い例
2441 | # Returns some string multiplied `num` times
2442 | def *(num)
2443 | # body omitted
2444 | end
2445 | ```
2446 |
2447 | ## コメント
2448 |
2449 | > 良く書けたコードは、それ自身が最良のドキュメントでもある。
2450 | > コメントを書こうとしている時は、常に自問してほしい、
2451 | > "このコメントが不要になるようにコードを改善できるだろうか?"
2452 | > コードを改善した上で、ドキュメントでさらに明快にするのだ。
2453 | > -- Steve McConnell
2454 |
2455 | *
2456 | 自己説明的なコードを書いて、このセクションの残りのパートは無視しましょう。本当に!
2457 | [[link](#no-comments)]
2458 |
2459 | *
2460 | コメントは英語で書きましょう。
2461 | [[link](#english-comments)]
2462 |
2463 | *
2464 | 最初の`#`とコメントの間にスペースを1つ入れましょう。
2465 | [[link](#hash-space)]
2466 |
2467 | *
2468 | 1語より長いコメントは頭語を大文字化してピリオドを打ちましょう。
2469 | 文と文の間にはスペースを[一つだけ](https://en.wikipedia.org/wiki/Sentence_spacing)入れましょう。
2470 | [[link](#english-syntax)]
2471 |
2472 | *
2473 | 過剰なコメントは避けましょう。
2474 | [[link](#no-superfluous-comments)]
2475 |
2476 | ```ruby
2477 | # 悪い例
2478 | counter += 1 # カウンターをインクリメント
2479 | ```
2480 |
2481 | *
2482 | コメントは最新に保ちましょう。
2483 | 古くなったコメントは、コメントがないより悪いです。
2484 | [[link](#comment-upkeep)]
2485 |
2486 | > 良いコードは良いジョークのようだ - なんの説明もいらない。
2487 | > — プログラマの格言 [Russ Olsen](http://eloquentruby.com/blog/2011/03/07/good-code-and-good-jokes/)
2488 |
2489 | *
2490 | 悪いコードを説明するコメントは避けましょう。
2491 | 自己説明的なコードへのリファクタリングを行いましょう
2492 | (「やるかやらないか — "やってみる"はなしだ。」 Yoda)。
2493 | [[link](#refactor-dont-comment)]
2494 |
2495 | ### 注釈
2496 |
2497 | *
2498 | 注釈は、通常関連するコードのすぐ上に書きましょう。
2499 | [[link](#annotate-above)]
2500 |
2501 | *
2502 | 注釈のキーワードの後ろは`: `を続けましょう。
2503 | その後ろに問題点を書きましょう。
2504 | [[link](#annotate-keywords)]
2505 |
2506 | *
2507 | もし問題点の記述に複数行かかる場合は、
2508 | 後続の行は`#`の後ろにスペース3つでインデントしましょう。
2509 | (通常の1つに加え、インデント目的に2つ)
2510 | [[link](#indent-annotations)]
2511 |
2512 | ```ruby
2513 | def bar
2514 | # FIXME: This has crashed occasionally since v3.2.1. It may
2515 | # be related to the BarBazUtil upgrade.
2516 | baz(:quux)
2517 | end
2518 | ```
2519 |
2520 | *
2521 | もし問題が明らかで、説明すると冗長になる時は、
2522 | 問題のある行の末尾に、本文なしの注釈だけ付けましょう。
2523 | この用法は例外であり、ルールではありません。
2524 | [[link](#rare-eol-annotations)]
2525 |
2526 | ```ruby
2527 | def bar
2528 | sleep 100 # OPTIMIZE
2529 | end
2530 | ```
2531 |
2532 | *
2533 | あとで追加されるべき、今はない特徴や機能の注釈には`TODO`を使いましょう。
2534 | [[link](#todo)]
2535 |
2536 | *
2537 | 直す必要がある壊れたコードの注釈には`FIXME`を使いましょう。
2538 | [[link](#fixme)]
2539 |
2540 | *
2541 | パフォーマンスに問題を及ぼすかもしれない遅い、または非効率なコードの注釈には`OPTIMIZE`を使いましょう。
2542 | [[link](#optimize)]
2543 |
2544 | *
2545 | 疑問の残るコードの書き方でコードの臭いを感じた箇所の注釈には`HACK`を使いましょう。
2546 | [[link](#hack)]
2547 |
2548 | *
2549 | 意図したとおりに動くか確認する必要がある箇所の注釈には`REVIEW`を使いましょう。
2550 | 例: `REVIEW: Are we sure this is how the client does X currently?`
2551 | [[link](#review)]
2552 |
2553 | *
2554 | 適切に感じるのであれば、他の独自のキーワードを用いても構いませんが、
2555 | それらのキーワードは`README`やそれに類するものに書いておきましょう。
2556 | [[link](#document-annotations)]
2557 |
2558 | ### マジックコメント
2559 |
2560 | *
2561 | マジックコメントは、全てのコメントとコードよりも上に置きましょう(Shebangは例外で、それに関しては次の項目を参照のこと)。
2562 | [[link](#magic-comments-first)]
2563 |
2564 | ```ruby
2565 | # 悪い例
2566 | # Some documentation about Person
2567 |
2568 | # frozen_string_literal: true
2569 | class Person
2570 | end
2571 |
2572 | # 良い例
2573 | # frozen_string_literal: true
2574 |
2575 | # Some documentation about Person
2576 | class Person
2577 | end
2578 | ```
2579 |
2580 | *
2581 | ファイルにShebangが存在する場合は、マジックコメントはその下に置きましょう。
2582 | [[link](#below-shebang)]
2583 |
2584 | ```ruby
2585 | # 悪い例
2586 | # frozen_string_literal: true
2587 | #!/usr/bin/env ruby
2588 |
2589 | App.parse(ARGV)
2590 |
2591 | # 良い例
2592 | #!/usr/bin/env ruby
2593 | # frozen_string_literal: true
2594 |
2595 | App.parse(ARGV)
2596 | ```
2597 |
2598 | *
2599 | マジックコメントが複数必要な場合、一つのマジックコメントは一つの行に置きましょう。
2600 | [[link](#one-magic-comment-per-line)]
2601 |
2602 | ```ruby
2603 | # 悪い例
2604 | # -*- frozen_string_literal: true; encoding: ascii-8bit -*-
2605 |
2606 | # 良い例
2607 | # frozen_string_literal: true
2608 | # encoding: ascii-8bit
2609 | ```
2610 |
2611 | *
2612 | マジックコメントは、コードやドキュメントから空行で区切りましょう。
2613 | [[link](#separate-magic-comments-from-code)]
2614 |
2615 | ```ruby
2616 | # 悪い例
2617 | # frozen_string_literal: true
2618 | # Some documentation for Person
2619 | class Person
2620 | # Some code
2621 | end
2622 |
2623 | # 良い例
2624 | # frozen_string_literal: true
2625 |
2626 | # Some documentation for Person
2627 | class Person
2628 | # Some code
2629 | end
2630 | ```
2631 |
2632 | ## クラスとモジュール
2633 |
2634 | *
2635 | クラス定義の構造には一貫性をもたせましょう。
2636 | [[link](#consistent-classes)]
2637 |
2638 | ```ruby
2639 | class Person
2640 | # extendとincludeを最初に書きます。
2641 | extend SomeModule
2642 | include AnotherModule
2643 |
2644 | # 内部クラス
2645 | CustomError = Class.new(StandardError)
2646 |
2647 | # 次に定数
2648 | SOME_CONSTANT = 20
2649 |
2650 | # 次にattribute系マクロ
2651 | attr_reader :name
2652 |
2653 | # (あれば) それ以外のマクロ
2654 | validates :name
2655 |
2656 | # publicクラスメソッドが続きます
2657 | def self.some_method
2658 | end
2659 |
2660 | # initializationはクラスメソッドと他のpublicメソッドの間に
2661 | def initialize
2662 | end
2663 |
2664 | # 他のpublicメソッドが続きます
2665 | def some_method
2666 | end
2667 |
2668 | # protectedとprivateのメソッドは最後のあたりにグループ化します
2669 | protected
2670 |
2671 | def some_protected_method
2672 | end
2673 |
2674 | private
2675 |
2676 | def some_private_method
2677 | end
2678 | end
2679 | ```
2680 |
2681 | *
2682 | 複数のミックスインは、別々の行に分割しましょう。
2683 | [[link](#mixin-grouping)]
2684 |
2685 | ```ruby
2686 | # 悪い例
2687 | class Person
2688 | include Foo, Bar
2689 | end
2690 |
2691 | # 良い例
2692 | class Person
2693 | # 複数のミックスインは分割された文にします
2694 | include Foo
2695 | include Bar
2696 | end
2697 | ```
2698 |
2699 | *
2700 | クラスの中に複数行あるようなクラスをネストしてはいけません。
2701 | それぞれのクラスごとにファイルに分けて、
2702 | 外側のクラスの名前のついたフォルダに含めるようにしましょう。
2703 | [[link](#file-classes)]
2704 |
2705 | ```ruby
2706 | # 悪い例
2707 |
2708 | # foo.rb
2709 | class Foo
2710 | class Bar
2711 | # 中に30メソッド
2712 | end
2713 |
2714 | class Car
2715 | # 中に20メソッド
2716 | end
2717 |
2718 | # 中に30メソッド
2719 | end
2720 |
2721 | # 良い例
2722 |
2723 | # foo.rb
2724 | class Foo
2725 | # 中に30メソッド
2726 | end
2727 |
2728 | # foo/bar.rb
2729 | class Foo
2730 | class Bar
2731 | # 中に30メソッド
2732 | end
2733 | end
2734 |
2735 | # foo/car.rb
2736 | class Foo
2737 | class Car
2738 | # 中に20メソッド
2739 | end
2740 | end
2741 | ```
2742 |
2743 | *
2744 | 名前空間の中にクラスやモジュールを定義したり再定義したりする場合、
2745 | その名前空間を明示的にネストして記述しましょう。
2746 | Rubyの[レキシカルスコープ](https://cirw.in/blog/constant-lookup.html)
2747 | は定義された場所のモジュールのネスティングに依存しているため、
2748 | 名前解決演算子を用いてしまうと、定数参照が意図しない振る舞いをすることがあります。
2749 | [[link](#namespace-definition)]
2750 |
2751 | ```Ruby
2752 | module Utilities
2753 | class Queue
2754 | end
2755 | end
2756 |
2757 | # 悪い例
2758 | class Utilities::Store
2759 | Module.nesting # => [Utilities::Store]
2760 |
2761 | def initialize
2762 | # nestingにUtilitiesを含まないため、
2763 | # この参照はトップレベルの ::Queueを参照します。
2764 | @queue = Queue.new
2765 | end
2766 | end
2767 |
2768 | # 良い例
2769 | module Utilities
2770 | class WaitingList
2771 | Module.nesting # => [Utilities::WaitingList, Utilities]
2772 |
2773 | def initialize
2774 | @queue = Queue.new # Utilities::Queue を参照します
2775 | end
2776 | end
2777 | end
2778 | ```
2779 |
2780 | *
2781 | クラスメソッドしかないクラスよりモジュールを使いましょう。
2782 | クラスはインスタンスを生成することに意味がある時にのみ使われるべきです。
2783 | [[link](#modules-vs-classes)]
2784 |
2785 | ```ruby
2786 | # 悪い例
2787 | class SomeClass
2788 | def self.some_method
2789 | # body omitted
2790 | end
2791 |
2792 | def self.some_other_method
2793 | # body omitted
2794 | end
2795 | end
2796 |
2797 | # 良い例
2798 | module SomeModule
2799 | module_function
2800 |
2801 | def some_method
2802 | # body omitted
2803 | end
2804 |
2805 | def some_other_method
2806 | # body omitted
2807 | end
2808 | end
2809 | ```
2810 |
2811 | *
2812 | モジュールのインスタンスメソッドをクラスメソッドにしたいときは、
2813 | `extend self`よりも`module_function`を使いましょう。
2814 | [[link](#module-function)]
2815 |
2816 | ```ruby
2817 | # 悪い例
2818 | module Utilities
2819 | extend self
2820 |
2821 | def parse_something(string)
2822 | # do stuff here
2823 | end
2824 |
2825 | def other_utility_method(number, string)
2826 | # do some more stuff
2827 | end
2828 | end
2829 |
2830 | # 良い例
2831 | module Utilities
2832 | module_function
2833 |
2834 | def parse_something(string)
2835 | # do stuff here
2836 | end
2837 |
2838 | def other_utility_method(number, string)
2839 | # do some more stuff
2840 | end
2841 | end
2842 | ```
2843 |
2844 | *
2845 | クラス階層の設計を行うときは、
2846 | [リスコフの置換原則](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87).
2847 | に従いましょう。
2848 | [[link](#liskov)]
2849 |
2850 | *
2851 | あなたのクラスを可能な限り
2852 | [SOLID](https://en.wikipedia.org/wiki/SOLID_(object-oriented_design))
2853 | に保ちましょう。
2854 | [[link](#solid-design)]
2855 |
2856 | *
2857 | ドメインオブジェクトのクラスにおいては常に適切な`to_s`メソッドを提供しましょう。
2858 | [[link](#define-to-s)]
2859 |
2860 | ```ruby
2861 | class Person
2862 | attr_reader :first_name, :last_name
2863 |
2864 | def initialize(first_name, last_name)
2865 | @first_name = first_name
2866 | @last_name = last_name
2867 | end
2868 |
2869 | def to_s
2870 | "#{first_name} #{last_name}"
2871 | end
2872 | end
2873 | ```
2874 |
2875 | *
2876 | 単純なアクセサやミューテータの定義には、`attr`群を用いましょう。
2877 | [[link](#attr_family)]
2878 |
2879 | ```ruby
2880 | # 悪い例
2881 | class Person
2882 | def initialize(first_name, last_name)
2883 | @first_name = first_name
2884 | @last_name = last_name
2885 | end
2886 |
2887 | def first_name
2888 | @first_name
2889 | end
2890 |
2891 | def last_name
2892 | @last_name
2893 | end
2894 | end
2895 |
2896 | # 良い例
2897 | class Person
2898 | attr_reader :first_name, :last_name
2899 |
2900 | def initialize(first_name, last_name)
2901 | @first_name = first_name
2902 | @last_name = last_name
2903 | end
2904 | end
2905 | ```
2906 |
2907 | *
2908 | アクセサやミューテータの場合、メソッド名の前に`get_`や`set_`をつけないようにしましょう。
2909 | アクセサ(リーダ)にはアトリビュートの名前を、ミューテータ(ライタ)には`attr_name=`
2910 | を使用するのはRubyの規約です。
2911 | [[link](#accessor_mutator_method_names)]
2912 |
2913 | ```ruby
2914 | # 悪い例
2915 | class Person
2916 | def get_name
2917 | "#{@first_name} #{@last_name}"
2918 | end
2919 |
2920 | def set_name(name)
2921 | @first_name, @last_name = name.split(' ')
2922 | end
2923 | end
2924 |
2925 | # 良い例
2926 | class Person
2927 | def name
2928 | "#{@first_name} #{@last_name}"
2929 | end
2930 |
2931 | def name=(name)
2932 | @first_name, @last_name = name.split(' ')
2933 | end
2934 | end
2935 | ```
2936 |
2937 | *
2938 | `attr`の使用は避けましょう。代わりに`attr_reader`や`attr_accessor`を使いましょう。
2939 | [[link](#attr)]
2940 |
2941 | ```ruby
2942 | # 悪い例 - 1つのアクセサしか作れません(Ruby 1.9で廃止されました)
2943 | attr :something, true
2944 | attr :one, :two, :three # attr_readerと同じです
2945 |
2946 | # 良い例
2947 | attr_accessor :something
2948 | attr_reader :one, :two, :three
2949 | ```
2950 |
2951 | *
2952 | `Struct.new`の使用を考えましょう、
2953 | それは、単純なアクセサ、コンストラクタや比較演算子を定義してくれます。
2954 | [[link](#struct-new)]
2955 |
2956 | ```ruby
2957 | # 良い例
2958 | class Person
2959 | attr_accessor :first_name, :last_name
2960 |
2961 | def initialize(first_name, last_name)
2962 | @first_name = first_name
2963 | @last_name = last_name
2964 | end
2965 | end
2966 |
2967 | # より良い例
2968 | Person = Struct.new(:first_name, :last_name) do
2969 | end
2970 | ```
2971 |
2972 | *
2973 | `Struct.new`で初期化されたインスタンスを拡張してはいけません。
2974 | それは余分なクラスレベルをもたらし、
2975 | 複数回`require`された時に、奇妙なエラーの原因にもなります。
2976 | [[link](#no-extend-struct-new)]
2977 |
2978 | ```ruby
2979 | # 悪い例
2980 | class Person < Struct.new(:first_name, :last_name)
2981 | end
2982 |
2983 | # 良い例
2984 | Person = Struct.new(:first_name, :last_name)
2985 | ```
2986 |
2987 | *
2988 | あるクラスのインスタンス生成する追加の方法を提供したいときは、
2989 | ファクトリメソッドの追加を検討しましょう。
2990 | [[link](#factory-methods)]
2991 |
2992 | ```ruby
2993 | class Person
2994 | def self.create(options_hash)
2995 | # body omitted
2996 | end
2997 | end
2998 | ```
2999 |
3000 | *
3001 | 継承より[ダック・タイピング](https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)を使いましょう。
3002 | [[link](#duck-typing)]
3003 |
3004 | ```ruby
3005 | # 悪い例
3006 | class Animal
3007 | # abstract method
3008 | def speak
3009 | end
3010 | end
3011 |
3012 | # 継承
3013 | class Duck < Animal
3014 | def speak
3015 | puts 'Quack! Quack'
3016 | end
3017 | end
3018 |
3019 | # 継承
3020 | class Dog < Animal
3021 | def speak
3022 | puts 'Bau! Bau!'
3023 | end
3024 | end
3025 |
3026 | # 良い例
3027 | class Duck
3028 | def speak
3029 | puts 'Quack! Quack'
3030 | end
3031 | end
3032 |
3033 | class Dog
3034 | def speak
3035 | puts 'Bau! Bau!'
3036 | end
3037 | end
3038 | ```
3039 |
3040 | *
3041 | 継承での振る舞いが"扱いづらい"ので、クラス変数(`@@`)の使用は避けましょう。
3042 | [[link](#no-class-vars)]
3043 |
3044 | ```ruby
3045 | class Parent
3046 | @@class_var = 'parent'
3047 |
3048 | def self.print_class_var
3049 | puts @@class_var
3050 | end
3051 | end
3052 |
3053 | class Child < Parent
3054 | @@class_var = 'child'
3055 | end
3056 |
3057 | Parent.print_class_var # => will print 'child'
3058 | ```
3059 |
3060 | このように、ひとつのクラス階層に属するすべてのクラスは、
3061 | 1つのクラス変数を共有してしまいます。
3062 | クラス変数よりもクラスのインスタンス変数のほうを使うべきです。
3063 |
3064 | *
3065 | 意図した使い方に沿って、可視性(`private`、`protected`)を設定しましょう。
3066 | 全てを`public`(デフォルトの設定)のままにしないようにしましょう。
3067 | 結局私達は今 *Ruby* を書いているのだから。 *Python* ではなく。
3068 | [[link](#visibility)]
3069 |
3070 | *
3071 | `public`、`protected`、`private`は、適用するメソッド定義と同じインデントにしましょう。
3072 | そして、以降のすべてのメソッド定義に適用されることを強調するために、
3073 | それらの修飾子の前1行と後1行に空行を入れましょう。
3074 | [[link](#indent-public-private-protected)]
3075 |
3076 | ```ruby
3077 | class SomeClass
3078 | def public_method
3079 | # some code
3080 | end
3081 |
3082 | private
3083 |
3084 | def private_method
3085 | # some code
3086 | end
3087 |
3088 | def another_private_method
3089 | # some code
3090 | end
3091 | end
3092 | ```
3093 |
3094 | *
3095 | クラスメソッドを定義するときは`def self.method`を用いましょう。
3096 | クラス名を繰り返さないので、簡単にリファクタリングできるようになります。
3097 | [[link](#def-self-class-methods)]
3098 |
3099 | ```ruby
3100 | class TestClass
3101 | # 悪い例
3102 | def TestClass.some_method
3103 | # body omitted
3104 | end
3105 |
3106 | # 良い例
3107 | def self.some_other_method
3108 | # body omitted
3109 | end
3110 |
3111 | # たくさんのクラスメソッドを定義しなければならない時
3112 | # この書き方も便利です。
3113 | class << self
3114 | def first_method
3115 | # body omitted
3116 | end
3117 |
3118 | def second_method_etc
3119 | # body omitted
3120 | end
3121 | end
3122 | end
3123 | ```
3124 |
3125 | *
3126 | メソッドの別名をつける時は`alias`を使いましょう。
3127 | クラスのレキシカルスコープの中では`self`と同じように名前解決されます。
3128 | またユーザーにとっても、実行時やサブクラス側で明示的にエイリアスを変更しなければ、
3129 | 変更されないことが読み取りやすいです。
3130 | [[link](#alias-method-lexically)]
3131 |
3132 | ```ruby
3133 | class Westerner
3134 | def first_name
3135 | @names.first
3136 | end
3137 |
3138 | alias given_name first_name
3139 | end
3140 | ```
3141 |
3142 | `alias`は`def`と同じく予約語なので、シンボルや文字列よりも名前そのものを使いましょう。
3143 | 言い換えると、`alias :foo :bar`ではなく、`alias foo bar`と書きましょう。
3144 |
3145 | また、Rubyがエイリアスや継承をどのように扱うか注意しましょう。
3146 | `alias`はそれが定義された地点で解決されたメソッドを参照します。
3147 | 動的には解決されません。
3148 |
3149 | ```ruby
3150 | class Fugitive < Westerner
3151 | def first_name
3152 | 'Nobody'
3153 | end
3154 | end
3155 | ```
3156 |
3157 | この例では、`Fugitive#given_name`は、`Fugitive#first_name`ではなく、オリジナルの`Westerner#first_name`を呼び出します。
3158 | `Fugitive#given_name`もオーバーライドしたい時は、継承したクラスでも
3159 | 再定義しなければなりません。
3160 |
3161 | ```ruby
3162 | class Fugitive < Westerner
3163 | def first_name
3164 | 'Nobody'
3165 | end
3166 |
3167 | alias given_name first_name
3168 | end
3169 | ```
3170 |
3171 | *
3172 | モジュールやクラス、実行時のシングルトンクラス等では、
3173 | `alias`の挙動が予期できないので、
3174 | エイリアス定義には常に`alias_method`を用いましょう。
3175 | [[link](#alias-method)]
3176 |
3177 | ```ruby
3178 | module Mononymous
3179 | def self.included(other)
3180 | other.class_eval { alias_method :full_name, :given_name }
3181 | end
3182 | end
3183 |
3184 | class Sting < Westerner
3185 | include Mononymous
3186 | end
3187 | ```
3188 |
3189 | *
3190 | クラス(またはモジュール)メソッドが他のメソッドを呼び出す際は、
3191 | `self`または自分自身のクラス名の後に`.`を続けて使用しないようにしましょう。
3192 | これは、「サービスクラス」やそれと類似の、クラスがあたかも関数であるかのように
3193 | 扱われるコンセプトの場合でよく見られます。
3194 | この規則は、そのようなクラスで反復的なボイラープレートを減らす傾向があります。
3195 | [[link](#class-and-self)]
3196 |
3197 | ```ruby
3198 | class TestClass
3199 | # 悪い例 -- クラスのリネームやメソッドの移動の際に余分な手間がかかります
3200 | def self.call(param1, param2)
3201 | TestClass.new(param1).call(param2)
3202 | end
3203 |
3204 | # 悪い例 -- 必要以上に冗長です
3205 | def self.call(param1, param2)
3206 | self.new(param1).call(param2)
3207 | end
3208 |
3209 | # 良い例
3210 | def self.call(param1, param2)
3211 | new(param1).call(param2)
3212 | end
3213 |
3214 | # ...other methods...
3215 | end
3216 | ```
3217 |
3218 | ## 例外
3219 |
3220 | *
3221 | 例外は`fail`より`raise`を使いましょう。
3222 | [[link](#prefer-raise-over-fail)]
3223 |
3224 | ```ruby
3225 | # 悪い例
3226 | fail SomeException, 'message'
3227 |
3228 | # 良い例
3229 | raise SomeException, 'message'
3230 | ```
3231 |
3232 | *
3233 | 2引数の`raise`では、`RuntimeError`を明示しないようにしましょう。
3234 | [[link](#no-explicit-runtimeerror)]
3235 |
3236 | ```ruby
3237 | # 悪い例
3238 | raise RuntimeError, 'message'
3239 |
3240 | # 良い例 - デフォルトでRuntimeErrorが発生します
3241 | raise 'message'
3242 | ```
3243 |
3244 | *
3245 | `raise`の引数としては例外クラスのインスタンスよりも、
3246 | 例外クラスとメッセージをそれぞれの引数で渡す方を使いましょう。
3247 | [[link](#exception-class-messages)]
3248 |
3249 | ```ruby
3250 | # 悪い例
3251 | raise SomeException.new('message')
3252 | # `raise SomeException.new('message'), backtrace`とする書き方が存在しないことに注意しましょう。
3253 |
3254 | # 良い例
3255 | raise SomeException, 'message'
3256 | # `raise SomeException, 'message', backtrace`の用法と一貫性があります
3257 | ```
3258 |
3259 | *
3260 | `ensure`ブロックから`return`してはいけません。
3261 | もし`ensure`の中から明示的に値を返した場合は、
3262 | `return`はどの例外発生よりも優先されて、
3263 | 例外など発生していなかったかのように値を返してしまいます。
3264 | 事実上、例外は静かに捨てられます。
3265 | [[link](#no-return-ensure)]
3266 |
3267 | ```ruby
3268 | # 悪い例
3269 | def foo
3270 | raise
3271 | ensure
3272 | return 'very bad idea'
3273 | end
3274 | ```
3275 |
3276 | *
3277 | 可能な場所では、 *暗黙のbeginブロック* を用いましょう。
3278 | [[link](#begin-implicit)]
3279 |
3280 | ```ruby
3281 | # 悪い例
3282 | def foo
3283 | begin
3284 | # main logic goes here
3285 | rescue
3286 | # failure handling goes here
3287 | end
3288 | end
3289 |
3290 | # 良い例
3291 | def foo
3292 | # main logic goes here
3293 | rescue
3294 | # failure handling goes here
3295 | end
3296 | ```
3297 |
3298 | *
3299 | *不確実性のあるメソッド*(Avdi Grimmによって作られた言葉です)
3300 | を用いて`begin`の蔓延を和らげましょう。
3301 | [[link](#contingency-methods)]
3302 |
3303 | ```ruby
3304 | # 悪い例
3305 | begin
3306 | something_that_might_fail
3307 | rescue IOError
3308 | # handle IOError
3309 | end
3310 |
3311 | begin
3312 | something_else_that_might_fail
3313 | rescue IOError
3314 | # handle IOError
3315 | end
3316 |
3317 | # 良い例
3318 | def with_io_error_handling
3319 | yield
3320 | rescue IOError
3321 | # handle IOError
3322 | end
3323 |
3324 | with_io_error_handling { something_that_might_fail }
3325 |
3326 | with_io_error_handling { something_else_that_might_fail }
3327 | ```
3328 |
3329 | *
3330 | 例外をもみ消してはいけません。
3331 | [[link](#dont-hide-exceptions)]
3332 |
3333 | ```ruby
3334 | # 悪い例
3335 | begin
3336 | # an exception occurs here
3337 | rescue SomeError
3338 | # the rescue clause does absolutely nothing
3339 | end
3340 |
3341 | # 悪い例
3342 | do_something rescue nil
3343 | ```
3344 |
3345 | *
3346 | `rescue`を修飾子として利用するのは避けましょう。
3347 | [[link](#no-rescue-modifiers)]
3348 |
3349 | ```ruby
3350 | # 悪い例 - StandardErrorとそれを継承した全てのクラスをキャッチしてしまいます
3351 | read_file rescue handle_error($!)
3352 |
3353 | # 良い例 - Errno::ENOENTとそれを継承したクラスのみをキャッチします
3354 | def foo
3355 | read_file
3356 | rescue Errno::ENOENT => ex
3357 | handle_error(ex)
3358 | end
3359 | ```
3360 |
3361 |
3362 | *
3363 | 制御フローに例外を使っては行けません。
3364 | [[link](#no-exceptional-flows)]
3365 |
3366 | ```ruby
3367 | # 悪い例
3368 | begin
3369 | n / d
3370 | rescue ZeroDivisionError
3371 | puts 'Cannot divide by 0!'
3372 | end
3373 |
3374 | # 良い例
3375 | if d.zero?
3376 | puts 'Cannot divide by 0!'
3377 | else
3378 | n / d
3379 | end
3380 | ```
3381 |
3382 | *
3383 | `Exception`を`rescue`するのは避けましょう。
3384 | これは`exit`のシグナルも捕捉するため、プロセスを殺すのに`kill -9`が必要になります。
3385 | [[link](#no-blind-rescues)]
3386 |
3387 | ```ruby
3388 | # 悪い例
3389 | begin
3390 | # calls to exit and kill signals will be caught (except kill -9)
3391 | exit
3392 | rescue Exception
3393 | puts "you didn't really want to exit, right?"
3394 | # exception handling
3395 | end
3396 |
3397 | # 良い例
3398 | begin
3399 | # a blind rescue rescues from StandardError, not Exception as many
3400 | # programmers assume.
3401 | rescue => e
3402 | # exception handling
3403 | end
3404 |
3405 | # こちらも良い例
3406 | begin
3407 | # an exception occurs here
3408 |
3409 | rescue StandardError => e
3410 | # exception handling
3411 | end
3412 |
3413 | ```
3414 |
3415 | *
3416 | より詳細な例外を`rescue`チェーンの上に配置しましょう。
3417 | そうでなければ、決して`rescue`されません。
3418 | [[link](#exception-ordering)]
3419 |
3420 | ```ruby
3421 | # 悪い例
3422 | begin
3423 | # 処理
3424 | rescue StandardError => e
3425 | # エラー処理
3426 | rescue IOError => e
3427 | # 決して到達しないエラー処理
3428 | end
3429 |
3430 | # 良い例
3431 | begin
3432 | # 処理
3433 | rescue IOError => e
3434 | # エラー処理
3435 | rescue StandardError => e
3436 | # エラー処理
3437 | end
3438 | ```
3439 |
3440 | *
3441 | プログラム内で確保した外部リソースは、`ensure`で開放しましょう
3442 | [[link](#release-resources)]
3443 |
3444 | ```ruby
3445 | f = File.open('testfile')
3446 | begin
3447 | # .. process
3448 | rescue
3449 | # .. handle error
3450 | ensure
3451 | f.close if f
3452 | end
3453 | ```
3454 |
3455 | *
3456 | 自動的にリソースを開放してくれる機能を含むメソッドを利用可能な時は、そちらを使いましょう。
3457 | [[link](#auto-release-resources)]
3458 |
3459 | ```ruby
3460 | # 悪い例 - 明示的にファイルディスクリプタを閉じる必要が有ります
3461 | f = File.open('testfile')
3462 | # ファイルに対する何らかのアクション
3463 | f.close
3464 |
3465 | # 良い例 - ファイルディスクリプタは自動的に閉じられます
3466 | File.open('testfile') do |f|
3467 | # ファイルに対する何らかのアクション
3468 | end
3469 | ```
3470 |
3471 | *
3472 | 新しい例外クラスを導入するより、基本ライブラリの例外クラスを使いましょう
3473 | [[link](#standard-exceptions)]
3474 |
3475 | ## コレクション
3476 |
3477 | *
3478 | 配列やハッシュを生成する時はリテラル記法を使いましょう。
3479 | (コンストラクタに引数を渡す場合を除けば、ということですが)
3480 | [[link](#literal-array-hash)]
3481 |
3482 | ```ruby
3483 | # 悪い例
3484 | arr = Array.new
3485 | hash = Hash.new
3486 |
3487 | # 良い例
3488 | arr = []
3489 | arr = Array.new(10)
3490 | hash = {}
3491 | hash = Hash.new(0)
3492 | ```
3493 |
3494 | *
3495 | 単語(空でなく、スペースを含まない文字列)の配列を生成する時は
3496 | `%w`リテラルを使いましょう。
3497 | このルールは配列の要素が2つ以上の場合に限ります。
3498 | [[link](#percent-w)]
3499 |
3500 | ```ruby
3501 | # 悪い例
3502 | STATES = ['draft', 'open', 'closed']
3503 |
3504 | # 良い例
3505 | STATES = %w[draft open closed]
3506 | ```
3507 |
3508 | *
3509 | シンボルの配列が必要な時
3510 | (かつRuby 1.9との互換性を維持しなくていい時)は
3511 | `%i`リテラルを使いましょう。
3512 | このルールは配列の要素が2つ以上の場合に限ります。
3513 | [[link](#percent-i)]
3514 |
3515 | ```ruby
3516 | # 悪い例
3517 | STATES = [:draft, :open, :closed]
3518 |
3519 | # 良い例
3520 | STATES = %i[draft open closed]
3521 | ```
3522 |
3523 | *
3524 | `Array`や`Hash`リテラルの最後の要素の後ろの`,`は避けましょう。
3525 | 複数行にわかれていない時は特に避けましょう。
3526 | [[link](#no-trailing-array-commas)]
3527 |
3528 | ```ruby
3529 | # 悪い例 - 簡単に要素を移動・追加・削除できますが、それでもお奨めできません
3530 | VALUES = [
3531 | 1001,
3532 | 2020,
3533 | 3333,
3534 | ]
3535 |
3536 | # 悪い例
3537 | VALUES = [1001, 2020, 3333, ]
3538 |
3539 | # 良い例
3540 | VALUES = [1001, 2020, 3333]
3541 | ```
3542 |
3543 | *
3544 | 配列に大きな隙間を作るのは避けましょう。
3545 | [[link](#no-gappy-arrays)]
3546 |
3547 | ```ruby
3548 | arr = []
3549 | arr[100] = 1 # now you have an array with lots of nils
3550 | ```
3551 |
3552 | *
3553 | 配列の最初や最後にアクセスしたいときは、
3554 | `[0]`や`[-1]`より`first`や`last`を使いましょう。
3555 | [[link](#first-and-last)]
3556 |
3557 | *
3558 | 要素が一意のものを扱うときは、`Array`の代わりに`Set`を用いましょう。
3559 | `Set`は要素に重複と順序がないようなコレクションの実装です。
3560 | これは`Array`の直感的な二項演算子と、`Hash`の速さが合わさっています。
3561 | [[link](#set-vs-array)]
3562 |
3563 | *
3564 | ハッシュのキーには文字列よりシンボルが好まれます。
3565 | [[link](#symbols-as-keys)]
3566 |
3567 | ```ruby
3568 | # 悪い例
3569 | hash = { 'one' => 1, 'two' => 2, 'three' => 3 }
3570 |
3571 | # 良い例
3572 | hash = { one: 1, two: 2, three: 3 }
3573 | ```
3574 |
3575 | *
3576 | 変更のできるオブジェクトをハッシュのキーに使うのは避けましょう。
3577 | [[link](#no-mutable-keys)]
3578 |
3579 | *
3580 | ハッシュのキーがシンボルの時は、Ruby 1.9のハッシュリテラル記法を用いましょう。
3581 | [[link](#hash-literals)]
3582 |
3583 | ```ruby
3584 | # 悪い例
3585 | hash = { :one => 1, :two => 2, :three => 3 }
3586 |
3587 | # 良い例
3588 | hash = { one: 1, two: 2, three: 3 }
3589 | ```
3590 |
3591 | *
3592 | Ruby 1.9のハッシュ記法とロケット記法を同じハッシュリテラル内で混在させてはいけません。
3593 | シンボルでないキーがある場合は、ロケット記法を使いましょう。
3594 | [[link](#no-mixed-hash-syntaces)]
3595 |
3596 | ```ruby
3597 | # 悪い例
3598 | { a: 1, 'b' => 2 }
3599 |
3600 | # 良い例
3601 | { :a => 1, 'b' => 2 }
3602 | ```
3603 |
3604 | *
3605 | `Hash#has_key?`より`Hash#key?`を、
3606 | `Hash#has_value?`より`Hash#value?`を用いましょう。
3607 | [[link](#hash-key)]
3608 |
3609 | ```ruby
3610 | # 悪い例
3611 | hash.has_key?(:test)
3612 | hash.has_value?(value)
3613 |
3614 | # 良い例
3615 | hash.key?(:test)
3616 | hash.value?(value)
3617 | ```
3618 |
3619 | *
3620 | `Hash#keys.each` の代わりに `Hash#each_key` を、 `Hsah#values.each` の代わりに
3621 | `Hash#each_value` を用いましょう。
3622 | [[link](#hash-each)]
3623 |
3624 | ```ruby
3625 | # 悪い例
3626 | hash.keys.each { |k| p k }
3627 | hash.values.each { |v| p v }
3628 | hash.each { |k, _v| p k }
3629 | hash.each { |_k, v| p v }
3630 |
3631 | # 良い例
3632 | hash.each_key { |k| p k }
3633 | hash.each_value { |v| p v }
3634 | ```
3635 |
3636 | *
3637 | 存在すべきキーを扱う時は、`Hash#fetch`を用いましょう。
3638 | [[link](#hash-fetch)]
3639 |
3640 | ```ruby
3641 | heroes = { batman: 'Bruce Wayne', superman: 'Clark Kent' }
3642 | # 悪い例 - もし誤りがあってもすぐに気づくことができないかもしれません
3643 | heroes[:batman] # => 'Bruce Wayne'
3644 | heroes[:supermann] # => nil
3645 |
3646 | # 良い例 - fetchはKeyErrorを投げるので、問題が明らかになります
3647 | heroes.fetch(:supermann)
3648 | ```
3649 |
3650 | *
3651 | `Hash#fetch`のデフォルト値を使い、自力でロジックを書かないようにしましょう。
3652 | [[link](#hash-fetch-defaults)]
3653 |
3654 | ```ruby
3655 | batman = { name: 'Bruce Wayne', is_evil: false }
3656 |
3657 | # 悪い例 - たんに||演算子を使ってしまうと偽値が入っていた時に望まない結果になります
3658 | batman[:is_evil] || true # => true
3659 |
3660 | # 良い例 - fetchなら偽値でも正しく動きます
3661 | batman.fetch(:is_evil, true) # => false
3662 | ```
3663 |
3664 | *
3665 | `Hash#fetch`のデフォルト値は評価するべき式に副作用があったり実行コストが高いときはうまくいかないので、代わりにブロックを使いましょう。
3666 | [[link](#use-hash-blocks)]
3667 |
3668 | ```ruby
3669 | batman = { name: 'Bruce Wayne' }
3670 |
3671 | # 悪い例 - デフォルト値が使われると、先に評価してしまいます
3672 | # だから、もし複数回呼ばれると、プログラムが遅くなります
3673 | batman.fetch(:powers, get_batman_powers) # get_batman_powers は高コストな呼び出し
3674 |
3675 | # 良い例 - ブロックは後から評価されます。だから、KeyErrorが評価の引き金になります
3676 | batman.fetch(:powers) { get_batman_powers }
3677 | ```
3678 |
3679 | *
3680 | ハッシュから連続して複数の値が必要になる時は、`Hash#values_at`を用いましょう。
3681 | [[link](#hash-values-at)]
3682 |
3683 | ```ruby
3684 | # 悪い例
3685 | email = data['email']
3686 | username = data['nickname']
3687 |
3688 | # 良い例
3689 | email, username = data.values_at('email', 'nickname')
3690 | ```
3691 |
3692 | *
3693 | Ruby 1.9以降、ハッシュは順序付けられるということを信頼しましょう。
3694 | [[link](#ordered-hashes)]
3695 |
3696 | *
3697 | コレクションを走査している時に変更を加えてはいけません。
3698 | [[link](#no-modifying-collections)]
3699 |
3700 | *
3701 | コレクションにアクセスするとき、`[n]`の代替のリーダーメソッドが提供されている場合に
3702 | 直接`[n]`経由でアクセスすることは避けましょう。
3703 | `nil`に対して`[]`を呼ぶことを避けることが出来ます。
3704 | [[link](#accessing-elements-directly)]
3705 |
3706 | ```ruby
3707 | # 悪い例
3708 | Regexp.last_match[1]
3709 |
3710 | # 良い例
3711 | Regexp.last_match(1)
3712 | ```
3713 |
3714 | *
3715 | コレクションに対するアクセサを提供するとき、
3716 | コレクション内の要素にアクセスする前に、
3717 | `nil`でアクセスするのを防ぐための代替のアクセス方法を提供しましょう。
3718 | [[link](#provide-alternate-accessor-to-collections)]
3719 |
3720 | ```ruby
3721 | # 悪い例
3722 | def awesome_things
3723 | @awesome_things
3724 | end
3725 |
3726 | # 良い例
3727 | def awesome_things(index = nil)
3728 | if index && @awesome_things
3729 | @awesome_things[index]
3730 | else
3731 | @awesome_things
3732 | end
3733 | end
3734 | ```
3735 |
3736 | ## 数値
3737 |
3738 | *
3739 | 整数型の型をチェックする為に、`Integer`を使用して下さい。
3740 | `Fixnum`はプラットフォームに依存するため、32ビットマシンと64ビットマシンで異なる結果が返されます。
3741 | [[link](#integer-type-checking)]
3742 |
3743 | ```ruby
3744 | timestamp = Time.now.to_i
3745 |
3746 | # 悪い例
3747 | timestamp.is_a? Fixnum
3748 | timestamp.is_a? Bignum
3749 |
3750 | # 良い例
3751 | timestamp.is_a? Integer
3752 | ```
3753 |
3754 | *
3755 | 乱数を生成する場合は、整数とオフセットの代わりに範囲リテラルを使用しましょう。
3756 | 意図が明確であるためです。サイコロの役割をシミュレートすることを想像してください:
3757 | [[link](#random-numbers)]
3758 |
3759 | ```ruby
3760 | # 悪い例
3761 | rand(6) + 1
3762 |
3763 | # 良い例
3764 | rand(1..6)
3765 | ```
3766 |
3767 | ## 文字列
3768 |
3769 | *
3770 | 文字列連結の代わりに文字列挿入や文字列整形を使いましょう。
3771 | [[link](#string-interpolation)]
3772 |
3773 | ```ruby
3774 | # 悪い例
3775 | email_with_name = user.name + ' <' + user.email + '>'
3776 |
3777 | # 良い例
3778 | email_with_name = "#{user.name} <#{user.email}>"
3779 |
3780 | # 良い例
3781 | email_with_name = format('%s <%s>', user.name, user.email)
3782 | ```
3783 |
3784 | *
3785 | 文字列リテラルの引用符は一貫したスタイルで使いましょう。
3786 | Rubyコミュニティでは、
3787 | デフォルトでシングルクォートを用いるもの (Option A)、
3788 | ダブルクォートを用いるもの (Option B)
3789 | の二つのよく使われるスタイルがあって、
3790 | どちらも良いと考えられています。
3791 | [[link](#consistent-string-literals)]
3792 |
3793 | * **(Option A)** 文字列挿入の必要がないときや、`\t`や`\n``’`等の特別な文字がない場合は、
3794 | シングルクォーテーションを使いましょう。
3795 |
3796 | ```ruby
3797 | # 悪い例
3798 | name = "Bozhidar"
3799 |
3800 | name = 'De\'Andre'
3801 |
3802 | # 良い例
3803 | name = 'Bozhidar'
3804 |
3805 | name = "De'Andre"
3806 | ```
3807 |
3808 | * **(Option B)** 文字列中に`"`を含んでいたり、エスケープ文字を抑えたいときでない限り、
3809 | ダブルクォーテーションを使いましょう。
3810 |
3811 | ```ruby
3812 | # 悪い例
3813 | name = 'Bozhidar'
3814 |
3815 | sarcasm = "I \"like\" it."
3816 |
3817 | # 良い例
3818 | name = "Bozhidar"
3819 |
3820 | sarcasm = 'I "like" it.'
3821 | ```
3822 |
3823 | このガイド内の文字列リテラル表記は、
3824 | 1つ目のスタイルを採用しています。
3825 |
3826 | *
3827 | 文字リテラル構文`?x`を用いてはいけません。
3828 | Ruby 1.9以降、この表記法を必要とする場面はないはずです —
3829 | `?x`は`'x'`(1文字の文字列)と解釈されるからです。
3830 | [[link](#no-character-literals)]
3831 |
3832 | ```ruby
3833 | # 悪い例
3834 | char = ?c
3835 |
3836 | # 良い例
3837 | char = 'c'
3838 | ```
3839 |
3840 | *
3841 | 文字列の中の挿入されるインスタンス変数やグローバル変数の周りの
3842 | `{}`は省略してはいけません。
3843 | [[link](#curlies-interpolate)]
3844 |
3845 | ```ruby
3846 | class Person
3847 | attr_reader :first_name, :last_name
3848 |
3849 | def initialize(first_name, last_name)
3850 | @first_name = first_name
3851 | @last_name = last_name
3852 | end
3853 |
3854 | # 悪い例 - 有効ですが不格好です
3855 | def to_s
3856 | "#@first_name #@last_name"
3857 | end
3858 |
3859 | # 良い例
3860 | def to_s
3861 | "#{@first_name} #{@last_name}"
3862 | end
3863 | end
3864 |
3865 | $global = 0
3866 | # 悪い例
3867 | puts "$global = #$global"
3868 |
3869 | # 良い例
3870 | puts "$global = #{$global}"
3871 | ```
3872 |
3873 | *
3874 | 文字列に挿入するときに`Object#to_s`を使ってはいけません。
3875 | 自動的に呼び出されます。
3876 | [[link](#no-to-s)]
3877 |
3878 | ```ruby
3879 | # 悪い例
3880 | message = "This is the #{result.to_s}."
3881 |
3882 | # 良い例
3883 | message = "This is the #{result}."
3884 | ```
3885 |
3886 | *
3887 | 大きなデータの塊を作る必要があるときは、`String#+`の使用は避けましょう。
3888 | 代わりに、`String#<<`を使いましょう。
3889 | 文字列連結は、文字列インスタンスを直接書き換えるため、
3890 | たくさんの新しいオブジェクトを作ってしまう`String#+`よりも常に速いです。
3891 | [[link](#concat-strings)]
3892 |
3893 | ```ruby
3894 | # 悪い例
3895 | html = ''
3896 | html += 'Page title
'
3897 |
3898 | paragraphs.each do |paragraph|
3899 | html += "#{paragraph}
"
3900 | end
3901 |
3902 | # 良く、そして速い例
3903 | html = ''
3904 | html << 'Page title
'
3905 |
3906 | paragraphs.each do |paragraph|
3907 | html << "#{paragraph}
"
3908 | end
3909 | ```
3910 |
3911 | *
3912 | 利用するケースにより特化した速い代替手段がある場合、`String#gsub`は使わないようにしましょう。
3913 | [[link](#dont-abuse-gsub)]
3914 |
3915 | ```ruby
3916 | url = 'http://example.com'
3917 | str = 'lisp-case-rules'
3918 |
3919 | # 悪い例
3920 | url.gsub('http://', 'https://')
3921 | str.gsub('-', '_')
3922 |
3923 | # 良い例
3924 | url.sub('http://', 'https://')
3925 | str.tr('-', '_')
3926 | ```
3927 |
3928 | *
3929 | 複数行のヒアドキュメントを用いるときは、
3930 | 先頭のスペースも保持してしまうということを頭に入れておかなければなりません。
3931 | 過剰なスペースを取り除くためのマージンを採用するのはよい習慣です。
3932 | [[link](#heredocs)]
3933 |
3934 | ```ruby
3935 | code = <<-END.gsub(/^\s+\|/, '')
3936 | |def test
3937 | | some_method
3938 | | other_method
3939 | |end
3940 | END
3941 | # => "def test\n some_method\n other_method\nend\n"
3942 | ```
3943 |
3944 | *
3945 | きちんとインデントされた複数行の文字列には、Ruby 2.3 の、インデントされた
3946 | ヒアドキュメントを使いましょう。
3947 | [[link](#squiggly-heredocs)]
3948 |
3949 | ```ruby
3950 | # 悪い例 - Powerpack の String#strip_margin を使用しています。
3951 | code = <<-RUBY.strip_margin('|')
3952 | |def test
3953 | | some_method
3954 | | other_method
3955 | |end
3956 | RUBY
3957 |
3958 | # こちらも悪い例
3959 | code = <<-RUBY
3960 | def test
3961 | some_method
3962 | other_method
3963 | end
3964 | RUBY
3965 |
3966 | # 良い例
3967 | code = <<~RUBY
3968 | def test
3969 | some_method
3970 | other_method
3971 | end
3972 | RUBY
3973 | ```
3974 |
3975 | *
3976 |
3977 | ヒアドキュメントのデリミタは説明的な名前にしましょう。
3978 | デリミタはヒアドキュメントの内容に関して追加の情報になりますし、
3979 | エディタによっては適切なデリミタを使うことでヒアドキュメント内のコードをハイライトしてくれるかもしれません。
3980 | [[link](#heredoc-delimiters)]
3981 |
3982 | ```ruby
3983 | # 悪い例
3984 | code = <<~END
3985 | def foo
3986 | bar
3987 | end
3988 | END
3989 |
3990 | # 良い例
3991 | code = <<~RUBY
3992 | def foo
3993 | bar
3994 | end
3995 | RUBY
3996 |
3997 | # 良い例
3998 | code = <<~SUMMARY
3999 | 著名なSF作家アーサー C. クラークの短編を独創的に解釈したこの作品では、
4000 | 巨大な黒色の構造物が過去、そして未来とのつながりを指し示す。
4001 | SUMMARY
4002 | ```
4003 |
4004 | ## 日時
4005 |
4006 | *
4007 | 現在のシステム時間を読み出すには、`Time.new`よりも`Time.now`を使いましょう。
4008 | [[link](#time-now)]
4009 |
4010 | *
4011 | 改暦を考慮する必要がある場合を除いて、`DateTime`を使用しないようにしましょう。
4012 | もし必要な場合は、`start`引数を明示的に指定して意図を明示して下さい。
4013 | [[link](#no-datetime)]
4014 |
4015 | ```ruby
4016 | # 悪い例 - DateTimeを現在の時刻の為に使用
4017 | DateTime.now
4018 |
4019 | # 良い例 - Timeを現在の時刻の為に使用
4020 | Time.now
4021 |
4022 | # 悪い例 - DateTimeを現代の日の為に使用
4023 | DateTime.iso8601('2016-06-29')
4024 |
4025 | # 良い例 - Dateを現代の日の為に使用
4026 | Date.iso8601('2016-06-29')
4027 |
4028 | # 良い例 - DateTimeを`start`と共に過去の日付の為に使用
4029 | DateTime.iso8601('1751-04-23', Date::ENGLAND)
4030 | ```
4031 |
4032 | ## 正規表現
4033 |
4034 | > なにか問題に突き当たった時、「わかった、正規表現を使えばいいんだ」と思う人がいますね。
4035 | > その時、元の問題のほかにもう一つ問題が加わっているんです。
4036 | > -- Jamie Zawinski
4037 |
4038 | *
4039 | 単に文字列中から文字列を探すだけの時は、
4040 | 正規表現を使ってはいけません: `string['text']`を使いましょう。
4041 | [[link](#no-regexp-for-plaintext)]
4042 |
4043 | *
4044 | 文字列の添字に直接正規表現を渡すことで、文字列の構築をシンプルにできます。
4045 | [[link](#regexp-string-index)]
4046 |
4047 | ```ruby
4048 | match = string[/regexp/] # マッチした内容が得られる
4049 | first_group = string[/text(grp)/, 1] # キャプチャグループの内容が得られる
4050 | string[/text (grp)/, 1] = 'replace' # string => 'text replace'
4051 | ```
4052 |
4053 | *
4054 | キャプチャした結果を使う必要のないときは、キャプチャしないグループを用いましょう。
4055 | [[link](#non-capturing-regexp)]
4056 |
4057 | ```ruby
4058 | # 悪い例
4059 | /(first|second)/
4060 |
4061 | # 良い例
4062 | /(?:first|second)/
4063 | ```
4064 |
4065 | *
4066 | 最後に正規表現にマッチした値を示すPerlレガシーの暗号的な変数を用いてはいけません
4067 | (`$1`、`$2`など)。
4068 | 代わりに`Regexp.last_match(n)`を用いましょう。
4069 | [[link](#no-perl-regexp-last-matchers)]
4070 |
4071 | ```ruby
4072 | /(regexp)/ =~ string
4073 | ...
4074 |
4075 | # 悪い例
4076 | process $1
4077 |
4078 | # 良い例
4079 | process Regexp.last_match(1)
4080 | ```
4081 |
4082 |
4083 | *
4084 | どの値が入っているか追うのが困難になるので、
4085 | グループ番号を使うのは避けましょう。
4086 | 代わりにグループに名前をつけましょう。
4087 | [[link](#no-numbered-regexes)]
4088 |
4089 | ```ruby
4090 | # 悪い例
4091 | /(regexp)/ =~ string
4092 | # some code
4093 | process Regexp.last_match(1)
4094 |
4095 | # 良い例
4096 | /(?regexp)/ =~ string
4097 | # some code
4098 | process meaningful_var
4099 | ```
4100 |
4101 | *
4102 | 文字クラスの中では、特別な意味を持つ文字が少ないので注意が必要です:
4103 | `^`、`-`、`\`、`]`のみが特別な意味を持つので、
4104 | `.`や括弧を`[]`の中でエスケープしてはいけません。
4105 | [[link](#limit-escapes)]
4106 |
4107 | *
4108 | `^`や`$`は、文字列の先頭や末尾ではなく、
4109 | 行頭や行末にマッチするので注意が必要です。
4110 | もし文字列全体の先頭末尾にマッチさせたいときは、
4111 | `\A`、`\z`を使いましょう
4112 | (`\n?\z`と等価である`\Z`と混同しないようにしましょう)。
4113 | [[link](#caret-and-dollar-regexp)]
4114 |
4115 | ```ruby
4116 | string = "some injection\nusername"
4117 | string[/^username$/] # matches
4118 | string[/\Ausername\z/] # don't match
4119 | ```
4120 |
4121 | *
4122 | 複雑な正規表現には`x`識別子を用いましょう。
4123 | これを用いることで、より読みやすくなり、
4124 | 便利なコメントを使えるようになります。
4125 | スペースが無視されることに注意しましょう。
4126 | [[link](#comment-regexes)]
4127 |
4128 | ```ruby
4129 | regexp = /
4130 | start # some text
4131 | \s # white space char
4132 | (group) # first group
4133 | (?:alt1|alt2) # some alternation
4134 | end
4135 | /x
4136 | ```
4137 |
4138 | *
4139 | `sub`/`gsub`での複雑な置換は、ブロックやハッシュを用いることで実現できます。
4140 | [[link](#gsub-blocks)]
4141 |
4142 | ```ruby
4143 | words = 'foo bar'
4144 | words.sub(/f/, 'f' => 'F') # => 'Foo bar'
4145 | words.gsub(/\w+/) { |word| word.capitalize } # => 'Foo Bar'
4146 | ```
4147 |
4148 | ## パーセントリテラル
4149 |
4150 | *
4151 | 文字列挿入と`"`文字の双方が入る1行の文字列には、
4152 | `%()`(`%Q()`の短縮形)を使いましょう。
4153 | 複数行の時はヒアドキュメントを使いましょう。
4154 | [[link](#percent-q-shorthand)]
4155 |
4156 | ```ruby
4157 | # 悪い例 (挿入の必要がありません)
4158 | %(Some text
)
4159 | # 'Some text
' であるべき
4160 |
4161 | # 悪い例 (ダブルクォートがありません)
4162 | %(This is #{quality} style)
4163 | # "This is #{quality} style" であるべき
4164 |
4165 | # 悪い例 (複数行です)
4166 | %(\n#{exclamation}\n
)
4167 | # ヒアドキュメントであるべき
4168 |
4169 | # 良い例 (挿入が必要、ダブルクォートがある、そして1行です)
4170 | %(| #{name} | )
4171 | ```
4172 |
4173 | *
4174 | 文字列に`'`と`"`双方が含まれない限り、
4175 | `%()`や、それと同等の`%q()`の使用は避けましょう。
4176 | 通常の文字列リテラルのほうがより読みやすいので、
4177 | エスケープが大量に必要出ない限りは、そちらを使いましょう。
4178 | [[link](#percent-q)]
4179 |
4180 | ```ruby
4181 | # 悪い例
4182 | name = %q(Bruce Wayne)
4183 | time = %q(8 o'clock)
4184 | question = %q("What did you say?")
4185 |
4186 | # 良い例
4187 | name = 'Bruce Wayne'
4188 | time = "8 o'clock"
4189 | question = '"What did you say?"'
4190 | ```
4191 |
4192 | *
4193 | `'/'`が1つ *以上の* 正規表現に限り、`%r`を使いましょう。
4194 | [[link](#percent-r)]
4195 |
4196 | ```ruby
4197 | # 悪い例
4198 | %r{\s+}
4199 |
4200 | # 良い例
4201 | %r{^/(.*)$}
4202 | %r{^/blog/2011/(.*)$}
4203 | ```
4204 |
4205 | *
4206 | 呼び出すコマンドにバッククォートが含まれる(かなり起こりえないが)ことがない限り、
4207 | `%x`の使用は避けましょう。
4208 | [[link](#percent-x)]
4209 |
4210 | ```ruby
4211 | # 悪い例
4212 | date = %x(date)
4213 |
4214 | # 良い例
4215 | date = `date`
4216 | echo = %x(echo `date`)
4217 | ```
4218 |
4219 | *
4220 | `%s`の使用は避けましょう。
4221 | Rubyコミュニティは、スペースを含むシンボルを作る時は
4222 | `:"文字列"`がよいと決めたようです。
4223 | [[link](#percent-s)]
4224 |
4225 | *
4226 | さまざまな種類のパーセントリテラルに最も適した括弧を使用します。
4227 | [[link](#percent-literal-braces)]
4228 | - 文字列リテラル(`%q`, `%Q`)には`()`を使用しましょう。
4229 | - 配列リテラル(`%w`, `%i`, `%W`, `%I`)には、標準の配列リテラルに
4230 | 合わせて`[]`を使用しましょう。
4231 | - 正規表現リテラル(`%r`)には、`{}`を使用しましょう。
4232 | 正規表現の中に括弧が現れることが多いためです。
4233 | `{`が最も一般的でない為、`%r`の区切り文字には最適です。
4234 | - その他のリテラル(例えば `%s`, `%x`)には`()`を使用しましょう。
4235 |
4236 | ```ruby
4237 | # 悪い例
4238 | %q{"Test's king!", John said.}
4239 |
4240 | # 良い例
4241 | %q("Test's king!", John said.)
4242 |
4243 | # 悪い例
4244 | %w(one two three)
4245 | %i(one two three)
4246 |
4247 | # 良い例
4248 | %w[one two three]
4249 | %i[one two three]
4250 |
4251 | # 悪い例
4252 | %r((\w+)-(\d+))
4253 | %r{\w{1,2}\d{2,5}}
4254 |
4255 | # 良い例
4256 | %r{(\w+)-(\d+)}
4257 | %r|\w{1,2}\d{2,5}|
4258 | ```
4259 |
4260 | ## メタプログラミング
4261 |
4262 | *
4263 | 不要なメタプログラミングは避けましょう。
4264 | [[link](#no-needless-metaprogramming)]
4265 |
4266 | *
4267 | ライブラリを作成する時にコアクラスを汚染するのはやめましょう。
4268 | (モンキーパッチを当ててはいけません)。
4269 | [[link](#no-monkey-patching)]
4270 |
4271 | *
4272 | ブロック渡しの`class_eval`のほうが、文字列挿入型よりも好ましいです。
4273 | [[link](#block-class-eval)]
4274 |
4275 | ```ruby
4276 | class_eval 'def use_relative_model_naming?; true; end', __FILE__, __LINE__
4277 | ```
4278 |
4279 | - 文字列挿入型を使う時は、バックトレースが働くように、常に`__FILE__`と`__LINE__`を渡しましょう:
4280 |
4281 | ```ruby
4282 | class_eval 'def use_relative_model_naming?; true; end', __FILE__, __LINE__
4283 | ```
4284 |
4285 | - `define_method`の方が、`class_eval{ def ... }`よりも好ましいです。
4286 |
4287 | *
4288 | 文字列挿入型の`class_eval`(または他の`eval`)を用いる時は、
4289 | 挿入されたときのコードをコメントに追加しましょう(Railsで使われているプラクティス)。
4290 | [[link](#eval-comment-docs)]
4291 |
4292 | ```ruby
4293 | # from activesupport/lib/active_support/core_ext/string/output_safety.rb
4294 | UNSAFE_STRING_METHODS.each do |unsafe_method|
4295 | if 'String'.respond_to?(unsafe_method)
4296 | class_eval <<-EOT, __FILE__, __LINE__ + 1
4297 | def #{unsafe_method}(*params, &block) # def capitalize(*params, &block)
4298 | to_str.#{unsafe_method}(*params, &block) # to_str.capitalize(*params, &block)
4299 | end # end
4300 |
4301 | def #{unsafe_method}!(*params) # def capitalize!(*params)
4302 | @dirty = true # @dirty = true
4303 | super # super
4304 | end # end
4305 | EOT
4306 | end
4307 | end
4308 | ```
4309 |
4310 | *
4311 | `method_missing`を用いたメタプログラミングは避けましょう。
4312 | 何故なら、バックトレースがよくわからなくなるし、
4313 | `#methods`のリストの中に出てこず、
4314 | ミススペルしたメソッド呼び出しも無言で動いてしまいます、
4315 | 例えば`nukes.launch_state = false`のようにです。
4316 | 代わりに、移譲、プロキシ、または`define_method`を使いましょう。
4317 | もし`method_missing`を使わなければならない時は:
4318 | [[link](#no-method-missing)]
4319 |
4320 | - [`respond_to_missing?`](http://blog.marc-andre.ca/2010/11/methodmissing-politely.html)も実装されているか確かめましょう
4321 | - 既知の接頭辞、`find_by_*`のようなものだけを捕捉しましょう -- 可能な限りアサートさせましょう
4322 | - 最後に`super`を呼び出しましょう
4323 | - アサートする、特別でないメソッドに移譲しましょう:
4324 |
4325 | ```ruby
4326 | # 悪い例
4327 | def method_missing(meth, *params, &block)
4328 | if /^find_by_(?.*)/ =~ meth
4329 | # ... lots of code to do a find_by
4330 | else
4331 | super
4332 | end
4333 | end
4334 |
4335 | # 良い例
4336 | def method_missing(meth, *args, &block)
4337 | if /^find_by_(?.*)/ =~ meth
4338 | find_by(prop, *args, &block)
4339 | else
4340 | super
4341 | end
4342 | end
4343 |
4344 | # というか、最も良い選択は、発見できる全てのアトリビュートにdefine_methodすることです
4345 | ```
4346 |
4347 | *
4348 | `private`/`protected`制約を回避しないために、`send`よりも`public_send`を使いましょう。
4349 | [[link](#prefer-public-send)]
4350 |
4351 | ```ruby
4352 | # OrganizationというActiveModelがあって、Activatableをincludeしている
4353 | module Activatable
4354 | extend ActiveSupport::Concern
4355 |
4356 | included do
4357 | before_create :create_token
4358 | end
4359 |
4360 | private
4361 |
4362 | def reset_token
4363 | # some code
4364 | end
4365 |
4366 | def create_token
4367 | # some code
4368 | end
4369 |
4370 | def activate!
4371 | # some code
4372 | end
4373 | end
4374 |
4375 | class Organization < ActiveRecord::Base
4376 | include Activatable
4377 | end
4378 |
4379 | linux_organization = Organization.find(...)
4380 | # 悪い例 - 可視性を無視している
4381 | linux_organization.send(:reset_token)
4382 | # 良い例 - 例外があがる
4383 | linux_organization.public_send(:reset_token)
4384 | ```
4385 |
4386 | *
4387 | `send`は他の既存のメソッドと衝突するかもしれないので、`__send__`を使いましょう。
4388 | [[link](#prefer-__send__)]
4389 |
4390 | ```ruby
4391 | require 'socket'
4392 |
4393 | u1 = UDPSocket.new
4394 | u1.bind('127.0.0.1', 4913)
4395 | u2 = UDPSocket.new
4396 | u2.connect('127.0.0.1', 4913)
4397 | # レシーバーオブジェクトにメッセージが送信されない
4398 | # かわりに、UDPソケット経由でメッセージが送信されてしまう
4399 | u2.send :sleep, 0
4400 | # こちらならたしかにレシーバーオブジェクトにメッセージが送信される
4401 | u2.__send__ ...
4402 | ```
4403 |
4404 | ## 雑則
4405 |
4406 | *
4407 | `ruby -w`で実行しても何も警告されないコードを書きましょう。
4408 | [[link](#always-warn)]
4409 |
4410 | *
4411 | オプショナルな変数としてのハッシュの使用を避けましょう。そのメソッドはあまりにたくさんのことをやろうとしていませんか?(オブジェクトの初期化はこのルールの例外です)
4412 | [[link](#no-optional-hash-params)]
4413 |
4414 | *
4415 | コードのある行が10行を超えるメソッドは避けましょう。
4416 | 理想を言えば、多くのメソッドは5行以内がよいです。
4417 | 空行は行数には含めません。
4418 | [[link](#short-methods)]
4419 |
4420 | *
4421 | 3つや4つ以上引数を設定するのは避けましょう。
4422 | [[link](#too-many-params)]
4423 |
4424 | *
4425 | もし本当にグローバルなメソッドが必要な場合は、
4426 | Kernelに定義し、privateに設定しましょう。
4427 | [[link](#private-global-methods)]
4428 |
4429 | *
4430 | グローバル変数の代わりに、モジュールのインスタンス変数を使用しましょう。
4431 | [[link](#instance-vars)]
4432 |
4433 | ```ruby
4434 | # 悪い例
4435 | $foo_bar = 1
4436 |
4437 | # 良い例
4438 | module Foo
4439 | class << self
4440 | attr_accessor :bar
4441 | end
4442 | end
4443 |
4444 | Foo.bar = 1
4445 | ```
4446 |
4447 | *
4448 | 複雑なコマンドラインオプションをパースするために`OptionParser`を使いましょう。
4449 | また、些細なオプションには`ruby -s`を使いましょう。
4450 | [[link](#optionparser)]
4451 |
4452 | *
4453 | 破壊的変更をしなくても済むなら、できるだけ関数的プログラミング手法を使いましょう。
4454 | [[link](#functional-code)]
4455 |
4456 |
4457 | ```ruby
4458 | a = []; [1, 2, 3].each { |i| a << i * 2 } # 悪い例
4459 | a = [1, 2, 3].map { |i| i * 2 } # 良い例
4460 |
4461 | a = {}; [1, 2, 3].each { |i| a[i] = i * 17 } # 悪い例
4462 | a = [1, 2, 3].reduce({}) { |h, i| h[i] = i * 17; h } # 良い例
4463 | a = [1, 2, 3].each_with_object({}) { |i, h| h[i] = i * 17 } # 良い例
4464 | ```
4465 |
4466 | *
4467 | それがメソッドの目的でない限り、引数に破壊的変更をするのはやめましょう。
4468 | [[link](#no-param-mutations)]
4469 |
4470 | *
4471 | 3段階を超えるブロックのネストは避けましょう。
4472 | [[link](#three-is-the-number-thou-shalt-count)]
4473 |
4474 | *
4475 | 一貫性を保ちましょう。理想を言えば、このガイドラインに沿いましょう。
4476 | [[link](#be-consistent)]
4477 |
4478 | *
4479 | 常識を用いましょう。
4480 | [[link](#common-sense)]
4481 |
4482 | ## ツール
4483 |
4484 | ここでは、このガイドに反するコードを自動的にチェックするのを支援するツールをいくつか紹介します。
4485 |
4486 | ### RuboCop
4487 |
4488 | [RuboCop][]は、このガイドに基づいた
4489 | Rubyコードスタイルチェッカーです。
4490 | RuboCopはすでにこのガイドの重要な部分をカバーしており、
4491 | MRI 1.9、MRI 2.0 双方をサポートし、Emacs向けのよいプラグインがあります。
4492 |
4493 | ### RubyMine
4494 |
4495 | [RubyMine](http://www.jetbrains.com/ruby/) のコードインスペクションは、このガイドに
4496 | [部分的に基づいています](http://confluence.jetbrains.com/display/RUBYDEV/RubyMine+Inspections)。
4497 |
4498 | # Contributing
4499 |
4500 | このガイドはまだ未完成です — いくつかのルールは例がなく、 いくつかのルールの例はじゅうぶんにクリアにルールを説明できていません。
4501 | そのようなルールの改善はRubyコミュニティを助ける素晴らしい(そしてシンプルな)手段です!
4502 |
4503 | これらの課題はやがて解決されると思いたいです — ただ現状にご留意ください。
4504 |
4505 | このガイドに書いてあることには変更不能なものはありません。
4506 | Rubyのコードスタイルに興味のある全ての人と共に取り組むことで、
4507 | 究極的には、全てのRubyコミュニティにとって有益なリソースを作ることができればと思っています。
4508 |
4509 | 改善のために、遠慮せずチケットを立てたりプルリクエストを送ったりしてください。
4510 | あなたの手助けに予め感謝します!
4511 |
4512 | また、このプロジェクト(とRuboCop)への金銭的な貢献は、
4513 | [Patreon](https://www.patreon.com/bbatsov)経由で行うことができます。
4514 |
4515 | ## 貢献するには
4516 |
4517 | 簡単です! [contribution guidelines](https://github.com/rubocop-hq/ruby-style-guide/blob/master/CONTRIBUTING.md)を読んでください!
4518 |
4519 | # ライセンス
4520 |
4521 | 
4522 | この著作物は、[Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/deed.en_US)
4523 | に従います。
4524 |
4525 | # 広めましょう
4526 |
4527 | コミュニティ駆動のスタイルガイドは、これを知らないコミュニティにはほとんど役に立ちません。
4528 | このガイドについてつぶやいたり、友達や同僚にシェアしてください。
4529 | 全てのコメント、提案、オプションがこのガイドを少しだけでも良くしていきます。
4530 | そして、考えうるベストのガイドが欲しいですよね?
4531 |
4532 | ありがとう
4533 | [Bozhidar](https://twitter.com/bbatsov)
4534 |
4535 | [PEP-8]: https://www.python.org/dev/peps/pep-0008/
4536 | [rails-style-guide]: https://github.com/rubocop-hq/rails-style-guide
4537 | [pickaxe]: https://pragprog.com/book/ruby4/programming-ruby-1-9-2-0
4538 | [trpl]: http://www.amazon.com/Ruby-Programming-Language-David-Flanagan/dp/0596516177
4539 | [Pandoc]: http://pandoc.org/
4540 | [RuboCop]: https://github.com/rubocop-hq/rubocop
4541 | [yard]: https://yardoc.org/
4542 |
--------------------------------------------------------------------------------