结论先行:对象格式变化时,不要直接改字段名去迁就新格式,而应先固定"内部规范层",再为每种外部格式写一个转换适配层。只有当格式变化只是字段重命名、结构不变时,直接改映射才成立;一旦嵌套层级或必填语义变了,直接改映射会把错误推迟到运行阶段才暴露。
格式变化通常分两类,处理方式完全不同。
2024-01-01 变成 01/01/2024,但对象表达的事实没变。这类改动只需在适配层做重命名和解析,内部规范不动。判断依据不是看字段数量,而是问一句:同一份业务事实,改格式前后能不能一一对应地映射?能,就是换壳;不能,就是换语义。
多个角色对"输入应该长什么样"理解不一致时,争论字段名往往没有结果。更有效的做法是把分歧写成一份可核对的契约,至少包含三部分:
把这三项写下来后,让每个角色拿同一份样例数据走一遍,看是否得到相同结论。分歧点会自然收敛到具体条款上,而不是停留在"格式不对"这种模糊说法。
假设某工具的输入原本是扁平的页面清单,每条含 url 和 title;新格式改成按站点分组,每个站点下挂一个页面数组。若直接改字段映射,把 title 指向新路径,单条记录仍能解析,但"一个对象对应一个页面"的假设被打破了,后续按对象计数的逻辑会全部错位。正确动作是先定义内部规范仍以页面为最小单位,再写一个展开步骤把分组结构拍平。这个动作的结果是:下游逻辑不用改,而新增的展开步骤成为唯一需要随格式演进的模块。
如果格式变化来自上游系统本身的重构,且新旧格式会长期并存、由不同团队分别提供,那么"内部规范层 + 适配层"仍成立,但适配层不能只有一个。此时需要按来源区分适配器,并在契约里标注每个来源的格式版本。反过来,如果格式变化只是某次导出时的临时差异,且不会再出现,那么为它专门建适配层就是过度设计,直接在一次性的清洗步骤里处理即可。
先取一份新格式的真实样例,与旧样例并排比对,标出每一处差异属于换壳还是换语义。对换壳项写重命名与解析规则,对换语义项回到内部规范层重新定义对象边界。改完后用同一份样例分别跑新旧两条输入路径,确认它们产出相同的内部对象,再决定是否把旧路径下线。这样格式再变时,你改的始终是适配层,而不是散落各处的字段引用。