你维护过那种嵌套7层、注释写着"千万别动"的祖传代码吗?一位后端工程师最近晒了个重构案例:把47行if/else链条压缩成3行配置表,评审群里当场有人拍桌子——"早干嘛去了"。
01 | 那个让全组失眠的支付路由模块
故事发生在一家做跨境支付的SaaS公司。他们的核心逻辑是根据用户地区、支付方式、风控等级三要素,决定走哪家通道。听起来简单,实现起来却是灾难。
原始代码长这样:先判断region是不是"US",是的话再看payment_method是不是"card",再嵌套risk_level是不是"high"……层层剥洋葱,剥到最里面发现有个hardcode的通道ID。产品经理改个规则,开发要翻三页代码找插入点。
作者统计了一下:17个地区 × 8种支付方式 × 3档风控 = 理论408种组合,实际生效的不到60种。但代码里那47行if/else,把每种例外都写成了特殊分支。有个注释特别扎眼:"2022年双11临时方案,FIXME"——FIXME挂了两年。
最痛苦的是测试。每次上线前,QA要对着Excel表格逐行核对,生怕漏了哪个角落的分支。作者的原话是:"改一行代码,测三天;改配置表,测三小时"。
02 | 配置驱动:把代码变成填表格
重构思路不复杂。作者画了个二维决策矩阵:行是地区+支付方式的组合,列是风控等级,单元格里填通道优先级列表。
核心就三行配置:
匹配规则 → 执行策略 → 兜底方案
匹配规则用声明式写法,比如region: ["US", "CA"] AND method: "card"。执行策略不是写死通道ID,而是定义"优先走Stripe,失败转Adyen,再失败走本地聚合"。兜底方案专门处理未匹配的情况,比如抛异常或进人工审核队列。
关键设计是策略优先级可覆盖。通用规则放全局配置,特殊-case(比如巴西的boleto支付)单独开一行,自动覆盖全局。产品经理想调整巴西市场的通道顺序?自己改配置表,不用提需求排期。
代码量从47行降到12行——而且这12行是通用引擎,以后加新地区不用碰代码。作者放了个对比图:左边是密密麻麻的if/else金字塔,右边是整齐的JSON配置,点赞数当晚破千。
03 | 代价:不是银弹,是权衡
评论区最热的质疑是:配置复杂了怎么办?现在60种规则是可控的,要是涨到600种,配置表本身就成了新灾难。
作者的回应很实在:"我们设了硬门槛,单环境配置行数超200就触发重构评审"。他还补了个细节——配置不是纯文本,接了内部的低代码平台,产品经理改之前要先跑模拟器,看命中哪条规则、最终路由到哪。
另一个隐藏成本是调试难度。if/else链条虽然丑,断点一打就知道进了哪个分支。配置驱动之后,作者加了一套追踪日志:每次决策输出"匹配规则ID→策略执行顺序→最终结果",方便事后复盘。
有个同行分享了反例:他们团队早年也搞过配置驱动,结果配置表被运营当成万能药,什么业务逻辑都往里塞。最后配置表膨胀到3000行,加载耗时从50ms涨到800ms,被迫回滚重构。
04 | 为什么现在才流行
配置驱动不是新思路。2004年的《企业应用架构模式》就讲过"规则引擎",但当年落地成本高——得买商业软件、培训业务人员写规则DSL。现在云原生工具链成熟,JSON/YAML人人会写,低代码平台降低了试错门槛。
作者提到一个微妙变化:支付行业的通道数量在爆炸。五年前接三家通道够用,现在一家商户可能同时开Stripe、Adyen、Checkout、本地钱包、加密货币……硬编码的维护成本指数级上升,倒逼技术债偿还。
他的团队现在把这套模式复制到了风控策略、营销补贴规则两个模块。下一步是配置版本化——每次变更自动快照,出问题秒级回滚,像回滚代码一样回滚业务策略。
代码评审群里的拍桌子同事,后来私信作者要了完整方案。据说他们组的if/else链条更长:83行,注释里写着"印度市场特殊逻辑,TODO 2021"。
你代码库里最长的if/else有多少行?最近一次动它是什么时候?
热门跟贴