先给结论:不要直接把新格式塞进旧输入规范。正确做法是先判断变化属于“同一字段换了写法”还是“对象边界本身变了”,前者改校验规则,后者必须重画输入规范,并保留旧格式的兼容分支。下面用一个具体场景说明怎么区分。
假设你用站长辅助工具批量检查站点资源,早期只处理形如 https://example.com/a.html 的页面地址,输入规范很简单:每行一个 URL,必须带协议,路径以 .html 结尾。手工挑几十条测试时全部通过,于是这套规则被当成通用标准。
后来对象里混入了带查询参数的地址、无扩展名的路径、目录型地址,甚至同一站点的移动端地址。此时如果仍用“必须带协议且以 .html 结尾”去校验,会出现两种结果:一部分合法对象被拒绝,另一部分被接受但后续处理结果不可比。这不是工具坏了,而是输入规范描述的对象范围已经落后于真实对象。
第一种解释是字段写法变化。对象仍然是同一类页面,只是 URL 的书写形式多了几种,比如带 ?id=、带尾斜杠、带大小写不同的主机名。这种情况下,输入规范的主体结构不用动,只需要放宽或补充字段级规则:允许查询串、允许无扩展名、统一主机名大小写、明确是否保留锚点。
第二种解释是对象边界变化。原来的对象是“静态页面地址”,现在混进了接口地址、资源文件地址或另一类站点地址。它们和原对象不在同一比较维度上,即使格式看起来都是 URL,也不能用同一套输入规范。此时继续放宽校验,只会让不合法对象通过,后续统计和判断都会失真。
两者的关键区别在于:字段写法变化影响的是“怎么写”,对象边界变化影响的是“算不算”。前者改规则,后者改范围。
可以做一个假设的对照检查,不涉及任何真实工具:把新出现的对象按来源分组,每组抽若干条,分别记录三个信息——是否与旧对象属于同一业务用途、是否参与同一套后续判断、去掉格式差异后是否还能一一对应。
这个检查的价值在于:它不依赖工具返回什么,只依赖对象本身的性质。工具报错或通过,只能说明当前校验规则的结果,不能单独证明对象属于哪一类。
动作分三步。第一步,给输入规范加一个版本标识,例如 input-spec-v2,并写明它适用的对象范围。第二步,把旧规则保留为兼容分支,新规则只对新增对象生效,避免历史数据被重新解释。第三步,在规范里增加“拒绝原因”字段,区分“格式不合法”和“对象不属于本规范范围”。
这样做的直接结果是:后续出现例外时,你能从拒绝原因判断是格式问题还是范围问题。如果是格式问题,继续补充字段规则;如果是范围问题,就新建一套输入规范,而不是继续放宽旧规范。下一步的取舍也随之明确——是维护一套更宽松的规范,还是维护两套边界清晰的规范。
以下情况不适合套用上面的“先改校验、再拆范围”路径:对象格式变化频繁且没有稳定分类标准时,先固定一个最小公共字段集,等分类稳定后再扩展;对象来源涉及多个互不兼容的系统时,输入规范应按来源分开,不要合并成一套;如果旧规范已被下游流程硬编码依赖,改规范前要先确认下游能否识别版本标识,否则兼容分支会变成隐性错误来源。
另外,样本通过率、抓取量或某类对象数量归零,都不能单独证明输入规范改对了。通过率上升可能只是因为校验被放宽,数量归零可能只是因为过滤条件写错。判断改得对不对,仍然要回到对象边界和后续判断是否一致这个依据上。