LoginSignup
4
1

More than 3 years have passed since last update.

ゲッターとセッター、そして temporal coupling

Posted at

ゲッターとセッター

オブジェクト志向(以下OO)では、ゲッターやセッターの使用は勧められていません。
使用に際しては慎重さが求められます。

これは、tell, don't ask という原則と関係しています。
オブジェクトに対して状態を問い合わせる (ask) のではなく、処理を指示する (tell) ように実装するのが、OOらしい設計なのです。

:point_right: 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 という呼び名が付いている。
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1