• 公共代码
    • DRY对比合适边界

    相同代码都可以复用在DDD中有时不适用。DRY的诱惑很大,但相同代码在不同限界上下文代表的意义可能不同。

    • 业务逻辑
      • 大多数情况下不可复用
      • 可提取至共享内核
    • 领域基类
      • 只能在团队内复用
    • 工具类
      • 团队内复用
      • 也可在不同团队间使用

    为了回答这个问题,我们需要定义几种代码类型,这些类型的代码都有被子项目使用的可能。第一种类型是业务逻辑代码,此类的代码绝对多数不可复用,除非它对所有限界上下文来讲意义是一致的。例如,目前有两个限界上下文——销售和支持,两者都包含产品实体。两者行为存在部分一致性,但仍需保持各自独立性。原因是它们代表了不同的概念。销售系统的产品和支持系统的产品并不是一个概念的,即时物理上它们就是同一个产品。同时,两个领域类的概念对不同模型来说也许是一致的。SnackMachine和ATM两个限界上下文对Money值对象有一致的含义,它代表两者的同一概念,在这种情况下,可以将其提取至贡献内核并复用。第二种类型是领域基类,如Entity和ValueObject,它们不含任何业务逻辑,也能够在同一团队使用。另一方面,其它团队也可使用自建基类,即使基类完全一致。因为基类是和模型绑定的,拥有基类的完全控制权很有必要,这样可以避免在和其它团队协作时出现一致性冲突。第三种类型是工具类代码,它们不含任何领域逻辑,其应用规范和领域基类大致相同。这类代码适合单独作为项目使用。总之,避免在限界上下文间重用代码,特别是领域层的代码。只有代码含义在所有限界上下文都统一时才可提取至共享内核。