当前位置: 首页 > news >正文

跟我学C++中级篇——通信的数据的传递形式

一、通信的数据传递

在开发程序中,无可避免的会进行数据的传递。这种传递方式有很多种,字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时,如何正确的采用更合适的方法,就成为了一个设计的首选的问题。

二、数据传递形式选择的原则

在面对复杂的应用场景和多种多样的传递方式的前提下,如何正确的确定自己的通信传递形式,是有一些原则可以参考的:
1、准确性
这是选择的首要原则,即准确,不能因为因为选择一种方式导致过多的中间环节产生问题。最简单的一种例子就是在函数参数的通信中,把有符号和无符号互相传递,这极有可能出现问题,而且不容易发现。另外,不能让开发者产生歧义,这也是准确性的一种表现即表义要准确。
2、简单性
在准确的基础上,用最少的工作量即可实现最为可取。这种简单不只是普通的简单,如果有成熟的框架或者有现成的库、类等,也称之为简单。

3、可扩展性
也就是灵活性,最好这种数据传递起来不会因为一个轻微的新需求,导致很复杂或很大量的修改。

4、可维护性
这种其实是前边几种的一种综合要求,一般来说,简单的就容易维护,可扩展性好也容易维护。但又简单又可扩展,就不一定好维护了。比如用了一个现有的框架,那维护性就未必多高。毕竟一个框架还是需要付出较多的人力成本和时间去学习掌握的。

三、数据传递常见的形式

1、函数间
函数间的数据通信是最常见的,一般来说,开发者都会采用基本数据类型(如int,string等)进行数据传递。但这种方式有限制,一个是无法传递太多的参数,另外一个无法传递一些对象或特定的数据类型(如图像等)。
那么就可以使用类或结构体来进行传递,这种方式可以传递多个对象,但编写有些复杂,维护成本有所增加。如果需要传递多个相同的基础类型或对象,可以使用STL中的一些std::array、std::vector、std::list等进行传递。它们很重,而且效率也不多高,操作起来相对直接使用对象或基础数据类型要麻烦一些(此处不讨论值或引用传递,只讨论形式)。
但此时又会出现一些问题,比如有一些数据是有关联的,怎么办?可以使用std::pair,std::tuple或者使用std::map等。这种应用就复杂一些,而且还有不少细节的小坑,如果没有文档辅助可能让后续开发者有些难以入手。
而对于图像或视频、文件这种大的数据类型,可以使用二进制流(可以用指针操作)或者使用json字符串传递(一用不建议使用xml进行传递了)。这就相当麻烦了,除了涉及到数据的流式转换和流的处理外,还得考虑内存的分配等额外的情况。所以就得权衡一下利弊了。
2、进(线)程间
在多进程间,一般来说,函数间的方法都可以使用,但是要注意数据的安全性和生命周期的问题。在早期的程序中,还可以通过强制指针的转换通过二进制字节的方式传递(void*),而大家都知道,强制转换是有风险的。而如果采用内存映射等传递的话基本就是二进制字节流的形式了(很少时候可以看到以文件的形式进行传递数据,其实也是二进流的方式)。
3、库接口间
库接口间通信一般也如上面所述,但需要注意的是,库接口之间可能存在着数据类型不一致的情况,转换的一方要保证转换的准确性。
4、框架间
框架间的通信除了上面所述的情况外,大多使用的是协议,而在协议中,一般普通的数据传递都会采用Json字符串或直接传递参数,但大数据(文件、图像等)都会使用流式传递。
5、分布式通信间
分布式通信好多使用的是序列化,而序列化本质其实也是二进制流通信。二进制流的缺点导致了序列化的出现,即把对象与二进制流间进行正确的互转。同时,序列化的成本相当高。而序列化无论是自己开发还是使用框架都使得维护成本大大增加。

四、总结

杀鸡用牛刀,这是人们常说的大材小用。可还有一句话叫“狮子搏兔”,要尽全力一击。这两个都对,其实就是面对不同的场景下,开发者的选择问题。既要又要还要,那种好事儿谁都想要。结合实际情况,哪个更合适自己,就用哪个。毕竟,有的时候开发程序不单纯是一个技术问题。

http://www.lryc.cn/news/494086.html

相关文章:

  • C语言 qsort及应用
  • 【C语言】连接陷阱探秘(4):检查外部类型
  • 打造双层环形图:基础与高级渐变效果的应用
  • 【Git】Git 完全指南:从入门到精通
  • 【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset
  • 【Leecode】Leecode刷题之路第62天之不同路径
  • 基于深度学习的手势识别算法
  • helm部署golang服务
  • DreamCamera2相机预览变形的处理
  • Mysql误删表中数据与误删表的恢复方法
  • lapack、blas、solver库的区别和联系
  • deepin 安装 chrome 浏览器
  • 永久免费的PDF万能水印删除工具
  • Linux网络——NAT/代理服务器
  • 大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO,VOC,COCO格式标注,4070张图片的数据集
  • 基于Java的小程序电商商城开源设计源码
  • node.js基础学习-fs模块-文件操作(六)
  • 设计模式:11、迭代器模式(游标)
  • Oracle SCN与时间戳的映射关系
  • 【广告投放系统】头条可视化投放平台vue3+element-plus+vite落地历程和心得体会
  • Gazebo插件相机传感器(可订阅/camera/image_raw话题)
  • 华三(HCL)和华为(eNSP)模拟器共存安装手册
  • 信息学奥赛一本通 1448:【例题1】电路维修 | 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修
  • k8s删除网络组件错误
  • MySQL之JDBC
  • 音视频入门基础:MPEG2-TS专题(10)——PAT简介
  • ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏
  • Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架
  • jmeter学习(7)命令行控制
  • BGP协议路由黑洞