1. 概要(Overview)
Add Parameter は、既存のメソッドに 新しい引数を追加 して、
呼び出し側から追加の情報を渡せるようにするリファクタリングです。
既存のメソッドが持っていない情報を処理に必要とするようになったとき、
内部で不自然にグローバル変数や外部依存を参照するよりも、
呼び出し側から明示的に値を渡せるようにする方が設計がシンプルになります。
目的は以下の通りです:
- メソッドの処理に必要な情報を外部から与える
- 隠れた依存を排除して、テストしやすくする
- 呼び出しの意図を明確にする
2. 適用シーン(When to Use)
- 既存のメソッドが 外部依存(グローバル変数、シングルトン、設定クラスなど) に頼っている
- メソッドが新しい振る舞いを担う必要が出てきた
- 呼び出し側が「状況ごとに処理を切り替えたい」が、今は内部で固定値を参照している
よくある匂い:
- Feature Envy(外部情報に強く依存)
- Inappropriate Intimacy(不適切な親密さ)
- Hidden Dependencies(隠れた依存)
3. 手順(Mechanics / Steps)
- メソッド内で新しい情報が必要になっている箇所を特定
- その情報を外部から渡せるように引数を追加
- 呼び出し側コードを修正して、新しい引数を渡す
- 既存のテストを修正し、新しいケースも追加する
4. Kotlin 例(Before → After)
Before:外部依存に頼っている
object Config {
var taxRate: Double = 0.1
}
class Order(private val amount: Double) {
fun calculateTotal(): Double {
return amount + (amount * Config.taxRate)
}
}
fun main() {
val order = Order(100.0)
println(order.calculateTotal()) // Config に依存
}
-
Order.calculateTotal()はConfigに依存しており、外部設定なしではテストできない
After:引数を追加して依存を明示化
class Order(private val amount: Double) {
fun calculateTotal(taxRate: Double): Double {
return amount + (amount * taxRate)
}
}
fun main() {
val order = Order(100.0)
println(order.calculateTotal(0.1)) // 税率を明示的に渡せる
}
-
calculateTotal()の引数にtaxRateを追加 - 呼び出し側が自由に制御でき、テストも容易になる
5. 効果(Benefits)
- 外部依存を排除でき、テストしやすい
- 呼び出しの意図が明確になり、拡張性が上がる
- メソッドが「より純粋な関数」に近づく
6. 注意点(Pitfalls)
- 引数を増やしすぎると Long Parameter List(長い引数リスト) の匂いになる
- 追加する引数が増える場合は Introduce Parameter Object を検討する
- 既存の呼び出し側をすべて修正する必要がある(影響範囲が広い可能性あり)
まとめ
- Add Parameter は「必要な情報を外部から渡せるようにメソッドを拡張する」リファクタリング
- 判断基準:内部で外部依存を持っていないか? 呼び出し側が制御すべき情報か?
- 基本思想:メソッドの入力を明示化して、隠れた依存をなくす