子类新增独有参数是否属于不良编码形式?如何解决持久化参数丢失问题
Ingredient子类独有参数持久化问题解决方案
首先不建议直接将所有子类独有参数全部添加到基类的通用变量结构中。这种做法会导致基类结构无限膨胀,大量无效字段会大幅提升后续代码维护、字段校验的成本,还容易出现字段误用的问题,不符合面向对象的设计原则。
基类的固定字段应当仅承载所有子类共有的核心属性,非通用属性尽量不要侵入基类的固定结构。
针对你当前的限制条件,可优先选择以下两种落地性更强的方案:
方案1:基类新增通用扩展存储字段(无需修改持久化逻辑)
- 在
Ingredient基类中新增一个字典/Map类型的通用字段,例如命名为extendedAttrs,专门用于存储所有子类的独有参数,键为参数名,值为参数内容。 - 子类初始化时自动将自身的独有参数写入基类的
extendedAttrs字段,子类需要调用独有参数时直接从该字段中读取即可。 - 该方案完全适配现有的持久化逻辑,扩展字段属于基类的通用结构,存储时不会丢失,且后续新增子类的独有参数不需要修改基类的固定结构,维护成本极低。
方案2:调整持久化序列化逻辑适配多态
如果允许修改持久化的序列化、反序列化规则,优先选择该方案:
- 序列化环节新增子类类型标识的存储,同时完整序列化子类的所有字段(含独有字段);
- 反序列化环节先读取类型标识,自动实例化对应子类,再分别将通用字段、独有字段赋值到实例的对应位置。
- 该方案可以完全保留你现有的工厂模式和类继承结构,不需要调整类的属性设计。
特殊场景下可考虑将独有参数加入基类
只有同时满足以下条件时,才可以选择将独有参数加入基类通用结构的方案:
- 独有参数数量极少,且可预期未来不会新增大量子类或独有参数;
- 独有参数需要支持全局检索、排序等操作,存储在扩展字段中会大幅影响查询效率。
内容的提问来源于stack exchange,提问作者Sean Barton
相关产品推荐
相关产品推荐

