Upgrade to Pro — share decks privately, control downloads, hide ads and more …

omakaseしないための.rubocop.yml のつくりかた / How to Build...

Linkers Tech
October 28, 2024

omakaseしないための.rubocop.yml のつくりかた / How to Build Your .rubocop.yml to Avoid Omakase #kaigionrails

Kaigi on Rails 2024にて、Shu Oogawara(@expajp )が発表したスライドです。

https://kaigionrails.org/2024/
https://kaigionrails.org/2024/talks/expajp/

Linkers Tech

October 28, 2024
Tweet

More Decks by Linkers Tech

Other Decks in Technology

Transcript

  1. • Shu Oogawara(@expajp ) • Engineering Manager@リンカーズ • Engineering Manager

    Meetup コアスタッフ • 趣味 • 秘境駅めぐり • 深夜ラジオ • 筋トレ 2 自己紹介
  2. みなさん、RuboCop使ってますか? 3 画像引用:“rubocop/rubocop: A Ruby static code analyzer and formatter,

    based on the community Ruby style guide.”, https://github.com/rubocop/rubocop, 2024/10/06閲覧
  3. • 危険を避ける • 不具合を予防する • ベストプラクティスを強制する • コードベースの保守性を高める • 一貫性を保証する

    • 無用な議論を避ける 5 なぜコードにルールを設けるのか 画像引用:オライリー・ジャパン, ” Googleのソフトウェアエンジニアリング”, https://www.oreilly.co.jp/books/9784873119656/, 2024/10/06閲覧
  4. # bad open(something) open("| #{something}") open("| foo") URI.open(something) # good

    File.open(something) IO.popen(something) URI.parse(something).open # good (literal strings) open("foo.text") URI.open("http://example.com") • コマンドインジェクション 脆弱性を防ぐ • Kernel#open に変数などを 渡していたら検出する 6 目的別のCopの例 危険を避ける:Security/Open 引用:”Security :: RuboCop Docs”, https://docs.rubocop.org/rubocop/cops_security.html#securityopen, 2024/10/21閲覧
  5. • *(アスタリスク)が 乗算か配列展開か ひと目で分からない 書き方を検出する 7 目的別のCopの例 ベストプラクティスを強制:Lint/AmbiguousOperator # bad

    # (中略) do_something *some_array # good # (中略) do_something(*some_array) 引用:”Lint :: RuboCop Docs”, https://docs.rubocop.org/rubocop/cops_lint.html#lintambiguousoperator, 2024/10/21閲覧
  6. • {}(波括弧)内側の スペースの有無を検出 • ありなしどちらを正とするかは 設定次第 8 目的別のCopの例 一貫性を保証:Layout/SpaceInsideBlockBraces #

    bad some_array.each {puts e} # good some_array.each { puts e } 引用:”Layout :: RuboCop Docs”, https://docs.rubocop.org/rubocop/cops_layout.html#layoutspaceinsideblockbraces, 2024/10/21閲覧
  7. 10 しかし、既存のコードベースにRuboCopを導入するのは大変 大量の警告 コンフリクト地獄 サードパーティ プリセットいっぱいありすぎ 僕は気にしないんで 勝手にやってください 時間を使いたくない 好みの問題でしょ

    圧倒的物量 開発遅れるなら やめてもらえますか そんなことより ここの実装なんですけど これを無効に するなんて ありえない いくつに設定するのが 正しいんでしょうねえ 自転車置き場
  8. 11 しかし、既存のコードベースにRuboCopを導入するのは大変 大量の警告 コンフリクト地獄 サードパーティ プリセットいっぱいありすぎ 僕は気にしないんで 勝手にやってください 時間を使いたくない 好みの問題でしょ

    圧倒的物量 開発遅れるなら やめてもらえますか そんなことより ここの実装なんですけど これを無効に するなんて ありえない いくつに設定するのが 正しいんでしょうねえ 自転車置き場 設定が先延ばしにされがち
  9. 13 Issue 画像引用:” Add (a very basic!!) Rubocop by default

    · Issue #50456 · rails/rails · GitHub”, https://github.com/rails/rails/issues/50456, 2024/10/06閲覧
  10. • rubocop-rails-omakase • 7.2以降で `rails new` するとデフォルトで入るgem • 有効に設定されているCopはわずか46個 •

    参考:拡張なしRuboCopに含まれるCopは554個(RuboCop 1.67) • Layout: 27 / Style: 12 / Lint: 3 / Performance: 2 / Rails: 2 • 他のCopはすべて無効になっている 16 出発点としてのomakase ほぼ「一貫性を保証する」役割しか担っていない
  11. • 意見が割れやすい 52 ファシリテーションが難しい 表明の幅は広く・採決ルールは細かく 意見が割れたときの ルールを細かく設定 • 参加の足並みを揃えづらい •

    オプション・適用範囲の 選択肢が多すぎる 「気にしない」を表明可に デフォルトに寄せつつ 希望のオプションを表明可に
  12. • デフォルトをベースに.rubocop_todo.yml を減らしていく 56 基本戦略 引用:Koichi ITO, ” Beyond the

    RuboCop Defaults - Speaker Deck”, https://speakerdeck.com/koic/beyond-the-rubocop-defaults, p.36, 2024/10/24閲覧
  13. • Slackで投票を行う • 投票は / / / の4択 • :デフォルト設定で有効

    • :どちらでもよい • :無効 • :オプション変更して有効 60 手順③:意見を表明する