RuboCopの頻出Cop4選
こんにちは。
noteのエンジニア兼北条加蓮ちゃんのプロデューサーの@hiroki_tanakaです。毎日行っているnote連続投稿の記録が100日を突破して嬉しい限りです。
はじめに
私は日頃、noteのRailsリポジトリにおいてRuboCopのCopを潰しこむ対応を行っているのですが、その中で頻出するRuboCopのCop4選について書いていきます。
↓日々行っている対応に関してはこちらを参照ください。
Layout/EmptyLines
日々のRuboCop運用をしていると最も見かけるCopがこのLayout/EmptyLines で、Rubocop Challengerによる自動修正でもこのCopを始めとした空行追加や削除のCopがとても多いです。
Copの修正内容自体はとてもシンプルで、下記のようにメソッド間に不要な空行があった場合に反応します。
# bad
some_method
# empty_line
# empty_line
some_method
# good
some_method
# empty_line
some_method
RuboCopが導入されるまではコード内の空行は開発者1人1人の書き方に任されていたため、空行の入れ方は人によってバラバラでした。RuboCop導入後は一度一括で修正致しましたが、未だに新規追加や修正されたコードでこのLayout/EmptyLinesが反応することがあります。
反応してしまうことは全く悪くなく、空行の追加・削除は人が手動で修正するのではなく、自動で修正されるべき箇所なので見かけた場合は、bundle exec rubocop -a <ファイル名> コマンドでバッチリ直してください🙏
Layout/ElseAlignment
Layout/EmptyLinesを筆頭にした空行追加・削除のCopの次点で多いのがこのLayout/ElseAlignmentに代表されるインデント修正系の警告です。
こちらも修正内容自体はシンプルで下記のようにif~else~endのインデントがズレていた場合に反応します。(少しわかりにくいのですがelseやelsifがズレています。)
# bad_1
if something_condition
something_code
else
something_code
end
# bad_2
if something_condition
something_code
elsif something_condition
something_code
end
# good
if something_condition
something_code
else
something_code
end
インデントも空行同様にRuboCopが導入されるまでは開発者1人1人の書き方に依存していました。そのため、ファイルによってインデントがバラバラだったり、揃ってはいるがRuboCopの規約に沿っていないといったことがありました。こちらもRuboCop導入後は一度一括で修正致しましたが、未だに新規追加や修正されたコードでこのLayout/ElseAlignmentを筆頭にインデント系Copが反応することがあります。
やはり、インデントも人が手動で修正するのではなく、自動で修正されるべき箇所なので見かけた場合は、bundle exec rubocop -a <ファイル名> コマンドでサクッと直してしまってください🙇♂️
Style/HashEachMethods
空行系Cop・インデント系Copの次に多いのがこのStyle/HashEachMethodsに代表されるHashの取り扱いに関するCopです。
Style/HashEachMethodsの修正内容はeachを使用してHashのkeyやvalueに対して繰り返し処理を行っている箇所をeach_keyやeach_valueを使用するように修正するものです。
# bad
hash.keys.each { |k| p k }
hash.values.each { |v| p v }
# good
hash.each_key { |k| p k }
hash.each_value { |v| p v }
Hashに対してのCopは他にもあり、Hash#has_key?/Hash#has_value?をHash#key?/Hash#value?に置き換えるStyle/PreferredHashMethodsやCase-When文をHashに置き換えるHashLikeCaseがあります。HashはRuboCopの規約に則ることでコードの冗長性がなくなり、ロジックの可読性がシンプルになります。
Hashに関するCopの多くも自動で修正することが可能なので、こちらも見かけた場合はbundle exec rubocop -a <ファイル名> コマンドでズバッと直してしまってください💪
Rails/ActiveRecordAliases
こちらのCopは更新処理でupdate_attributes/!を使用している箇所をupdate/!に置き換える対応を行います。
#bad
User.find(1).update_attributes!(name: '高橋')
#good
User.find(1).update!(name: '高橋')
こちらは頻出するCopではなく、Copの名目上はupdate_attributesはupdateに比べて冗長なので修正するというものでした。ただ、update_attributesはRails6.0で非推奨になり、6.1から消去されるメソッドなので将来的にRailsアップデートを行うことを考慮すると必須の対応でした。
RuboCopはこのようにコーディング規約としての対応だけではなく、RubyやRailsの新しいバージョンで非推奨や消去される処理の置き換えを推奨することがあります。Copに関しては修正のbefore/afterだけを見るのではなく、気になったCopについては背景まで調べると良いかと思います🙋♀️(これが伝えたくて、このCopをPickUpしました。)
おわりに
今回はRuboCop警告対応で頻出する4つのCopを紹介致しました。
また別の機会があれば「RuboCopのPerformance関連のCop5選」や「RuboCopのSecurity関連のCop5選」といった記事も書きたいと思います!ヾ(`・ω・´)ノ
それではまた(o*。_。)oペコッ
この記事が気に入ったらサポートをしてみませんか?