DDD聚合根ID引用字段省略Ids后缀命名是否存在潜在问题?
字段改名潜在问题说明
你定义的两个聚合代码如下:
data class Order( val id: OrderId, val shipmentIds: Set<ShipmentId> ) : BaseAggregate() {}
data class Shipment( val id: ShipmentId, var fromAddress: ShippingAddress, var toAddress: ShippingAddress ) {}
将shipmentIds改名为shipments会存在以下几个潜在问题:
- 语义歧义,增加理解成本:常规命名习惯下,不带Ids后缀的复数名称默认对应实体对象集合,其他开发人员看到
shipments字段第一反应会认为这是Set<Shipment>类型的实体集合,而非ID集合。即便Kotlin是强类型语言,也会导致开发人员阅读代码时需要额外跳转查看字段类型,编码时也容易写出直接调用Shipment实体属性的错误代码,提升出错概率。 - 破坏DDD聚合边界的约定认知:在领域驱动设计的聚合规范中,外部聚合的ID引用加Ids后缀是行业通用的隐含约定,用来明确标识该字段是对其他聚合根的引用,当前聚合不管理对应实体的生命周期,实体数据需要单独从对应仓库查询。改名为
shipments会误导开发人员认为Shipment是Order聚合内部的子实体,可能出现直接在Order的业务逻辑中修改Shipment属性的越界操作,违反聚合的隔离原则。 - 提升后续迭代的维护成本:如果后续业务需要在
Order中冗余存储Shipment实体集合做查询优化,你将没有符合语义的字段名可用,届时只能再回头修改老字段的命名,导致所有依赖该字段的业务代码都需要同步调整,波及范围大,额外增加适配成本。
内容的提问来源于stack exchange,提问作者Jay Ahn
相关产品推荐
相关产品推荐

