在Freezed中何时需要实现抽象类?为何Freezed类要实现IEntity接口
Freezed定义的类实现IEntity接口的核心原因
这一设计是为了贴合领域驱动设计(DDD)的实体规范,同时利用Dart类型系统获得统一约束、逻辑复用等工程收益,具体可以拆解为以下几点:
- 对齐DDD实体的核心定义
DDD中实体(Entity)的本质特征是「通过唯一ID而非属性值区分对象」,哪怕两个实体的其余属性完全一致,只要ID不同就是两个独立实体。IEntity接口的作用就是从语法层面强制所有实现类必须具备
UniqueId类型的id属性,从根本上保证实体的核心特征不缺失。
- 统一编码约束,编译期排查错误
所有需要作为实体的类只要实现IEntity,就必须声明id字段,团队协作时不会出现实体类漏写ID的情况,这类问题在编译阶段就会被拦截,不需要等到运行时才暴露。 - 支持多态,实现通用逻辑复用
你可以基于IEntity编写通用上层逻辑,不需要为每个实体类重复实现相同功能:
比如通用仓储层接口可以直接定义为:
abstract class IRepository<T extends IEntity> { Future<void> save(T entity); Future<T?> getById(UniqueId id); Future<void> delete(UniqueId id); }
不管是TodoItem还是后续新增的Note、User等实体,都可以直接复用这个接口定义,不需要重复编写增删查改的方法签名。类似实体ID校验、列表按ID查找元素这类通用逻辑,都可以统一针对IEntity类型编写。
- 与Freezed特性适配,零额外开发成本
Freezed会根据你在构造函数中声明的@required UniqueId id参数,自动为生成的_TodoItem类实现idgetter,你不需要手动编写任何额外代码就能满足IEntity的接口要求,几乎零成本获得上述所有收益。
内容的提问来源于stack exchange,提问作者Mariam Albarghouti
相关产品推荐
相关产品推荐

