我在这里找到了关于类似主题的答案,但是找不到令人满意的答案.由于我知道这是一个相当大的话题,我将尝试更具体.
我想写一个处理文件的程序.处理是非常重要的,所以最好的方法是将不同的阶段分成独立的模块,然后根据需要使用(因为有时我只对模块A的输出感兴趣,有时我需要输出其他五个模块等).问题是,我需要模块合作,因为一个模块的输出可能是另一个模块的输入.我需要它快速.此外,我想避免多次执行某些处理(如果模块A创建了一些数据,然后需要由模块B和C处理,我不想运行模块A两次来创建模块B,C的输入) .
模块需要共享的信息主要是二进制数据块和/或处理文件的偏移量.主程序的任务非常简单 – 只需解析参数,运行所需的模块(也许可以提供一些输出,或者这应该是模块的任务?).
我不需要在运行时加载模块.使用带有.h文件的库并且每次有新模块或某些模块更新时重新编译程序都是完美的.模块的概念主要是因为代码可读性,维护以及能够让更多人在不同模块上工作而无需使用某些预定义接口或其他任何东西(另一方面,关于如何编写模块的一些“指南”)模块可能是必需的,我知道).我们可以假设文件处理是只读操作,原始文件不会改变.
有人能指出我如何在C中做到这一点吗?任何建议都很好(链接,教程,pdf书籍……).
解决方法
这看起来非常类似于插件架构.我建议从(非正式)数据流程图开始,以确定:
>这些块如何处理数据
>需要传输哪些数据
>什么结果从一个块返回到另一个块(数据/错误代码/异常)
使用这些信息,您可以开始构建通用接口,这些接口允许在运行时绑定到其他接口.然后我会为每个模块添加一个工厂函数,以从中请求真正的处理对象.我不建议直接从模块接口获取处理对象,而是返回可以检索处理对象的工厂对象.然后,这些处理对象用于构建整个处理链.
过于简化的轮廓将如下所示:
struct Processor { void doSomething(Data); }; struct Module { string name(); Processor* getProcessor(WhichDoIWant); deleteprocessor(Processor*); };
在我看来,这些模式可能会出现: