不要メソッドを消す前にやっている 8 つのこと

こんにちは。@makicamel です。この記事は Ruby AdventCalendar 2024 11 日目の記事です。
といいつつ書いているのは 12 月 21 日です。
@yhara さんのお気持ちに触発されて遅ればせながら書きました。

コードリーディングをしている時、使われていなさそうなメソッドに遭遇することがあります。
わたしは不要なメソッドを削除するのが大好きです。
とはいえそのメソッドが本当に「不要」かどうかは注意深く判断する必要があります。

ここではお仕事のコードで自分が詳しくないあたりで不要そうなメソッドに遭遇した時、「消してよい」と判断するためにやっていることをいくつか書いてみます。
毎回全部実施しているわけではなく、状況に応じていくつかを組み合わせて判断しています。

1. エディタで検索する

とりあえずエディタで検索をかけます。メソッド名で検索をかけてヒットしなければ使われていない可能性が高まります。
ただ、メタプログラミングで動的にメソッド呼び出しがされているかもしれませんし、ふつうのメソッドに見えてライブラリのメソッドをオーバーライドしていてライブラリから呼び出されているかもしれません。

手軽なのでまず実施しますが、エディタ検索だけで判断することはありません。

2. カバレッジを確認する

Coverband という gem があります。

github.com

コードのカバレッジ計測をする gem で、GUIカバレッジを確認できます。本番環境に導入すると、本番環境のコードカバレッジをとることができます。本番環境で一定期間呼ばれていないことが確認できれば使われていないと判断する強い根拠になります。

ただ、ファイルのハッシュ値をキーとしてカバレッジ計測をしているので、対象とするファイルが変更されるとカバレッジもクリアされ1、十分な観察期間を取りにくいことがあります。その場合、次の「ログ出力する」方法を採用することもあります。

3. ログ出力する

ログを仕込んで一定期間そのログが出力されないことを本番環境で確認します。Coverband 導入前はこの方法をよく採用していました。

ログを仕込む → デプロイ → しばらく観察 → 削除と手数が多いのが難点ではあります。

4. リクエストログを見る

Rails アプリのアクションメソッドが使われていないと疑われることもあります。
リクエストログを見ると実際にそのアクションが呼ばれているのかいないのかが確認できます。呼ばれてはいるものの、著しく頻度が低かったりエラーを返すのみだったりして、機能していないことが疑われる場合もあります。

ただ、ユーザー提供時期がまだ先だったり、一時的にユーザー提供を止めていたりすることも考えられます。あるいは古いバージョンのネイティブアプリ用 API などで、呼び出し頻度は低いものの活用されていることも考えられます。もう少し根拠を補強したいところです。

5. コミットログなどを読む

コミットログや PullRequest の説明文、Issue などを読んで経緯を追います。
経緯とは「このコミットで導入された」「このコミットで使われなくなった」というコミットとその変更が行われた背景です。
使われていないメソッドは「使うつもりでとりあえず書いたけれど使わなかった」「以前は使っており、機能廃止や設計変更のため使わなくなったけれど削除するのを忘れた」のどちらかの経緯で発生していることが多いです。一方、一時的に使われていない状態であるだけで、n ヶ月後に利用される予定であることもあります。

なぜ「不要」なのかの根拠が明確になっていると安心してコードを削除することができます。

6. Slack で検索する

コミットログや PullRequest・Issue などに背景や経緯が記されていないことも往々にしてあります。
その場合は以下のような項目で Slack から情報を探します。

  • PullRequest の url
  • 関連しそうなキーワード
  • 関連しそうなチャンネル
  • コミットの日付周辺の関係者の発言・関係者宛の発言

Slack だけでなく各種ドキュメントシステムでも同様に検索をかけます。

7. 人に聞く

リモートワーク全盛の時期であれば Slack などに情報が残っていることも多いですが、オフラインワークの時代の情報は見つけられないことも多いです。
関係者や考古学に詳しい人に聞くこともあります。人間なので覚えていないことも多いですが、当時の情勢や考察を聞くことができて単純に楽しかったりもします。

8. GitHub で検索する

リポジトリでなくオーガニゼーションを対象にして GitHub で検索をします。
わたしは GitHub 検索にあまり習熟していないので精度が低いのですが、リポジトリを跨いでメソッド名や何かしらの経緯にたどり着けることがあります。

前半は呼び出しが行われていない事実、後半は呼び出しが行われていない理由の確認方法をあげました。こんな感じで、事実と理由をあわせて「不要」メソッドであると判断しています。


  1. 正確には新しいハッシュ値をキーとしてカバレッジ計測が開始されるだけなので、元のハッシュ値をキーとしてカバレッジ参照することはできそうです