news 2026/4/24 21:52:20

从代码复用到行为约束:在Agent系统中重新理解继承、封装、多态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从代码复用到行为约束:在Agent系统中重新理解继承、封装、多态

进入智能体开发时代,特别是在最近一年,我才开始意识到一件事:我们并不是突然进入了一个“全新的编程时代”,而是开始频繁地遇到一些用旧范式已经解释不清、约束不住的问题。这些问题并不发生在 Demo 阶段,而几乎都出现在同一个时间点之后——当智能体开始长期运行、开始参与协作、开始在系统中承担连续责任的时候。也正是在这个阶段,我第一次认真地回头看自己用了二十年的那套东西:面向对象、模块划分、接口抽象、继承体系、状态封装。它们没有“失效”,但开始显得不够了。

一、Agent很聪明,但不确定性让我不安

在很多Agent项目早期,我们下意识会沿用非常熟悉的工程方式。

比如:

  • 把Agent当成一个 service

  • Prompt 当成构造参数

  • Tool 调用当成方法

  • Memory 当成内部状态

从代码结构上看,这一切非常自然,甚至可以说非常“优雅”。但问题往往出现在系统跑了一段时间之后。你会发现,很多你原本以为很清楚的边界,开始变得模糊:

  • 这个 Agent 的行为,到底是“实例状态”导致的,还是“上下文输入”导致的

  • 两个 Agent 看起来职责相同,但决策风格已经明显不同

  • 你很难回答:它现在的行为,是继承自哪一次设计,还是运行中“长出来”的

在传统面向对象系统里,这类问题很少出现,因为对象的行为边界是相对稳定的。

而 Agent 不是。

二、面向对象前提假设:行为是可预期的

如果我们冷静一点回看,面向对象编程真正解决的是什么问题?它试图用几个核心概念,帮我们控制复杂度:

  • 封装隔离内部实现

  • 继承复用稳定结构

  • 多态应对变化行为

但这一切都隐含了一个非常重要的前提:对象的行为,是由代码完全决定的。也就是说,只要类定义不变、输入一致、状态可控,那么对象的行为是可预测、可推理、可复现的。而这恰恰是智能体系统开始松动的地方。

三、当行为不再完全由代码决定时,“对象”这个抽象开始吃力

在 Agent 系统里,一个智能体的行为往往由多种因素共同决定:

  • 当前 Prompt 结构

  • 上下文中残留的信息

  • 工具调用历史

  • 模型版本

  • 环境反馈

  • 甚至是一些概率性选择

这些因素,有些是代码控制的,有些不是;有些是显式状态,有些是隐性条件;有些你能回溯,有些你只能推测。你会发现一个很微妙的变化:Agent 的行为,开始具有“运行期生成性”,而不是“定义期确定性”。在这种前提下,如果你还用“对象 = 行为载体”来理解Agent,就会开始感到不安。不是因为这个抽象错了,而是它假设的世界已经变了。

四、继承:从“复用代码”,变成“复用行为约束”

在传统 OOP 里,继承最核心的价值是代码复用和结构抽象。但在 Agent 系统里,如果你真的尝试用继承来组织智能体,你很快会遇到一个现实问题:你很少想继承“实现细节”,而更想继承“不允许做什么”。

比如两个Agent都处理客户请求:一个是客服 Agent,另一个是风控 Agent,它们使用的模型、工具甚至 Prompt 结构可能非常相似,但你真正关心的继承关系,往往不是“它们都能调用哪些工具”,而是:

  • 哪些决策边界是不能突破的

  • 哪些信息是绝对不能输出的

  • 哪些路径在任何情况下都要被禁止

这时候,继承更像是在传递一组行为约束与责任边界,而不是方法实现。如果你还试图用传统“基类 + 子类”的方式去理解它,就会发现结构越来越别扭。

五、封装:不再是隐藏实现,而是隔离不确定性

封装在 OOP 里的原始含义,是隐藏内部实现细节,只暴露稳定接口。但在 Agent 系统里,真正需要被“封装”的,往往不是实现,而是不确定性本身。你会越来越希望做到几件事:

  • 不让Agent的内部推理路径直接影响系统其他部分

  • 不让上下文污染跨越它本不该跨越的边界

  • 不让一次异常决策扩散成系统级行为漂移

