ARMERIA

Rubyと競技プログラミングの話 AtCoderやCodeforcesの問題解説記事が多め。

Rubocopを走らせたら664行のコードで315個のoffenseが出た

昨日の時点でのRubyでポンのコードをかけてみたら、

1 file inspected, 315 offenses detected
Created .rubocop_todo.yml.
Run `rubocop --config .rubocop_todo.yml`, or
add inherit_from: .rubocop_todo.yml in a .rubocop.yml file.

ひどい。

警告数ランキング

吐き出された.rubocop_todo.ymlを見て、多いやつから順に見ていく。

1位:77個

# Offense count: 77
# Cop supports --auto-correct.
Style/TrailingWhitespace:
  Enabled: false

ぶっちぎりで大量に警告されてるのが、行末のスペース。要は何かというと、インデント中の空行のスペース。

行を足すときはあったほうが何かと便利だし、わざと残してる人もけっこういるみたいで、悩みどころ。エディタでの保存時に行末スペース全部取ってくれる機能があったので、それを使うことにした。

空行のインデントは活かす前提で、空でない行の末尾スペースを警告してくれる設定があればいいのにな、とは思います。

2位:33個

# Offense count: 33
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
Style/BlockDelimiters:
  Enabled: false

{}do endをちゃんと使い分けろって話。今のエディタだとeachの後にスペースを入れた時点で{|| }まで補完してくれるので、全部{}になってた。

ぶっちゃけどっちでも良いような気もしていたが、「if や while が end で終わるので、それとそろえたほうがよい」というのを見て確かにそうだと思ったので、行をまたぐ場合はdo endに直すことにする。ついでにエディタも乗り換えてやろうか。

3位:24個

# Offense count: 24
# Cop supports --auto-correct.
# Configuration parameters: MultiSpaceAllowedForOperators.
Style/SpaceAroundOperators:
  Enabled: false

演算子前後のスペース不足ね。はい、心当たりあります。

panels[x+1][y-1]
# panels[x + 1][y - 1] って書けって言われてる

こういう奴。個人的には前者のほうが見やすいんだけど…ちょっと保留。

4位:23個

# Offense count: 23
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles.
Style/SpaceInsideHashLiteralBraces:
  Enabled: false

ハッシュの{の後とか}の前にスペースが要るか、とかそういう話。両方試したけど特にどっちでも良いかなと思ったので、デフォルト設定に従ってみる。

少し特殊ケースですが、

input_hash = { :up          => Input.key_push?(K_UP),
               :down        => Input.key_push?(K_DOWN),
               :right       => Input.key_push?(K_RIGHT),
               :left        => Input.key_push?(K_LEFT),
               :exchange    => Input.key_push?(K_SPACE),
               :force_slide => Input.key_down?(K_Z)      }

みたいな時の閉じカッコってどこに置くのがスマートなんでしょね。何となくの感覚で、最長の行の末尾+スペース1個の位置に置いてるけど。

5位:22個

# Offense count: 22
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles, UseHashRocketsWithSymbolValues.
Style/HashSyntax:
  EnforcedStyle: hash_rockets

=>これ。すいません、これは使わせてください。好きなんです。

理由は単純で、リテラル記述と値の取り出しでキーの見た目が同じになるから、です。

hash = { :first => 1, :second => 2 }
puts hash[:first] # 見た目が同じ

hash = { first: 1, second: 2 }
puts hash[:first] # 見た目が変わる

まとめ

315個はさすがにビビりましたが、種類自体はそんなに多くないので…一通り意味を調べて、「これは譲れねえ!」ってやつだけ見逃してもらって、自動修正(auto_correct)してもらおうと思います。

本当に怖いのは、登場回数が少なくてかつauto_correctできないやつだったりしますよね(クラスが長いとか…)