【BOOST C++】组件编程(2)-- 组件的设计原理
创始人
2024-05-30 14:55:36
0

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"<

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

        在上面实现中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 
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 
#include void trace(const char *pMsg ) {cout <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_

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...