1. 概要(Overview)
Substitute Algorithm は、既存の処理アルゴリズムが 冗長・複雑・非効率 な場合に、よりシンプルで分かりやすいアルゴリズムに置き換えるリファクタリングです。
目的は以下の通りです:
- コードの意図をより明確にする
- 重複や無駄を取り除いて、処理を簡潔にする
- 保守性とパフォーマンスを改善する
2. 適用シーン(When to Use)
- 同じ結果を得るためのコードが冗長すぎる
- 複雑なループや条件分岐で「意図が隠れている」
- 標準ライブラリの関数や API を使えば 一行で表現できる
- パフォーマンスの悪いアルゴリズムをより効率的なものに置き換えたい
よくある匂い:
- Complex Conditional(複雑な条件式)
- Duplicate Code(重複コード)
- Obscure Intent(意図の不明確さ)
3. 手順(Mechanics / Steps)
- 既存のアルゴリズムを理解し、期待される出力を確認
- よりシンプル/効率的なアルゴリズムを検討
- 新しいアルゴリズムで置き換え
- 既存のテスト(または新規テスト)で正しく動作することを確認
4. Kotlin 例(Before → After)
Before:冗長なループ処理
fun foundPerson(people: List<String>): String? {
for (p in people) {
if (p == "Don") return "Don"
if (p == "John") return "John"
if (p == "Kent") return "Kent"
}
return null
}
- 複数の if 文でチェックしていて冗長
After①:標準関数を使って簡潔に
fun foundPerson(people: List<String>): String? {
val candidates = listOf("Don", "John", "Kent")
return people.firstOrNull { it in candidates }
}
→ 意図が一行で表現できる ため、読みやすさが向上。
After②:別のアルゴリズムに置き換え(例:線形探索 → HashSet)
fun foundPerson(people: List<String>): String? {
val candidates = setOf("Don", "John", "Kent")
return people.firstOrNull { it in candidates }
}
→ 大規模データに対しても効率的に動作。
5. 効果(Benefits)
- コードがシンプルで分かりやすくなる
- 標準ライブラリを活用することで 保守性と可読性が向上
- 効率的なアルゴリズムに置き換えれば パフォーマンス改善
- 意図が明確になり、レビューやテストが容易になる
6. 注意点(Pitfalls)
- 新しいアルゴリズムに置き換えるとき、境界条件や例外処理が変わらないよう注意
- パフォーマンス改善のために置き換える場合は、ベンチマークで効果を確認すること
- シンプル化のために読みやすさを重視する場合でも、過度にトリッキーな書き方は避けるべき
まとめ
- Substitute Algorithm は「複雑な処理をよりシンプルで効率的なアルゴリズムに置き換える」リファクタリング
- 判断基準:もっと簡単・明確に書ける方法はないか?
- 基本思想:複雑さを削ぎ落とし、意図を直接表現する