我正在用C启动一个附带项目,它需要由特定逻辑驱动的多个存储后端。这些存储后端将与在运行时指定使用哪个存储后端的决定相关联。
因此,例如,如果我用一组参数调用我的程序,它将在内存中执行操作,但如果我更改程序配置,它将写入磁盘。
其基本思想是每个存储后端应该实现相同的协议。换句话说,执行操作的逻辑应该知道它在哪个后端上操作。
目前,我认为提供这个间接方向的方式是有一个函数指针的struct,其逻辑调用这些函数指针。实际上,该结构将包含实现更高级别逻辑所需的所有操作,例如。
struct Context {
void (* doPartOfDoOp)(void)
int (* getResult)(void);
}
//logic.h
void doOp(Context * context) {
//bunch of stuff
context->doPartOfDoOp();
}
int getResult(Context * context) {
//bunch of stuff
return context->getResult();
} 我的问题是,如果这种解决问题的方式是一个C程序员会理解的?我是一名Java开发人员,但喜欢使用C/++。从本质上讲,上下文结构提供了一个类似于间接级的接口。不过,我想知道是否有一种较为惯用的方法来达到这个目标。
发布于 2013-10-19 09:05:08
是的,一个经验丰富的C程序员肯定会理解这样的结构。在C语言中,使用函数指针是在运行时选择要执行的一组函数中哪个函数的唯一方法。
在结构中存储函数指针的Ans给出了一个非常清楚的信号,表明这些函数属于一起,是在C中模拟方法/成员函数的一种非常常见的方法。
我建议的一个更改是将Context结构也作为函数指针的“this指针”传递,如下所示:
struct Context {
void (* doPartOfDoOp)(struct Context*)
int (* getResult)(struct Context*);
};
//logic.h
void doOp(Context * context) {
//bunch of stuff
context->doPartOfDoOp(context);
}
int getResult(Context * context) {
//bunch of stuff
return context->getResult(context);
}在C中,如果有指向结构的第一个成员的指针,则可以将该指针转换为struct类型本身,并使用它访问其他成员。这允许您构建一种继承树,并且可以为后端提供“成员变量”,如下所示:
struct FileBackend {
struct Context interface;
FILE* file;
}
void doPartOfDoOpFileBackend(struct Context* context)
{
struct FileBackend* this = (struct FileBackend)context;
// do stuff, accessing the file through this->file.
}发布于 2021-12-03 14:51:46
https://softwareengineering.stackexchange.com/questions/214894
复制相似问题