代码传递信息方式的探究

探究AI人工智能领域多智能体系统的通信机制 多智能体系统(Multi-Agent System, MAS)作为分布式人工智能的重要分支,近年来在自动驾驶、机器人协作、金融交易、智能电网等领域展现出巨大潜力。本文旨在系统性地探讨MAS中的通信机制,包括其理论基础、实现方法和应用实践。文章首先介绍MAS的基本概念,然后深入探讨通信机制的核心原理,接着通过代码示例和数学模型进行详细讲解,最后讨论实际应用和未来趋势。智能体(Agent): 具有自主性、反应性、主动性和社会能力的计算实体多智能体系统(MAS): 由多个智能体组成的系统,智能体之间可以交互。 阅读详情

相信在使用MVC思想进行编程的猿类们对该规约不陌生:controller层只用来做分发,具体的业务逻辑应当放在服务层(service或manager)。

上述的规约的核心其实是:代码模块化,每个模块各司其职。

当然,实际上想要完全执行上述标准有一定的困难,个人觉得主要有如下几点原因:

  1. 多人开发,各人的编程水平、想法不一致,对代码控制的范围划分不一;
  2. 因为将本来一块的代码划分成了多块,增加了编程的复杂性(但实际上简化了后期的维护以及拓展,更清晰),比如需要规划分成多少块合适,这样,部分猿类选择了偷懒~;
  3. 信息传递不方便;

本文主要探究第三点,那“信息传递不方便”是什么意思呢?举个例子:

客户通过请求来获取账户的信息,假如所有的业务逻辑都放在controller层中的一个请求方法中,那么如果请求的参数不满足要求,可以直接返回给客户哪些地方不满足要求,比如你提供的用户id是别人的,权限不足等等。

但如果controller只是用来分发业务,具体的业务实现都是放在服务层,那如果请求的参数不满足要求时,服务层该怎样把诸如“你提供的用户id是别人的,权限不足”这样的具体信息返回给controller层呢?不管方式具体是怎样,无疑都会增加一道门槛,这也就是我所说的“信息传递不方便”。

不过,虽然有这种不便之处,但相对于“代码模块化,各司其职”所带来的优势来说简直不值一提,最直接的就是代码复用,因此我们需要解决“信息传递不方便”这样的问题,而不是因噎废食。

笔者工作时间不算太长,对于上述问题的解决方案,接触的主要有两种:

  1. 使用统一的结果类来携带信息。比如,封装一个Result对象,该类中定义好信息-message、具体数据-data等属性,每一个小模块(或方法)都返回Result对象,这样既能保证返回方法的结果,也能携带对应的信息;
  2. 使用异常抛出信息。这种方式不需要有封装好的Result对象,如果方法返回的是boolean,那就是boolean,如果需要传递信息出去,那么抛出自定义异常,异常中携带信息;

我们来对比一下上述两种方案,方案一的优缺点如下:

  • 优点:无论方法是否顺利执行,你都可以传递信息,比如,某条信息入库成功,方案一可以在返回true的同时携带“xx入库成功”字样的信息,而方案二只能根据返回结果true后调用方法自行给定信息;
  • 缺点:每个方法都需要处理封装的Result对象,大大增加了方法的复杂度,而且不便于重构,假如Result对象被弃用了,想换成ResponseResult对象,那么需要更改大量的代码;

方案二优缺点如下:

  • 优点:方法只做自己范围内的事情,不需要处理其他,如方案一的Result对象,与其他代码的耦合性降低;
  • 缺点:只能在代码不能正常(所需条件不满足或异常)时,传递信息,顺利时不能传递;

貌似方案一和方案二的优缺点正好相反,但实际不是,先不说方案二的优点要比其缺点好上多少,单说方案二的缺点,其实都不能称之为缺点,因为个人觉得在方法中我们自定义的信息就应当是有问题的时候才需要传递,正常的时候正常返回对应的结果就好了。

这样其实更符合我们的理解,比如说去银行取钱(调用一个方法),如果顺利那就是银行给你需要的金额(获取结果),具体你想怎么表达你的喜悦自行决定就好了(给客户返回的对应信息),银行在给你钱的过程中完全可以不说话,只有在银行钱不够无法给你提供正常的结果时银行才需要向你传递“钱不够”这样的信息,所以从某种方面说,方案一的优点只是一种副作用。

而且最主要的是代码的耦合性,也就是方案二的优势,这种优势完全不是方案一优势所能比拟的!

所以在方法传递信息时,更加推荐第二种方案,这种方案可以在达到目的的同时,减少大量耦合性代码,并且足够优雅!

不过,这里还是有个小小的问题,抛出的异常是否需要区分呢?

直接给出我的想法,需要进行区分。

