大学の SE のクラスでは、OOAD と DDD (Java を使用) を教えられ、プロジェクトで使用するように勧められました。残念ながら、エンティティの可変性によって引き起こされる多くの課題については議論されていません。
- マルチスレッド アプリケーションには不向き
- equals()、hashCode()、またはcompareTo()に依存するデータ構造を破壊すること (*)
- エンティティの状態について推論するのが難しくなる
これらの問題により、私は DDD を使用するのが非常に難しくなりますが、DDD の背後にあるアイデアは好きであり、多くのライブラリとフレームワーク (ORM、シリアライゼーション ライブラリなど、基本的に Java Beans を使用するすべてのもの) はエンティティの可変性に依存しています。その結果、私はアーキテクチャに関する決定を行う際に疑いでいっぱいになり、何をしても結果に満足することができません。エンティティが不変であるが、それを機能させるための多くの可変接着剤 (ビルダー、可変 DAO/DTO) を持っているフランケンシュタインのモンスター アプリを取得するか、WTF でいっぱいの完全に可変アプリ (毎回リストを並べ替えるなど) を持っています。エンティティがリストに追加されてから変更された可能性があるため、並べ替えられたデータ構造を使用する代わりに使用します)。
これらの問題にどのように対処しますか?行く方法は何ですか?可変性を必要としない DDD の代替手段はありますか?
私は個人的には完全に不変にすることを好みますが、そうすると Java Beans を必要とする一部のライブラリを使用することが非常に難しくなり、不可能になることさえあります。もちろん、関数型プログラミングに切り替えることもできますが、それが DDD が使用される典型的なプロジェクトの適切な代替になるかどうかはわかりません。
(*) まあ、それらをオーバーライドする場合のみ。しかし、セットを使用しない場合、セットを使用する意味はどこにありますか?