封装的重点已经从“信息隐藏”转向了风险隔离与行为收敛你封装的不是代码,而是一个“可控的决策空间”。

六、多态:从“不同实现”变成“不同决策风格”

多态在传统编程里解决的是一个非常明确的问题:同一个接口,不同实现。但在 Agent 协作系统中,多态的真正价值发生了偏移。在Agent程序中,我们不关心到底使用哪个LLM大模型,底层调用的是哪个工具实现,而是关注在不确定信息,需求模糊,目标冲突的情况下,如果做出正确的决策。这些决策风格差异。而这类差异,往往并不适合被硬编码在方法里,而更像是系统层定义的一组策略参数。

七、“面向智能体编程”,并不是抛弃 OOP,而是上移一层抽象

我并不认为我们真的“从 OOP 进入了一个完全不同的范式”,更准确的说:OOP 解决的是“构件如何组织”,而 Agent 编程开始关心“行为如何被治理”。在我现在认可的架构里:对象仍然存在、模块仍然存在、接口仍然存在。但它们不再是系统的最高抽象层。在它们之上,多了一层以前并不存在东西:行为边界、决策责任、风格约束、反馈机制。这层东西才是“面向智能体编程”真正试图处理的对象。

OOP

智能体

继承

代码复用

责任与约束的传递

封装

实现隐藏

决策风险的隔离

多态

实现差异

可被治理的行为风格差异

它们并没有消失,只是被重新放到了一个更贴近真实系统风险的位置上。所以我并不认为“从 OOP 到 Agent 编程的革命”。它更像是一种工程反应:当系统开始承担更大不确定性时,我们本能地开始寻找新的约束结构。Agent 只是让这种不确定性显性化了。如果你真的上线过智能体系统,你会知道,Agent编程从来不是模型不够聪明,而是你不知道它明天会不会“换一种方式聪明”,工程的意义在于让聪明可控,让行为可解释,让系统在变化中仍然站得住。所以“面向智能体编程”,并不是对过去的否定,而是更加重视工程责任。相比OOP编程,我们要约束的,不再只是代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 16:07:35

从Java小白到面试达人:互联网大厂求职实战

场景:互联网大厂求职面试 在一间宽敞明亮的会议室里,程序员超好吃正在准备他的第一次大厂面试。面试官是一位经验丰富、神情严肃的技术主管。 第一轮提问:核心技术与基础设施 面试官: 请解释一下Java SE 8中的函数式接口及其应用场…

作者头像 李华
网站建设 2026/4/23 14:00:28

iOS免越狱神器AltStore:3步解锁iPhone隐藏功能

还在为无法安装心仪的第三方应用而烦恼吗?现在有了更简单的解决方案!AltStore作为专为非越狱iOS设备设计的替代应用商店,让你轻松突破限制,无需复杂操作就能享受更多精彩应用。本文将手把手教你如何快速上手这款神奇工具。&#x…

作者头像 李华
网站建设 2026/4/19 6:32:28

AhabAssistantLimbusCompany:PC端自动化辅助工具完整操作指南

AhabAssistantLimbusCompany(简称AALC)是一款专为《Limbus Company》玩家打造的PC端智能辅助工具,能够通过模拟人工操作实现游戏内日常任务的自动化执行,帮助玩家高效管理资源、优化战斗流程,让游戏体验更加轻松便捷。…

作者头像 李华
网站建设 2026/4/22 8:13:37

摆脱Mac单调光标:Mousecape如何让你的鼠标指针充满个性

摆脱Mac单调光标:Mousecape如何让你的鼠标指针充满个性 【免费下载链接】Mousecape Cursor Manager for OSX 项目地址: https://gitcode.com/gh_mirrors/mo/Mousecape 每天面对同样的白色箭头,你是否已经对Mac的默认光标感到审美疲劳?…

作者头像 李华
网站建设 2026/4/18 6:23:00

21、深入探索RxCpp自定义操作符与设计模式

深入探索RxCpp自定义操作符与设计模式 1. RxCpp自定义操作符的创建 在RxCpp中,每个操作符都定义在 rxcpp::operators 命名空间下。为了展示如何从头开始实现一个操作符,我们复制了 map 操作符的实现,创建了一个名为 eval 的新操作符,其语义与 map 操作符相同。 …

作者头像 李华