1. 概要(Overview)
Remove Setting Method は、
不変にすべきフィールドに対して存在している「セッターメソッド(setter)」を削除し、
コンストラクタなどで初期化のみ可能にするリファクタリングです。
セッターがあると、オブジェクト生成後にいつでも値を変えられてしまい、
クラスの一貫性や不変性を壊す可能性があります。
目的:
- クラスの不変性を守る
- 値が勝手に書き換えられるのを防止
- API の利用を明確にし、安全にする
2. 適用シーン(When to Use)
- クラスに セッターメソッドがあるが、実際には後から変更する必要がない
- 値が変わると矛盾やバグを生む可能性がある(例:ID、開始日など)
- コンストラクタ初期化で十分な場合
よくある匂い:
- Mutable Data(不必要な可変データ)
- Data Class の乱用(全フィールドに getter/setter があるだけ)
3. 手順(Mechanics / Steps)
- セッターが存在するフィールドを特定
- そのフィールドが本当に変更される必要があるかを確認
- 不変にできる場合はセッターを削除し、コンストラクタやファクトリーメソッドでのみ初期化可能にする
- 呼び出し側でセッターを使っている箇所を修正
- テストを実行して一貫性を確認
4. Kotlin 例(Before → After)
Before:セッターで後から変更可能
class User {
var id: Int = 0
set(value) {
field = value
}
}
fun main() {
val user = User()
user.id = 100 // 生成後にIDを変更できてしまう
println(user.id)
}
After:セッターを削除して不変化
class User(val id: Int) // コンストラクタでのみ設定可能
fun main() {
val user = User(100)
println(user.id) // 生成時に決めるのみ
}
-
idは生成時にしか設定できず、不変で安全
発展:ファクトリーメソッドを使う場合
class User private constructor(val id: Int) {
companion object {
fun createWithId(id: Int): User = User(id)
}
}
val user = User.createWithId(100)
- セッターを廃止しつつ、柔軟な生成方法を提供
5. 効果(Benefits)
- クラスの不変性が守られる
- 呼び出し側の 意図しない変更を防ぐ
- コードの安全性・信頼性が向上
- API がシンプルで明確になる
6. 注意点(Pitfalls)
- 本当に「不変」でよいかを慎重に判断する必要がある
- DTO や設定クラスのように「後から値を注入する」のが自然な場合は不要
- セッター削除は既存コードに広い影響を与える可能性あり(互換性問題)
まとめ
- Remove Setting Method は「セッターを削除して、不変性を保つ」リファクタリング
- 判断基準:このフィールドはオブジェクト生成後に変わるべきか?
- 基本思想:一貫性のある不変オブジェクト設計を優先し、安全性を高める