如何在Java或c#中强制DDD聚合

本文关键字:DDD 聚合 Java | 更新日期: 2023-09-27 18:11:17

Evans写道,聚合的概念是这样的,聚合的所有不是根的对象都不能被任何不是它的聚合根的其他对象引用。在Java或c#中是否有任何合理的方法来实现这一点?也就是说,如果我在代码库中引入聚合,我能否确保将来对DDD不太感兴趣的开发人员不会从聚合外部直接创建对子部件的引用?或者至少让他/她很难做到这一点?

如何在Java或c#中强制DDD聚合

我想不出任何一种方法,既不会过度限制实体的可用性,也不会增加比好处更大的复杂性。您应该记住,使用对非根实体的暂态(临时)引用是合法的,并且在某些情况下可能很有用,因此基于静态作用域的限制实际上不是一个选项。

当涉及到高级设计原则时,我倾向于依赖于团队文化和开发人员指导方针,而不是防御性编程,因为后者通常会以某种方式适得其反,并且您最终会得到丑陋的过于复杂的代码,从而允许您自己设置的严格障碍出现异常。"体系结构"框架在某种程度上属于同一类别——对于简单的应用程序来说是直接和高效的,但是当您开始添加异常情况时,它们很快就会成为负担而不是帮助。

为了确保聚合的内容不能从外部访问,您必须仅通过其根来组合它(添加内容)。为了避免存储已经引用的对象,您必须存储外部提供的内容的深层副本。换句话说,您必须只存储由根本身创建的对象。这同样适用于向外部世界返回聚合内容——根必须只返回存储对象的深层副本,从而保护它们不被引用。

既然我们讨论了引用,那么复制不可变对象是有意义的,这样就可以控制它们何时适合垃圾收集(Java)。