如何编写灵活的模块化程序,模块之间具有良好的交互可能性?

Pet*_*erK 8 c++ architecture modular

我在这里搜索了类似主题的答案但是找不到令人满意的答案.既然我知道这是一个相当大的话题,我会尝试更具体.

我想写一个处理文件的程序.处理是非常重要的,所以最好的方法是将不同的阶段分成独立的模块,然后根据需要使用(因为有时我只对模块A的输出感兴趣,有时我需要输出其他五个模块,等等).问题是,我需要模块合作,因为一个模块的输出可能是另一个模块的输入.我需要它快速.此外,我想避免多次执行某些处理(如果模块A创建了一些数据,然后需要由模块B和C处理,我不想运行模块A两次来创建模块B,C的输入) .

模块需要共享的信息主要是二进制数据块和/或处理文件的偏移量.主程序的任务非常简单 - 只需解析参数,运行所需的模块(也许可以给出一些输出,或者这应该是模块的任务?).

我不需要在运行时加载模块.使用带有.h文件的库并且每次有新模块或某个模块更新时重新编译程序都是完美的.模块的概念主要是因为代码可读性,维护和能够让更多的人在不同的模块上工作,而不需要有一些预定义的接口或其他任何东西(另一方面,关于如何编写的一些"指南")可能需要模块,我知道).我们可以假设文件处理是只读操作,原始文件不会更改.

有人能指出我如何在C++中做到这一点吗?任何建议都很好(链接,教程,pdf书籍......).

Rud*_*udi 3

这看起来与插件架构非常相似。我建议从(非正式)数据流程图开始来识别:

  • 这些块如何处理数据
  • 需要传输哪些数据
  • 什么结果从一个块返回到另一个块(数据/错误代码/异常)

有了这些信息,您就可以开始构建通用接口,它允许在运行时绑定到其他接口。然后我会向每个模块添加一个工厂函数,以从中请求真正的处理对象。我建议直接从模块接口获取处理对象,而是返回一个工厂对象,可以在其中检索处理对象。然后,这些处理对象用于构建整个处理链。

过于简化的轮廓如下所示:

struct Processor
{
    void doSomething(Data);
};

struct Module
{
    string name();
    Processor* getProcessor(WhichDoIWant);
    deleteprocessor(Processor*);
};
Run Code Online (Sandbox Code Playgroud)

在我看来,这些模式可能会出现:

  • 工厂函数:从模块中获取对象
  • 复合 && 装饰器:形成处理链