C / C ++插件API设计困境

时间:2013-04-02 09:54:36

标签: c++ c plugins

我正在为一个包含3个组件的解决方案设计一个C / C ++插件架构:

  1. 客户级
  2. 核心级别
  3. 可视化级别
  4. 所有这些级别都有插件与另一端的相应插件通信(即:客户端,磁盘插件与核心磁盘插件对话,可能是可视化磁盘插件,但不与核心CPU插件通信)

    现在,我想尽可能简单地创建插件,所以我提出了以下内容:插件在共享库中实现并根据请求加载,并且有一组预定义的函数,例如load ,卸载,名称等...组件加载插件共享库,查找这些函数,完成工作,卸载插件。

    现在,有一个头文件,如:

    plugin_client.h:
    
    /***************************************************************************
     *             Methods that are exposed in a client side plugin            * 
     ***************************************************************************/
    PLUGIN_LOAD_STATUS load();
    PLUGIN_UNLOAD_STATUS unload(PLUGIN_UNLOAD_REQUEST reason);
    const char* name();
    void do_work();
    

    向插件开发人员明确表示他需要实现上述功能才能将插件集成到系统的客户端组件中。

    这里开始了两难:对于核心组件插件,还应该有一个非常相似(几乎相同)的头文件,并且可视化部分也是如此。这就是问题所在:

    我该如何处理这种情况?我想到了两个解决方案:

    1. 一个用于不同组件的所有插件的公共头文件,即:plugin.h,所有可以实现的功能都在那里,带有注释,这个方法应该在客户端实现,在核心,即可视化组件中的核心。这样做的缺点是一切都在一个地方,并且许多不必要的东西正在被不感兴趣的各方看到。
    2. 在每个插件的头文件上,因此:plugin_client.hplugin_core.hplugin_vis.h和插件开发人员包含他想要的内容。插件有一个特殊的功能:int plugin_type();,如果这是一个客户端,核心或可视化插件,它将返回。这样做的缺点是重复信息。
    3. 如果您对如何优雅地解决这种困境有任何想法,请告诉我?

      谢谢,f。

1 个答案:

答案 0 :(得分:3)

没有必要重复信息。特定于类型的标头如何包含基本标头,如下所示:

<强> plugin_base.h

/***************************************************************************
 *             Methods that are exposed in a client side plugin            * 
 ***************************************************************************/
PLUGIN_LOAD_STATUS load();
PLUGIN_UNLOAD_STATUS unload(PLUGIN_UNLOAD_REQUEST reason);
const char* name();
void do_work();
int plugin_type();

<强> plugin_client.h:

#include "plugin_base.h"
void client_only_function();

其他插件类型完全相同。