1. 概要(Overview)
Replace Temp with Query は、式の結果を一時変数に保存する代わりに、その計算をメソッドとして抽出して直接問い合わせる ようにするリファクタリングです。
目的は以下の通りです:
- 一時変数を減らし、再利用可能なメソッドに置き換える
- 変数の寿命を短くして責務を明確化
- 他のメソッドからも同じロジックを呼び出せるようにして 重複を削減
2. 適用シーン(When to Use)
- 一時変数が 計算結果を一度だけ保持 している
- その式を 他のメソッドでも再利用したい
- 変数を参照するより、明確な名前のメソッドに切り出した方が分かりやすい
- テストの観点からも、式のロジックを独立させたい
よくある匂い:
- Long Method(長すぎるメソッド)
- Duplicate Code(重複コード)
3. 手順(Mechanics / Steps)
- 一時変数に代入されている式を特定
- その式を新しいメソッドに切り出す(Extract Method)
- 変数を削除し、代わりに新しいメソッド呼び出しを利用
- 他の場所でも再利用できるようにクラス設計を調整
- テストを実行して正しく動作することを確認
4. Kotlin 例(Before → After)
Before:一時変数を使っている
class Order(val items: List<Double>) {
fun printSummary() {
val total = items.sum()
println("Total: $total")
println("Tax: ${total * 0.1}")
println("Final: ${total * 1.1}")
}
}
-
totalが一時変数として使われているだけ - 他のメソッドでも合計計算を使いたくなる可能性が高い
After①:一時変数をメソッドに置き換える
class Order(val items: List<Double>) {
fun totalAmount(): Double = items.sum() // ✅ クエリメソッドに変換
fun printSummary() {
println("Total: ${totalAmount()}")
println("Tax: ${totalAmount() * 0.1}")
println("Final: ${totalAmount() * 1.1}")
}
}
→ total 変数が消え、totalAmount() という 意味のあるメソッド に置き換わった。
After②:他の処理でも再利用可能
class Order(val items: List<Double>) {
fun totalAmount(): Double = items.sum()
fun hasDiscount(): Boolean = totalAmount() > 10000
}
→ ロジックが再利用可能になり、テストも容易に。
5. 効果(Benefits)
- 一時変数を削除し、ロジックをメソッドに昇格
- 計算式を名前付きメソッドにすることで 意図が明確化
- 他の場所からも呼び出せる → 重複削減・再利用性向上
- テスト対象が独立し、単体テストがしやすくなる
6. 注意点(Pitfalls)
- 複雑な式を何度も呼び出すと パフォーマンスに影響する場合がある
- 対策:必要なら Caching(結果のキャッシュ) を導入
- クラス外に公開する必要がない場合は、private メソッド にとどめる
- 「名前を付けることに意味があるか」を常に意識すること
まとめ
- Replace Temp with Query は「一時変数を削除して、クエリメソッドに置き換える」リファクタリング
- 判断基準:この計算は他でも使えるか?名前を付ける価値があるか?
- 基本思想:一時的な値ではなく、明確なメソッドとして表現することで、再利用性・可読性を高める