ゲッターとセッター
オブジェクト志向(以下OO)では、ゲッターやセッターの使用は勧められていません。
使用に際しては慎重さが求められます。
これは、tell, don't ask
という原則と関係しています。
オブジェクトに対して状態を問い合わせる (ask) のではなく、処理を指示する (tell) ように実装するのが、OOらしい設計なのです。
https://martinfowler.com/bliki/TellDontAsk.html
中でも、セッターの使用は特に避けたほうが良いと思われます。
オブジェクトのミューテーションはバグの温床です。
また、値がセットされているかの検査が乱発し、結果としてコードベースのメンテナンス性が低下します。
temporal coupling
一般的な日本語訳の存在を筆者は知らないのですが、「時系列依存」と訳せるかもしれません。
特定の順序で呼び出される必要のある処理がある場合、それを temporal coupling
と言います。
適切にカプセル化されていたなら、このようなことは起きないです。
この制約の存在は、得てしてベテランメンバーの頭の中だけに存在し、チームの暗黙知となります。
セッターの使用は temporal coupling
を生みます。
例を擬似コードで示します。
main() {
const user = new User()
user.setId(10) // repo.save(user) より前に必ず呼び出さないといけないので、これは termporal coupling
if (user.id) {
userRepo.save(user)
}
}
改善例
main() {
// セッターを使わずに、初期化時にセットされることが保証されている
const user = new User({id: 10})
userRepo.save(user)
}
まとめ
- ゲッターとセッターの濫用はダメ、絶対。
- 特定の順序で呼び出される必要がある処理について、アンチパターンとして
temporal coupling
という呼び名が付いている。