1. 概要(Overview)
Hide Method は、外部に公開する必要のないメソッドを 非公開(private / internal) にして、
クラスの API をシンプルに保つリファクタリングです。
クラスの内部処理に使うメソッドを公開したままにすると:
- 利用者にとって 混乱の原因 になる
- 意図しない使われ方で バグの温床 になる
- 公開 API が肥大化して 保守が困難 になる
目的:
- クラスの公開インターフェースを最小限にする
- 実装の自由度を上げる(内部メソッドなら自由に変更できる)
- 利用者の誤用を防ぐ
2. 適用シーン(When to Use)
- 外部利用されないユーティリティメソッドが
publicになっている - クラス利用者が混乱するような内部処理メソッドが公開されている
- テストのために一時的に公開しているが、本来は内部実装に留めるべきメソッド
よくある匂い:
- Inappropriate Intimacy(不適切な親密さ)
- Speculative Generality(過剰な一般化)
- Middle Man(不要な仲介メソッド)
3. 手順(Mechanics / Steps)
- 公開されているメソッドの中で「外部から呼ばれるべきでないもの」を特定
- 可視性修飾子を
private(または Kotlin の場合internal)に変更 - 公開 API を最小化し、利用者が見るべきメソッドだけを残す
- 影響範囲をテストで確認
4. Kotlin 例(Before → After)
Before:内部実装まで public
class OrderProcessor {
fun process(orderId: Int) {
val validated = validate(orderId)
println("Processing order $orderId : $validated")
}
fun validate(orderId: Int): Boolean { // 本来は外部に見せる必要なし
return orderId > 0
}
}
fun main() {
val processor = OrderProcessor()
processor.validate(-1) // 呼び出せてしまう(誤用の可能性)
}
After:内部メソッドを隠蔽
class OrderProcessor {
fun process(orderId: Int) {
val validated = validate(orderId)
println("Processing order $orderId : $validated")
}
private fun validate(orderId: Int): Boolean { // 内部専用にする
return orderId > 0
}
}
fun main() {
val processor = OrderProcessor()
processor.process(123) // 公開 API のみ利用可能
}
5. 効果(Benefits)
- 公開 API が整理されてシンプルになる
- クラスの利用者が 本当に使うべきメソッドだけにアクセスできる
- 内部実装を自由に変更できる(公開していると後方互換性に縛られる)
- バグの混入を防ぐ(外部から勝手に呼ばれない)
6. 注意点(Pitfalls)
- 過度に隠蔽すると テストのしにくさ に繋がる(→ その場合は「テスト対象を再設計」すべき)
- ライブラリやフレームワークで API 提供する場合、どこまでを「契約」とするか慎重に判断
- Kotlin の
internalは「モジュール単位公開」なので、プロジェクト構成に注意
まとめ
- Hide Method は「外部から利用されるべきでないメソッドを非公開にする」リファクタリング
- 判断基準:利用者がこのメソッドを呼ぶ必要があるか?
- 基本思想:公開 API は最小限にし、内部実装は自由に隠す