1. 概要(Overview)
Split Temporary Variable は、一つの一時変数が 複数の異なる目的 で使われている場合に、それを分割して別々の変数にするリファクタリングです。
目的は以下の通りです:
- 変数の役割を明確にし、意図の混乱を防ぐ
- 変数の再代入による誤解・バグを防止する
- 可読性と保守性を高める
2. 適用シーン(When to Use)
- 一時変数が 2回以上代入されており、異なる意味を持っている
- 同じ変数名が 計算Aと計算Bの両方 に使われていて分かりにくい
- デバッグ中に「この変数は今どの値を持っているのか?」が追いづらい
- 変数名が曖昧 (
result,tmpなど) で役割が混ざっている
よくある匂い:
- Temporary Field(不要な一時変数)
- Obscure Intent(意図の不明確さ)
3. 手順(Mechanics / Steps)
- 一時変数の代入箇所を確認
- 異なる目的ごとに新しい変数名を導入
- すべての参照箇所を新しい変数に切り替え
- 元の変数を削除
- テストを実行して正しく動作することを確認
4. Kotlin 例(Before → After)
Before:一時変数が複数の役割を持っている
fun calculateValues(a: Int, b: Int) {
var temp = a * b
println("Area: $temp")
temp = 2 * (a + b)
println("Perimeter: $temp")
}
-
tempが「面積」と「周囲長」の2つの意味で使われている - 読み手は「今の
tempはどっち?」と混乱する
After:変数を分割
fun calculateValues(a: Int, b: Int) {
val area = a * b
println("Area: $area")
val perimeter = 2 * (a + b)
println("Perimeter: $perimeter")
}
→ 役割が明確になり、意図がすぐに理解できる。
5. 効果(Benefits)
- 変数の役割が明確化され、混乱が減る
- バグのリスク低下(再代入による誤解がなくなる)
- コードが読みやすく、メンテナンスしやすくなる
- 変数名が「ドメインの意味」を表現できる
6. 注意点(Pitfalls)
- 冗長すぎる変数導入は逆効果(不要に変数が増える)
- パフォーマンスを気にして変数を減らすケースもあるが、可読性優先 が基本
- 不要な一時変数は Inline Temp で削除した方が良い場合もある
まとめ
- Split Temporary Variable は「1つの変数に複数の責務を持たせない」リファクタリング
- 判断基準:この変数は常に同じ意味を持っているか?
- 基本思想:変数は一貫した役割だけを担い、明確に分ける