一个应用要解决的问题域可以被划分成相对独立的几个子域,投资在这些子域上的份额不应该是平等的。所以我们应该区分这些子域为不同的类别,以实施合适的投资策略。
有三种子域的类别。分别是核心、支撑和通用。
决定产品独特竞争力的子域就是核心子域。它是产品之所以被创建和存在的首要原因。有些子域的价值是一种也存在于其他产品和竞争者的产品中的通用功能,不具有个性化的诉求,这种子域就是通用子域。还有一种子域提供的功能不是通用的,但又是必须的,但又不是产品的核心竞争力,这就是支撑子域。
换句话说,产品独特的竞争力是核心,剩下的对核心域起支撑左右,其中因其通用性而可以外购的就是通用子域。通用子域应该被外购,核心子域应该被重点投资和看护,次要的投资放在支撑子域上。这些投资看护包括保持代码保持良好的设计,绑定代码与业务领域。建立领域清晰的边界,通过防腐层隔离领域间代码的依赖。
对于核心子域,在产品初期,还没有经市场验证之前,代码质量不需要那么完美。但是一旦产品被市场证明,就应该重构。
对于支撑子域,重用不是技术的方向,而可替换才是。
不是所有的应用都有核心子域,此时DDD的战略模式仍然很有价值,但是战术模式就未必了。