还是以客户发送请求来获取账户信息为例,假设客户发送的用户id不是自己账户的(攻击),那么在controller层转给服务层某个校验权限方法后,该方法查询数据库发现权限不对,抛出异常返回给调用方法“权限不足”的错误信息,服务层继续抛出该异常,controller层接收后返回对应的错误信息,这样的流程没有问题。

但还有一种情况,在校验方法查询数据库时出现了数据库异常,按照上一种情况,会抛给服务层调用方法,服务层继续抛出该异常,controller层返回给客户错误信息,如数据库连接失败,这种情况明显就不合理了,服务器内部的错误信息不应当显示给客户。

因此,对于抛出的异常我们可以基本分成两类,一种是自定义的业务异常,另一种就是其他异常,controller层或者服务层接收到自定义业务异常后选择将对应的异常信息展示给用户,如果不是,那么可以统一返回“系统异常,请稍后重试”的信息,避免服务器内部错误外现,否则不仅影响客户体验,也容易暴露网站安全问题。

作者: 风语
因水平限制,本人观点难免会有错误疏漏,如发现有什么不妥或者有更好的建议或意见,还请各位不吝赐教!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(1475958950@qq.com)咨询。

探究光学OFDM系统中不同调制方式的BER性能 本章将从光学OFDM系统的BER性能入手,结合理论分析和实验验证的方法,探讨光学OFDM系统中各种调制技术对BER性能的影响。通过对比分析不同调制方案下系统的BER性能,为优化系统设计和提升通信质量提供理论依据和技术指导。接下来的章节将依次探讨调制技术的理论基础、实际代码实现以及BER性能的比较分析等内容。调制技术是指将信息信号通过某种方式调制到载波信号上,以便于信息的传输和处理。在这个过程中,信息信号会改变载波的某些参数,如幅度、频率或相位。调制技术的不断发展是通信系统不断进步的重要推动力。 阅读详情

相关推荐

Swift实现打开目标应用的两种私有API方法探究

本文还有配套的精品资源,点击获取 简介:在iOS开发中,开发者可能需要使用私有API来实现跨应用功能,例如打开特定目标应用。本文详细介绍了两种使用Swift实现该功能的方法。方法一涉及使用 openURL:options:completionHandler: 函数配合私有技巧绕过系统检查,而方法二则是通过私有框架 SpringBoard 注入代码...

weixin_30838971的博客 1724

MVC体系结构 和代理协议消息传递机制

MVC体系结构 Model:数据模型 负责数据的保存以及相关的处理方法,Model不知道它会被谁调用,也不知道什么时候会被调用 View:视图 负责界面上元素的显示,通常在很多iOS应用程序中,视图只是StoryBoard或者xib文件,一般不会在视图中写太多的代码 Controller:控制器 负责界面上数据的显示,以及用户与界面发生交互之后,通知

kiss8220的专栏 577

深入探究Zigbee协议及其多样化应用

Zigbee技术设计之初就将低功耗作为其核心优势之一。低功耗特性使得Zigbee非常适合应用在电池供电的设备中,如传感器、遥控器和其他移动设备。Zigbee设备能够在低电量状态下持续工作数月甚至数年,这主要得益于以下几个因素:睡眠模式:Zigbee设备大部分时间都处于睡眠模式,只有在需要发送或接收数据时才会激活,这样大大减少了能量的消耗。微控制器的高效处理:Zigbee设备中的微控制器在处理任务时具有高能效比,能够在执行完必要操作后迅速返回到低功耗模式。

weixin_42499004的博客 438

在两个页面之间传递信息

