如何在 java 或 c# 中执行 ddd 聚合?
how to enforce ddd aggregates in java or c#?
Evans 写道,聚合的概念是聚合中所有不是根的对象不得被不是聚合根的任何其他对象引用。
在 Java 或 C# 中是否有任何合理的方法来强制执行此操作。也就是说,如果我在代码库中引入一个聚合,我是否可以确保未来对 DDD 不那么感兴趣的开发人员不会从聚合外部直接创建对子部分的引用?或者至少让 him/her 很难做到这一点?
为确保无法从外部访问聚合的内容,您必须仅通过其根来编写(添加内容)。您必须存储从外部提供的内容的深层副本,以避免存储已引用的对象。换句话说,您必须只存储由根本身创建的对象。这同样适用于 returning 将内容聚合到外部世界 - 根必须只 return 存储对象的深层副本,从而保护它们不被引用。
既然我们讨论了引用,那么复制不可变对象也很有意义,从而控制它们何时有资格进行垃圾收集 (Java)。
希望对您有所帮助。
我想不出任何方法既不会过度限制您的实体的可用性,也不会增加超过收益的复杂性。您应该记住,对非根实体的瞬时(临时)引用是合法的,并且在某些情况下很有用,因此基于范围的静态限制并不是真正的选择。
当谈到高级设计原则时,我倾向于依赖团队文化和开发人员指南而不是防御性编程,因为后者通常会以某种方式适得其反,你最终会得到丑陋的过于复杂的代码来允许您为自己设置的严格障碍的例外情况。 "Architectural" 框架属于同一类别——对于简单的应用程序来说直接且高效,但是当您开始添加异常情况时,它们很快就会成为负担而不是帮助。
Evans 写道,聚合的概念是聚合中所有不是根的对象不得被不是聚合根的任何其他对象引用。 在 Java 或 C# 中是否有任何合理的方法来强制执行此操作。也就是说,如果我在代码库中引入一个聚合,我是否可以确保未来对 DDD 不那么感兴趣的开发人员不会从聚合外部直接创建对子部分的引用?或者至少让 him/her 很难做到这一点?
为确保无法从外部访问聚合的内容,您必须仅通过其根来编写(添加内容)。您必须存储从外部提供的内容的深层副本,以避免存储已引用的对象。换句话说,您必须只存储由根本身创建的对象。这同样适用于 returning 将内容聚合到外部世界 - 根必须只 return 存储对象的深层副本,从而保护它们不被引用。
既然我们讨论了引用,那么复制不可变对象也很有意义,从而控制它们何时有资格进行垃圾收集 (Java)。
希望对您有所帮助。
我想不出任何方法既不会过度限制您的实体的可用性,也不会增加超过收益的复杂性。您应该记住,对非根实体的瞬时(临时)引用是合法的,并且在某些情况下很有用,因此基于范围的静态限制并不是真正的选择。
当谈到高级设计原则时,我倾向于依赖团队文化和开发人员指南而不是防御性编程,因为后者通常会以某种方式适得其反,你最终会得到丑陋的过于复杂的代码来允许您为自己设置的严格障碍的例外情况。 "Architectural" 框架属于同一类别——对于简单的应用程序来说直接且高效,但是当您开始添加异常情况时,它们很快就会成为负担而不是帮助。