リファクタリング 1 日分を、PR 5 個に分割した記録

巨大 PR の引力

リファクタリングの誘惑は「1 つの PR で全部直したい」という気持ちから始まる。コードを触り始めると関連箇所が芋づる式に出てきて、気付いたら 50 ファイル / 800 行差分の PR ができている。

これは本人にしかレビューできない。マージするのも怖い。Pull Request の体をなさない。

ある土曜日に丸 1 日かけて行ったリファクタリングを、5 個の PR に分割した記録 を書いておく。

元のコード

題材は AetherEchoes のサーバーサイド。Posts::SearchService という Service クラスが 200 行に肥大化していて、以下の責務を全部抱えていた:
query string の parse
カテゴリフィルタ
タグフィルタ
全文検索（MySQL FULLTEXT）
関連記事のスコアリング
ソート（newest / popular / read_time）
ページネーション

土曜日午前中に「これを綺麗に分けよう」と決めた。最初の作業は PR 5 個に分割する設計。

PR 設計

最終形（コード）から逆算して、5 つの PR に分けた:

| # | タイトル | 変更ファイル | 行数 |
|---|---|---|---|
| 1 | refactor: extract Posts::QueryParser | 2 | +60 / -20 |
| 2 | refactor: extract Posts::FilterApplier | 3 | +85 / -45 |
| 3 | refactor: extract Posts::SortApplier | 2 | +40 / -30 |…