在asp.net不同页面之间传值的方法主要有三种:(1)用querystring方法:在vs2005中新建asp.net网站(发送端),在页面上添加button,两个TextBox,代码如下: protectedvoidButton1_Click(objectsender,EventArgse){stringurl;url="htt...

weixin_30521161的博客 216

两个程序间消息的传递

实现一个程序发送消息,另一个程序接收消息,注意一定要压缩包里面的test2运行之后,test才能获得test2对话框的句柄,否则你会以为这些代码实现不了你想要的功能

DMA学习笔记

DMA(direct memory access,直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间的数据的访问和搬移。

weixin_46220498的博客 3111

(2)传递代码

java8之前,java只允许传基础数值或者对象的引用,而现在java允许传代码了。 接下来还是以Comparator来举例。 //匿名内部类 @Test publicvoidjava8Test() { Person p1 =newPerson(22); Person p2 =newPerson(23); ...

ansu2008的博客 181

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

TFN_yzgd的博客 926

第一行代码——探究碎片

1. 在碎片中模拟返回栈  transaction.addToBackStack(null); private void replaceFragment(Fragment fragment) { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction tran...

Curry7895的博客 287

数据预处理的分箱操作

数据分箱 介绍 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险。尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化。而特征离散化处理通常采用的就是分箱法,数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,提高泛化性。 数据分箱又分为有监督分箱和无监督分箱,是否使用标签进行离散化(分箱)决定了有监督还是无监督的离散化方法。 知识点 无监督分箱 split 分箱 merge 分箱 无监督分箱 这里为了

随笔记 5332

Hadoop生态系统-新手快速入门(含HDFS、HBase系统架构)

Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量...

Hadoop环境搭建教程 471

MVC基础探究

MVC基础探究

碎冰冰的博客 170

如何离线环境下安装Dify插件 (可提供远程指导协助)

离线环境下安装Dify插件

litlit023的专栏 8100

从hello,world探究程序的执行过程

尽管 hello,world 程序非常简单,但是为了让它能够实现运行,系统中的每个组成部分都需要协调工作,从某种意义上来说,本文章的目的就是要帮助你了解在系统上执行 hello,world 程序时,系统发生了什么以及为什么会这样

莪是男神的博客 935

华为OD机考双机位C卷 - 构成正方形的数量 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 成正方形的数量 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 5938

第3讲:单端传输线的时域TDR仿真(基于实战的第一次仿真视角切换)

本文为CST仿真系列教程的第3讲,主要介绍传输线阻抗(TDR)的两种仿真方法:基于S参数的频域计算和基于高斯脉冲的时域计算。文章详细演示了在CST PCB Studio中修改电容参数、设置TDR仿真参数(包括截止时间和采样点数)的操作步骤,并通过对比实验展示TVS寄生电容对阻抗曲线的影响。最后将两种TDR方法的结果进行对比,验证了两种方法的一致性。本教程适合硬件工程师通过时域波形直观分析传输线阻抗特性,是信号完整性分析的重要技能。

一只豌豆象的博客 227

异步编程Promise探究

JavaScript Promise

siweidetu的专栏 277

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 337

探究AI原生应用领域Llama的算法原理

想象一下,如果你有一个"超级大脑"朋友:它能陪你聊天解闷、帮你写作业、甚至教你编程——这就是AI原生应用中的大语言模型(LLM)在做的事。而Llama,就是这个"超级大脑朋友圈"里特别受欢迎的一员。本文的目的,就是带你走进Llama的"大脑内部",看看它的"思考器官"是如何工作的,为什么它能理解你的问题并给出像人类一样的回答。我们会从基础概念讲到具体算法,再到实际应用,让你不仅"知其然",更"知其所以然"。工厂大门(背景介绍):了解为什么要研究Llama,以及参观路线(文档结构);

大模型应用工坊 469

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

对iframe的探究

iframe的基本概念 iframe通常作为网页中的内联框架在网站中使用。 优点: 1.iframe 可以和主页面并行加载而不会阻塞主页面的渲染加载 2.可以和主页面进行相互的事件沟通和dom操作 iframe.contentWindow, 获取iframe的window对象iframe.contentDocument, 获取iframe的document对象 在同域下,父页面可...

weixin_34106122的博客 343

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于芋道源码中的工作流(基于flowable)简单探究(个人学习)

工作流(Workflow)指“业务过程的部分或整体在计算机应用环境下的自动化”,是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。它主要解决的是为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务的问题。工作流概念起源于生产组织和办公自动化领域,是针对日常工作中具有固定程序活动而提出的一个概念,目的是通过将工作分解成定义良好的任务或角色,按照一定的规则和过程来执行这些任务并对其进行监控,达到提高工作效率、更好的控制过程、增强对客户的服务、有效管理业务流程等目的。

weixin_56555958的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Golang Context 的并发安全性探究_golang context并发安全(1)

一种常见的误用 Context 的方式是在函数之间传递大而全的 Context,其中包含了过多的信息。这样做不仅增加了代码的复杂度,还可能导致上下文信息的混乱和不一致。最好的做法是根据具体的需求,只在需要的时候传递相关的 Context 信息。将 Context 限制在必要的范围内,只传递需要的上下文信息,可以使代码更加清晰和可维护。

2401_87299581的博客 477

告别 IM 和 邮件,异步工作,才是程序员最理想的工作方式

李小波——新加坡 SmartTokenLabs技术总监、极限编程教练。CSP-SM,CSPO,CSD,DevOps Master,Scrum@Scale,前 ThoughtWorks 高级咨询师,首席培训师。前UPerform资深敏捷教练,首席工程教练。

Keylink_con的博客 385
上一篇: IT团队之非正式沟通
下一篇: DELPHI的一些开源项目GIT地址
linux12a
博客等级 码龄9年 20粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值