在大学的 SE 课程中,我们学习了 OOAD 和 DDD(使用 Java)并鼓励在我们的项目中使用它。不幸的是,许多由实体的可变性引起的挑战没有被讨论:
- 不适合多线程应用程序
- 它破坏了依赖 equals()、hashCode() 或 compareTo() 的数据结构 (*)
- 很难对实体的状态进行推理
这些问题使我很难使用 DDD,尽管我喜欢它背后的想法,并且许多库和框架(如 ORM、序列化库——基本上所有使用 Java Beans 的东西)都依赖于实体的可变性。结果是,我在做架构决策时充满了疑虑,而且无论我做什么,都对结果不满意。要么我得到一些弗兰肯斯坦的怪物应用程序,其中我有不可变的实体,但是有很多可变的胶水使它工作(生成器,可变 DAO/DTO),或者我有一个完全可变的应用程序,其中充满了 WTF(比如每次都对列表进行排序)我使用它而不是使用排序的数据结构,因为实体在添加到列表后可能已更改)。
你如何处理这些问题?怎么走?是否有不需要可变性的 DDD 替代品?
我个人更喜欢完全不可变,但这会使使用一些需要 Java Bean 的库变得非常困难甚至不可能。当然,我可以切换到函数式编程,但我不确定它是否可以很好地替代使用 DDD 的典型项目。
(*) 好吧,只有当你覆盖它们时。但是,如果你不这样做,那么使用集合又有什么意义呢?