ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

让 AI 审核责任链与策略:先给业务反例,再给模式名

让 AI 审核责任链与策略:先给业务反例,再给模式名

“这里适合责任链”“那里换成策略模式”,是 AI 代码评审里很常见的建议。但如果计价顺序变了,类名再漂亮也属于行为回归。

下面用金额整数分做例子。它不是电商生产系统,没有真实订单和支付;只验证重构前后是不是仍然按同一个契约计算。

先写一句能手算的规则

契约是:原价为非负整数分,先打八折,向下取整到分;再减优惠券,结果不低于零。100 元、10 元券,得到 70 元。若先减券再打折,得到 72 元,差异不会因为叫“策略”而消失。

责任链解决的是多个处理步骤怎样组合、何时停止;策略解决的是同一职责怎样选择一种算法。它们可以一起用,也可以完全不用。评审时应问“哪一种变化需要隔离”,不能让模式名替代规则。

朴素参考与组合实现同时保留

def check_money(price, coupon): if type(price) is not int or type(coupon) is not int: raise ValueError("integer cents only") if min(price, coupon) < 0: raise ValueError("negative money") def reference(price, coupon): check_money(price, coupon) return max(0, price*80//100-coupon) def register(table, name, fn): if name in table: raise ValueError("duplicate strategy") table[name] = fn strategies = {} register(strategies, "sale80", lambda amount: amount*80//100) register(strategies, "regular", lambda amount: amount) def quote(price, coupon, strategy): check_money(price, coupon) if strategy not in strategies: raise ValueError("unknown strategy") amount = strategies[strategy](price) return max(0, amount-coupon) assert quote(10000, 1000, "sale80") == 7000 assert (10000-1000)*80//100 == 7200 count = 0 for price in range(201): for coupon in [0, 1, 10, 100, 300]: assert quote(price, coupon, "sale80") == reference(price, coupon) count += 1 for action in [ lambda: register(strategies, "sale80", lambda x:x), lambda: quote(100, 0, "missing"), lambda: quote(True, 0, "regular"), lambda: quote(-1, 0, "regular"), ]: try: action() except ValueError: pass else: raise AssertionError("invalid operation accepted") print(count, "prices/coupons agree; invalid cases rejected")

Python 3.9.6 隔离运行通过,共 1005 个金额/优惠券组合与参考实现一致。这里只声明这个有限范围;对所有合法整数的一致性还可以直接由相同操作顺序推导。

实现是纯函数式金额计算,没有数据库、网络和共享订单上下文。若后续把处理器改成修改同一个可变对象,还要核查并发请求是否互相污染、失败后是否留下半成品。本例没有解决这些工程问题。

AI 建议要绑定一条失败输入

我会让评审者给出最小反例和修复后的断言。例如“把优惠券处理器前移”必须说明这是故意改业务还是误改行为;“未知策略回退默认”则需要确认产品是否允许静默降级。在支付金额场景里,默认吞掉未知类型可能比报错更难发现。

OpenAI 2026-10-19 的编码研究将保持已有行为作为独立任务;这里只引用这个任务划分,不复述厂商分数。EvalPlus则提供行为测试扩展的项目材料。它们都不能证明本文这种类设计对所有项目最好。

如果模型只给抽象建议,没有输入、路径和预期结果,我会先把它留在“设计讨论”,不直接变成修改依据。相反,一个十行朴素函数如果能把规则说清楚,也可能比一串抽象类更适合当前规模。

材料截止 2026-10-23,十月研究的结论归作者;本次没有实际模型对照。28 日发稿前复核动态来源与更正,不预写重构上线后的收益。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进