先判断这次格式变化是可转换的格式替换还是对象语义改变:前者只需在输入层加一道转换,规范主体不动;后者必须重新定义输入字段和校验规则,否则旧规范会把错误对象送进查询。下面按这两种条件给出不同的改法,并说明旧内容中哪些部分值得保留。
典型情形是同一个对象从一种书写形式换成另一种:域名从带协议前缀改为裸域,路径从绝对地址改为相对地址,列表从逗号分隔改为换行分隔。这类变化不改变“要查什么”,只改变“怎么喂进去”。此时把输入规范拆成两层——输入契约(用户或上游系统交来的原始形态)和查询契约(工具真正接受的标准形态),中间加一个转换步骤。
动作上,先为每种旧写法写一条转换规则,并给每条规则配一个可判定的失败条件。假设输入是一批旧系统导出的域名,其中混有带 http:// 前缀和带尾斜杠的写法,转换规则去掉协议与尾斜杠,失败条件设为“去前缀后仍含空格或非 ASCII 字符”。跑一遍后统计失败条数:如果失败集中在少数几条,说明是脏数据,清洗即可;如果失败比例很高且形态相似,说明上游的书写习惯已经系统性改变,这时才需要回头修改输入契约本身。
这个判断顺序很重要:先看转换失败是零散还是成片,零散按数据问题处理,成片才升级为规范问题。把零散失败当成规范问题去改,会把本来正确的规则一起改坏。
另一种变化是查询对象本身换了类别:原来查的是单个页面地址,现在要查的是一组页面加归属站点;原来输入的是账号标识,现在要输入的是资源标识。这时转换层救不了,因为旧字段根本装不下新对象的信息量。
改法是重列输入字段,每个字段回答三个问题:是否必填、取值范围、缺失时是报错还是跳过。以“单地址”变为“站点+页面集合”为例,可以保留原地址字段但降级为可选,新增站点字段并设为必填,页面集合用固定分隔符承载。校验规则要写清楚:站点字段为空时整条记录拒绝,页面集合为空时只查站点层级。这样旧记录里仍有价值的地址部分不会丢,只是不再单独决定一次查询。
需要保留的旧资产是校验逻辑中与对象无关的部分,比如字符集限制、长度上限、去重规则;需要丢弃的是与旧对象结构绑定的部分,比如“一个输入只能对应一个结果”的假设。取舍标准是:这条规则换个对象还成立吗?成立就留,不成立就重写。
假设某团队维护一份内部查询清单,原本每行是一个完整页面地址,现在上游改成了每行“站点标识 + 若干路径”。如果直接沿用旧规范,工具会把整行当作一个地址,查询结果为空。空结果有两种合理解释:一是对象确实不存在,二是输入根本没被正确解析——只看“结果为零”无法区分这两者,所以不能凭空结果判断处理正确。
正确做法是先加一条解析日志,记录每行被拆成了几个字段。若拆出的字段数与预期一致但查询仍为空,问题在对象本身;若字段数异常,问题在输入规范。这个动作把“结果为空”从一个笼统现象拆成可定位的两类原因,直接决定下一步是改规范还是查数据。
格式变化往往伴随旧教程、旧脚本、旧合作流程的退出。判断保留价值时看两点:它描述的是对象还是操作。描述对象结构(有哪些字段、字段之间什么关系)的内容,即使写法过时也值得留,因为结构信息通常比写法稳定;描述具体操作步骤(点哪个入口、按什么顺序)的内容,一旦输入形态改变就基本失效,可以整段替换。
实施时给旧内容加一个状态标记,而不是直接删除:标为“结构参考”的保留并注明适用对象,标为“操作过时”的移出主流程。这样后续再遇到格式变化时,能快速看出哪些是稳定资产、哪些需要重写。
有三种情况应当先不动规范。一是变化只出现在个别上游,属于对方的数据质量问题,改规范等于让所有输入方为个别错误买单。二是新格式尚未稳定,可能反复调整,此时加临时转换比改契约成本更低。三是查询目标本身还在变动,输入规范跟着改只会来回返工。判断依据是:这次变化是一次性的写法差异还是长期的对象定义调整,前者用转换层消化,后者才动规范。改动前先确认工具当前接受的输入形态,具体支持范围以工具实际说明为准,不要凭旧印象假定。