结论先给:如果这个功能没有任何仍在生效的外部依赖,也没有持续产生数据或权限风险,优先下线并保留代码归档;只有当它仍被其他在用功能调用,或下线本身会破坏现有流程时,才选择留用。判断的关键不是“已经花了多少开发成本”,而是它现在是否还被依赖、是否仍在写入数据、下线会牵连什么。
需求取消只说明提出方不再要这个入口,不等于功能已经孤立。实际动作是:在代码仓库里搜索该功能的入口文件、接口路径和数据结构名,列出所有引用位置。如果引用只出现在它自己的目录和已下线的菜单里,说明它是孤立模块;如果被订单、会员、支付或消息通知等在用模块调用,下线就会连带报错。这一步的结果直接决定下一步:孤立模块进入下线评估,被调用的模块先做解耦或保留。
留用不是“放着不管”,而要满足几个可验证条件:
满足这些条件时,留用的成本主要是代码可读性和后续维护者的理解成本。可以给它加上“已停用、勿扩展”的注释,并从导航和权限里移除入口,减少误用。
下线成立的条件更常见:没有外部引用、不再写入新数据、历史数据已确认可归档或可删除。此时保留代码反而增加安全面和维护负担,因为一个不再被测试覆盖的旧接口,可能成为被忽略的入口。
但有一个反例会让“优先下线”失效:如果该功能曾经对外发布过,用户已经产生过数据,且这些数据涉及对账、审计或用户查询,那么直接删除代码和数据会切断历史可追溯性。此时正确做法不是留用功能,而是下线入口、保留只读的数据归档和查询脚本,把“功能”和“数据”分开处理。
假设某功能是“活动报名表”,需求取消后:路径A直接删除代码和数据表,结果三个月后运营要核对历史报名名单,只能从备份里恢复,恢复过程可能丢失部分字段。路径B先停用入口、把数据表改为只读并导出归档,再删除前端和接口代码,结果历史名单仍可查,维护面也缩小了。两条路径的差别不在开发成本,而在是否提前确认了数据的后续用途。
完成依赖清查后再决定留用或下线,才不会出现删了代码却留下报错接口,或留着功能却没人知道它已停用的情况。