SuperAPI AI 工具集

immutable-domain-entities

编程与开发

查看项目

更新于 10-15 20:13

技能介绍

用途:在编写、修改、审查或解读领域实体时,强制采用不可变设计模式。核心是让领域实体在创建后状态固定,所有合法变更都表达为返回一个保持相同领域身份的新实体实例,并继续满足原有不变量。

适用范围:定义实体字段、属性或构造函数;定义会改变实体状态的领域操作;暴露 getter、setter、集合或嵌套对象;从持久化或传输数据加载、重建实体;复制、克隆、替换或更新实体实例;在创建或状态转换时校验不变量。

主要规则:使用不可变类或语言中最接近的类式构造;普通类型别名、接口或 record 加独立函数不算类式构造,不应据此建模不可变领域实体。身份保持稳定,每次合法状态变更返回新实例;不得原地修改状态,不得添加公开 setter、可写公开字段或原地修改方法,不得让领域方法静默改变现有实例内部状态。字段尽量设为只读;防止通过集合、映射、嵌套对象或缓冲区等暴露引用发生修改;必要时复制或冻结可变输入输出。变更应通过意图明确的操作表达,如 changeAddress、approve、cancel、assignOwner,返回同身份且状态合法的新实体,并在这些操作中保留不变量校验,而非推给调用方。框架约束应留在边界:持久化或框架层若需要可变表示,尽量置于领域实体之外,通过适配器映射。

检测流程:先找修改面,识别 setter、可写字段、可变集合、直接属性赋值和原地更新方法,判断调用方能否绕过显式领域操作修改实体;再追踪保持身份的变更,确认可用返回同身份新实例表达;检查嵌套可变性,防止通过别名破坏不可变;按领域需求而非框架惯例分类设计实体。

编写与审查:构造时完整建立合法不可变实体并校验不变量;用返回新实体的方法替代原地更新,方法名尽量贴合领域意图;移除公开 setter 与可写字段;用不可变集合或防御性复制保护内部引用;确保从持久化或传输数据重建时仍为不可变对象并保持身份与不变量。审查时自问:实体构造后能否被修改?状态变更是否返回同身份新实例?创建与转换是否保留不变量?调用方能否通过 setter、可写字段或暴露引用修改实体?若会削弱不可变性,则应用本技能。

限制:资料未提供具体语言示例、安装命令、平台支持范围或性能影响说明。