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

【BOOST C++】组件编程(2)-- 组件的设计原理

GitHub - ros2/demos at foxy

一、说明

        为了研究ROS2的组件编程,首先要理解如何何为组件。组件本是微软的发明物体,但是在ubuntu上需要自己从底层实现,就说ROS2不用你写,但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的理论为线索,一点一点实现它们的示例,以达到理解的目的。

二、为什么要有组件?

        理解组件编程,需要回顾程序软件的历史,在历史上,软件是逐步老化,淘汰的过程,每当就的软件过时了,就需要重新开发。这种开发是重头走一回。但是,在软件的逐步淘汰过程中,它是某些局部环节不能满足需求,并不是全部环节一起老化,因而,只需要局部升级就可以继续使用,那么,如何实现,组件就成了针对的专门设计。

        组件设计是一种隔离的思路,是将应用程序、接口、接口实现分开进行设计的。如图:

  •         1 接口规定形式,组件实现内容
  •         2 一个组件可以有多接口。
  •         3 多个组件可以有共同的接口,但接口的内容各自组件,各自规定。
  •         4 接口定义好一般就不改了。需要新功能时可以追加接口、追加组件。
  •         5 由于组件内实现了接口,接口生存周期要长于组件。

 

        客户端调用组件

         以上模式至少实现了:

  • 客户端和组件分隔
  • 组件和接口分割
  • 接口和接口实现分隔
  • 各自维护互不影响

三、接口实现原理

        接口的实现原理:

class IX{                       //first interface
public:virtual void Fx1()=0;virtual void Fx2()=0;
};class Iy{                        //second interface
public:virtual void Fy1()=0;virtual void Fy2()=0;
};class CA:public Ix,public Iy{public:virtual void Fx1(){ cout<<"Fx1"<<enl;}virtual void Fx2(){ cout<<"Fx2"<<enl;}virtual void Fy1(){ cout<<"Fy1"<<enl;}virtual void Fy2(){ cout<<"Fy2"<<enl;}      
};

        以上代码是个比喻,是展现实现的效果,至于如何实现,下面的设计更巧。 

        在上面实现中Ix和Iy是实现接口的纯抽象类。该类内部仅仅包含纯虚函数,这个函数仅仅用来指针占位,并无实质的实现。

        为了实现纯虚函数的实体,在组件CA中继承两个接口Ix和Iy,在CA中实现了虚函数的集体化。可以将抽象类看成是空的表单,在派生类(CA)中实现表单填写。

 四、实质的接口定义

4.1 首先定义一个接口符号

        在objbase.h中,定义了一个interface的名词术语。

    #define interface struct

        注意:这里interface定义成struct,是因为在struct内的成员全部是public无需特殊生命

4.2 更真实的接口定义

#ifndef __OBJBASE__
#define __OBJBASE__#include <objbase.h>
interface IX{                       //first interfacevirtual void Fx1()=0;virtual void Fx2()=0;
};interface Iy{                        //second interfacevirtual void Fy1()=0;virtual void Fy2()=0;
};#endif

 4.3 一个实例

ca.cpp


#include <istream.h>
#include <objbase.h>void trace(const char *pMsg ) {cout <<pMsg <<endl;}interface IX{                       //first interfacevirtual void Fx1()=0;virtual void Fx2()=0;
};interface Iy{                        //second interfacevirtual void Fy1()=0;virtual void Fy2()=0;
};class CA:public Ix,public Iy{public:virtual void Fx1(){ cout<<"CA::Fx1"<<enl;}virtual void Fx2(){ cout<<"CA::Fx2"<<enl;}virtual void Fy1(){ cout<<"CA::Fy1"<<enl;}virtual void Fy2(){ cout<<"CA::Fy2"<<enl;}      
};int main(){CA *pA = new CA;
trace("this is client call component ");
Ix *pIx = pA;trace("client: use the Ix interface");
pIx->Fx1();
pIx->Fx2();
trace("client: use the Iy interface");
pIy->Fy1();
pIy->Fy2();
trace("client:delete  interface");delete pA;
return 0;
}

输出: 

this is client call component
client: use the Ix interface
CA::Fx1
CA::Fx2
client: use the Iy interface
CA::Fy1
CA::Fy2
client:delete  interface

五、结论

        客户端调用组件,组件调用接口,接口调用接口的实现,每一步都有一个节点环节,这样就使得【客户端】与【接口实现】这两个实质性的程序不产生关系,达到独立维护的目的。

        当客户程序和组件在一个源文件中时,并无必要将其分开。但当客户和组件是在动态链接库中时,此种隔离是必须的。下章将进一步隔离抽象,让客户端不再使用CA的指针。

参考资料

 [转]C/C++:构建你自己的插件框架 - Merlin-magic - 博客园 (cnblogs.com)

COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM_

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

相关文章:

  • 基于单细胞多组学数据无监督构建基因调控网络
  • 蓝桥杯-最优清零方案(2022省赛)
  • Mac免费软件下载网站推荐(最全免费,替代MacWk)
  • GPU是什么
  • 20230305学习计划
  • SocketCan 应用编程
  • 从零学习python - 04函数方法与返回值
  • MySQL实战之事务到底是隔离的还是不隔离的
  • Elasticsearch:理解 Master,Elections,Quorum 及 脑裂
  • 【致敬女神】HTMLReport应用之Unittest+Python+Selenium+HTMLReport项目自动化测试实战
  • JAVA的16 个实用代码优化小技巧
  • 并发编程的三大挑战之原子性及其解决方案
  • QML动画(其他的动画)
  • Spark 配置项
  • 掌握Vue3模板语法,助你轻松实现高效Web开发
  • Jmeter+Ant+Jenkins接口自动化测试平台搭建
  • ncnn部署(CMakelists.txt)
  • SQL分库分表
  • 大数据分析案例-基于逻辑回归算法构建微博评论情感分类模型
  • 0105深度优先搜索算法非递归2种实现对比-无向图-数据结构和算法(Java)
  • 传统手工数据采集耗时耗力?Smartbi数据填报实现数据收集分析自动化
  • 《Spring源码深度分析》第5章 Bean的加载
  • 华为OD机试真题Java实现【求最大数字】真题+解题思路+代码(20222023)
  • Java——异常机制
  • 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(下)
  • ESP32设备驱动-土壤湿度传感器驱动
  • 公网远程连接MongoDB数据库【内网穿透】
  • SQL注入——floor报错注入
  • P6入门:在EPS下创建项目(P6Professional)
  • Linux安装及管理应用和账号和权限管理 讲解