Rubocop がチェックしてくれるもの一覧表 (Style編)

基本的に [Rubocop - Rubydoc](http://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style) を元に書いてます。
一部、RubyStyleGuideからの引用や、自分で書いたサンプルもあります。

=> [GitHub](https://github.com/bbatsov/rubocop)

* 未完成のため、追記要望があれば編集リクエストをお送りください。

### AccessModifierIndentation

private / protected / public は def と同じ列に書こう。

```
# bad
class SomeClass
private
  
  def private_method
    # ...
  end
end

# good
class SomeClass
  private
  
  def private_method
    # ...
  end
end
```


### AccessorMethodName

セッタは attribute= というメソッド名にしよう。
ゲッタは attribute というメソッド名にしよう。

先頭に set_ / get_ は不要だ。

```rb
# bad
def set_attribute(value) ...

# good
def attribute=(value)

# bad
def get_attribute ...

# good
def attribute ...
```

（※単純なセッタ/ゲッタの場合は attr_accessor/attr_reader/attr_writer を使おう）

### Alias
### AlignArray
### AlignHash
### AlignParameters



### AndOr

and は && に置き換えよう。
or は || に置き換えよう。

and / or は使う価値が無い。

[RubyStyleGuide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#no-and-or-or)



###ArrayJoin

Array#join をする時に * を使わないようにしよう。謎めいた書き方だ。
明確に join を書こう。

```rb
# 悪い例
%w(one two three) * ', '
# => 'one, two, three'

# 良い例
%w(one two three).join(', ')
# => 'one, two, three'

```
(Ruby Style Guide より)


### AsciiComments

### AssignmentInCondition

if の中で代入するのはやめよう。（ == の書き間違えに見える ）

```rb
# bad
if x = 1 
end
```

### AsciiIdentifiers

###Attr

attr は ruby のバージョンによって挙動が違う。
Ruby 1.8 以前では、引数によってゲッタ/セッタのどちらを定義するかが変わってしまう。分かりにくい。

かわりに attr_read / attr_writer / attr_accessor を使おう。

```rb
# 例
attr_accessor :getter_with_setter
attr_reader :getter1, :getter2, :getter3
attr_writer :setter1, :setter2, :setter3
```

[RubyStyleGuide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#attr)より



### BeginBlock


### BlockComments

ブロックコメントを使うのはやめよう。

エディタにもよるが、簡単にコメントだと見分けがつかない。
あとは、=begin =end の前に空白を置くことも出来ない。

```rb
# 悪い例
== begin
comment line
another comment line
== end

# 良い例
# comment line
# another comment line
```
[RubyStyleGuide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#no-block-comments)



### BlockNesting
### Blocks
### BracesAroundHashParameters
### CaseEquality

### CaseIndentation

case 文で、when のインデントが不整列なら見つけてくれる。
(case / when / end はすべて同じ列に書くこと )

```rb
# bad
case
  when song.name == 'Misty'
    puts 'Not again!'
  when song.duration > 120
    puts 'Too long!'
  when Time.now.hour > 21
    puts "It's too late"
  else
    song.play
end

# good
case
when song.name == 'Misty'
  puts 'Not again!'
when song.duration > 120
  puts 'Too long!'
when Time.now.hour > 21
  puts "It's too late"
else
  song.play
end
```

### CharacterLiteral
### ClassAndModuleCamelCase
### ClassAndModuleChildren
### ClassLength
### ClassMethods
### ClassVars
### CollectionMethods
### ColonMethodCall

### CommentAnnotation

アノテーションコメントは正しい形式で書こう。

```rb
# bad
#FIXME Comment

# good
# FIXME: Comment
```

### ConstantName
### CyclomaticComplexity
### DefWithParentheses
### DeprecatedHashMethods
### Documentation
### DotPosition
### DoubleNegation
### EmptyLineBetweenDefs
### EmptyLines
### EmptyLinesAroundAccessModifier
### EmptyLinesAroundBody

###EmptyLiteral

空のリテラルを定義するとき。

Array.new のかわりに [] を使おう。
Hash.new のかわりに {} を使おう。
String.new のかわりに '' を使おう。

```rb
some_array = []
some_hash = {}
some_string = ''
```



### Encoding
### EndBlock

### EndOfLine

コード内にCRの改行コード ( \r ) があれば見つけてくれる。

###EvenOdd

<<<<<<< HEAD
偶数の判定には even? を。
奇数の判定には odd? を使おう。
=======
偶数の判定には `even?` を。
奇数の判定には `odd?` を使おう。
>>>>>>> EDIT_REQUEST

```rb
# bad
if x % 2 == 0

# good
if x.even?
```

### FileName
### FinalNewline
### FlipFlop
### For
### FormatString

### GlobalVars

ユーザー定義のグローバル変数は使わないようにしよう。
（デフォルトのもの以外は使わない）

```rb
# bad
$ORIGINAL_PATH = '/path/to/user'
puts $ORIGINAL_PATH

# good
puts $LOAD_PATH
```

### GuardClause

### HashSyntax

新しいハッシュ記法でシンボルを書こう。

```rb
# bad
hash = { :kind => 'Apple' }

# good
hash = { kind: 'Apple' }

```

### IfUnlessModifier
### IfWithSemicolon
### IndentArray
### IndentHash

###IndentationConsistency

インデントには矛盾がないように。

```rb
def test
  puts 'hello'
-   puts 'world'
+  puts 'world'
end
```

### IndentationWidth

インデントにはスペース二個を使うこと。

```rb
# bad
def test
 puts 'hello'
end

# good
def test
  puts 'hello'
end
```

### Lambda
### LambdaCall

### LeadingCommentSpace

コメントの `#` の後にはスペースを置こう。
ただし、Rdoc用の記述では スペースを詰めて書いても良い。

### MultilineIfThen

条件文を複数行で書くときに then は不要だ。

```rb
# bad
if cond then
end

# good
if cond
end

# good
if cond then a
elsif cond then b
end
```

### SpaceBeforeBlockBraces

ブレースの前にはスペースを置こう。

```rb
- expect{ subject } 
+ expect { subject } 
```

### MultilineTernaryOperator

三項演算子を複数行で書かないようにしよう。
その場合は if か unless を使おう。

```rb
# bad
true ?
yes :
no

# good
true ? yes : no

# good
if true
  yes
else
  no
end
```

###LineEndConcatenation

行末で文字連結をするときは \ を使おう。

```rb
# bad
some_str = 'ala' +
           'bala'

some_str = 'ala' <<
           'bala'

# good
some_str = 'ala' \
           'bala'
```


### LineLength
### MethodCallParentheses
### MethodCalledOnDoEndBlock

### MethodDefParentheses

メソッドを定義するとき。
メソッドが何のパラメータも受け取らない時は、カッコを省略しよう。

```rb
# bad
def some_method()
 # body omitted
end

# good
def some_method
 # body omitted
end

# bad
def some_method_with_parameters param1, param2
 # body omitted
end

# good
def some_method_with_parameters(param1, param2)
 # body omitted
end
```

### MethodLength

### MethodName

メソッド名は snake_case にしよう。

```rb
# bad
def ExampleMethod
end

# good
def example_method
end
```

設定によっては camelCase に揃えることも出来る。

### ModuleFunction
### MultilineBlockChain
### MultilineIfThen
### MultilineTernaryOperator
### NegatedIf
### NegatedWhile
### NestedTernaryOperator
### NilComparison

### NonNilCheck

「nilでないこと」を冗長に判定していないか。

```rb

# bad
if x != nil
if !x.nil?

# good
if x
```

ただし最後の節として記述するならOK。

```rb
# good
def signed_in?
  !current_user.nil?
end
```

### Not
### NumericLiterals
### OneLineConditional
### OpMethod
### ParameterLists

### ParenthesesAroundCondition

条件文のカッコを省略できる場合はしよう。

```rb

# bad
if (a && b)
end

# good
if a && b
end

# good

if (a && b) || c
end
```

### PercentLiteralDelimiters
### PerlBackrefs

### PredicateName

メソッド名の最初に has / have / is などの前置詞は不要だ。

```rb
# bad
def is_even?(value) ...

# good
def even?(value)

# bad
def has_value? ...

# good
def value? ...
```

### Proc
### RaiseArgs

### RedundantBegin

>例外処理がメソッド定義全体に対して行われる場合には begin と end を省略できる ([参照](http://blog.livedoor.jp/sasata299/archives/51338814.html))

省略しよう。

```rb
def redundant
  begin
    ala
    bala
  rescue StandardError => e
    something
  end
end

def preferred
  ala
  bala
rescue StandardError => e
  something
end
```

### RedundantException (中途半端な例外)

RuntimeError を起こす場合は、クラス名は省略できる。
( raise / fail のデフォルトが RuntimeError なので )

```rb
# bad
raise RuntimeError, 'message'

# good - signals a RuntimeError by default
raise 'message'
```

RedundantException

### RedundantReturn

冗長な return はやめよう。

```rb
# maybe bad
def test
  return something
end

# maybe good
def test
  something
end

```

### RescueEnsureAlignment

begin/rescue/end はすべて同じ列に書こう。

```rb
# bad
begin
  something
  rescue
  puts 'error'
end

# good
begin
  something
rescue
  puts 'error'
end
```

### RedundantSelf

### RegexpLiteral

詳しくは [RuboCop | Style/RegexpLiteral - Qiita](http://qiita.com/tbpgr/items/8b54723cc5ee77f6cbf2) を参照。

設定によって、判定の動作が変わる。
オプションは slashes (デフォルト) / percent_r / mixed の三種類。

```yaml:.rubocop.yml
#例：

Style/RegexpLiteral:
  EnforcedStyle: percent_r
```


```rb
# EnforcedStyle の設定が slashes / mixed の場合は良い。 percent_r の場合は悪い。
snake_case = /^[\dA-Z_]+$/

# EnforcedStyle の設定が percent_r の場合は良い。 slashes / mixed の場合は悪い。
snake_case = %r{^[\dA-Z_]+$}

# EnforcedStyle の設定が slashes の場合は良い。 percent_r / mixed の場合は悪い。
regex = /
  foo
  (bar)
  (baz)
/x

# EnforcedStyle の設定が percent_r / mixed の場合は良い。 slashes の場合は悪い。
regex = %r{
  foo
  (bar)
  (baz)
}x

# スラッシュ記法の中でスラッシュを使わないこと。
# AllowInnerSlashes の設定を true にしていれば警告しない。
x =~ /home\//
```



### RescueModifier

### SelfAssignment

変数が自分自身を扱う場合は、簡潔な書き方をしよう。

```rb
# bad
x = x + 1

# good
x += 1
```

### Semicolon
### SignalException
### SingleLineBlockParams

### SingleLineMethods

メソッドを1行で定義しないこと。

```rb
# bad
def method; nil; end

# good
def method
  nil
end
```

ただしオプションで、メソッドのボディがない場合に限り許容させることも出来る。

### SingleSpaceBeforeFirstArg

### SpaceAfterColon

いくつかの場合、セミコロンの後にスペースを置こう。

```rb
# bad
x = 1;y = 2

# good
x = 1; y = 2
```

### SpaceAroundBlockParameters

ブロックパラメータの外側には空白を置こう。
逆に内側には置かないようにしよう。

```rb
# bad
hash.map! {|k, v|v }

# bad
hash.map { | k, v | v }

# good
hash.map { |k, v| v }
```

### SpaceAfterComma

(いくつかの種類の)カンマの後にはスペースを置こう。

```rb
#bad
['Apple','Banana','Strawberry']

#good
['Apple', 'Banana', 'Strawberry']
```

### SpaceAfterControlKeyword

1行で書く場合。
if/unless などの後にはスペースを置こう。

```rb
# bad
if(a && b) || c then result end

# good_
if (a && b) || c then result end
```

### SpaceAfterMethodName

メソッドを定義するとき。
メソッド名とカッコの間は、スペースを置かずに詰めよう。

```rb
# bad
def func (x)
end

# good
def func(x)
end
```

### SpaceAfterNot ( ! の後の空白 )

! の後にスペースを置かないようにしよう。

```rb
# bad
! something

# good
!something
```

### SpaceAfterSemicolon

1行に複数式を書く場合。
セミコロンの後にはスペースを置こう。

```rb
# bad
x = 1;y = 2;

# good
x = 1; y = 2;
```

### SpaceAroundEqualsInParameterDefault

引数の初期値を決めるとき。イコールの周りには空白を置こう。

```rb
# bad
def example(value='')
end

# good
def example(value = '')
end
```

### SpaceAroundOperators ( 演算子の周りの空白 )

演算子の周りには空白を1個置こう。

```rb
# bad
x=1+1

# bad
x  =  1  +  1

# good
x = 1 + 1
```

ただし ** (乗の計算) ではスペースを置くべきではない。

```rb
# bad
x = 2 ** 3

# good
x = 2**3
```

### SpaceBeforeBlockBraces

ブロックの波括弧の前にはスペースを置こう。

```rb
# bad
(1..10).each{ |i| i }

# good
(1..10).each { |i| i }
```

### SpaceBeforeComment

行末コメントの前にはスペースを置こう。

```rb
# bad
method# Comment

# good
method # Comment
```

### SpaceBeforeModifierKeyword

後方の if/unless などの前にはスペースを置こう。

```rb
# bad
result if(a && b) || c

# good
result if (a && b) || c
```


### SpaceInsideBlockBraces

ブロックの波括弧の内側にはスペースを置こう。

```rb
# bad
(1..10).each {|i| i}

# good
(1..10).each { |i| i }
```

### SpaceInsideBrackets

### SpaceInsideHashLiteralBraces

ハッシュ記法で、波括弧の内側にはスペースを置こう。

```rb
# bad
furuits = {apple: 10, banana: 20}

# good
furuits = { apple: 10, banana: 20 }
```

### SpaceInsideParens

カッコの内側にはスペースを置かないようにしよう。

```rb
# bad
some( arg ).other
[ 1, 2, 3 ].size

# good
some(arg).other
[1, 2, 3].size
```

### SpaceInsideRangeLiteral

範囲リテラルの内側にスペースは不要だ。

```rb
# bad
1 .. 3

# good
1..3

# bad
'a' .. 'z'

# good
'a'..'z'
```

### SpecialGlobalVars

スーパーグローバル変数を Perl スタイルで書かないようにしよう。
かわりに、意味が明確な方のスタイルで書こう。

対照表:

```rb
$: => $LOAD_PATH
$" => $LOADED_FEATURES
$0 => $PROGRAM_NAME
$! => $ERROR_INFO
$@ => $ERROR_POSITION
$; => $FIELD_SEPARATOR / $FS
$, => $OUTPUT_FIELD_SEPARATOR / $OFS
$/ => $INPUT_RECORD_SEPARATOR / $RS
$\\ => $OUTPUT_RECORD_SEPARATOR / $ORS
$. => $INPUT_LINE_NUMBER / $NR
$_ => $LAST_READ_LINE
$> => $DEFAULT_OUTPUT
$< => $DEFAULT_INPUT
$$ => $PROCESS_ID / $PID
$? => $CHILD_STATUS
$~ => $LAST_MATCH_INFO
$= => $IGNORECASE
$* => $ARGV => / => ARGV
$& => $MATCH
$` => $PREMATCH
$\' => $POSTMATCH
$+ => $LAST_PAREN_MATCH

```



### StringLiterals


### SymbolArray

### SymbolLiteral

文字定義みたいなシンボルは書かないようにしよう。

```rb
# bad
:symbol"

# good
:symbol
```

### Tab

タブ ( \t ) を使わないようにしよう。

(*注…プログラミングの世界では、タブ揃えより、空白スペース揃えのほうが主流だ)

### SymbolProc

proc をシンボル記法に置き換えられる場合は、そうしよう。

```rb
# bad
something.map { |s| s.upcase }

# good
something.map(&:upcase)
```

### TrailingBlankLines

ファイル末には空行を入れないようにしよう。

### TrailingComma

### TrailingWhitespace

行末の空白を見つけてくれる。

### TrailingUnderscoreVariable

変数はアンダースコアで終わらせないようにしよう。

```rb
# maybe bad
x_ = 1
```

### TrivialAccessors

ありふれたセッタ/ゲッタメソッドは、 `attr_xxx` に置き換えよう。

```rb
# bad
class Foo
  def example=(value)
    @example = value
  end

  def example
    @example
  end
end

# good
class Foo
  attr_accessor :example
end
```

### UnlessElse
### VariableInterpolation

### VariableName

変数は snake_case で書こう。

```rb
# bad
someVar = 5

# good
some_var = 5
```

→[設定次第では camelCase に統一させることも出来る](http://qiita.com/tbpgr/items/0cc717be54a66ff3057d)

### WhenThen

when then の表現でセミコロンを使わないこと。then を使うこと。

```rb
# bad
when x; apple

# good
when x then apple
```

### WhileUntilDo

複数行の while/until に do が使われている部分を見つけてくれる。

```rb
# bad
while x > 5 do
  # body omitted
end

until x > 5 do
  # body omitted
end

# good
while x > 5
  # body omitted
end

until x > 5
  # body omitted
end
```

### WhileUntilModifier
### WordArray


## Metrics

### ParameterLists

メソッド定義では。引数の種類を増やし過ぎないようにしよう。

```rb
# bad 
class Example
  def some_method(argument1, argument2, argument3, argument4, argument5, argument6)
  end
end
```

設定によって警告の個数は変更できる。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->