我目前正在学习编码(主要是C语言,但也有其他语言),现在在几个项目中我遇到过同样的“问题”:
我经常需要处理任意数据集。例如,我可能需要编写一个程序,它将以标准形式接受一定数量的命令(例如,为了示例),但是我想制作一个灵活的代码,例如,如果我来稍后回到这个项目并希望添加其他命令,我希望能够轻松完成。
我需要在代码中的某个位置手动输入这些命令的名称。我目前喜欢的一种方法是使用一个结构数组,每个元素包含一个char *作为命令的名称,一个函数指针用于负责该命令的函数。
问题是,到目前为止,我还没有完全满足我的方式实现这个数组。
我从它得到的最接近的是通过一个单身人士,每次我需要数组我只是称我的单身人士,但从那时起我就知道单身人士构成的问题基本上与全局变量一样。我已经学习了一些关于依赖注入的知识,但这是一个似乎只适用于面向对象语言的原则。
有没有办法不将单身人士用于我想用C做什么?
TL; DR: 我需要在我的代码中构建任意数据集,如何以优雅且易于维护的方式实现它?
感谢所有花时间回答的人。
示例:
我有一个程序可以监听标准输入上的命令,然后执行这些命令。 每次我读取输入时,我都会将它与预定的命令列表(以字符串形式)进行比较,然后在命令匹配时执行相应的代码。
您将如何创建字符串集?您将如何创建与每个字符串对应的函数集?你如何将两套连在一起?您如何在任何地方轻松访问这个组合集?
到目前为止,我对此的回答是:
s_cmds *singleton(void)
{
static s_cmds ret[] = {{"cmd1", &func_cmd1}, {"cmd2", &func_cmd2}, ...};
return (ret);
}
结构:
struct s_cmds {
char *cmd;
void (*func_cmd)(...);
};
这样,无论我想如何使我的代码发展,如果我想添加一个命令,我只需要在我的单例中添加一个元素,如果我想在我的代码中的其他地方访问这个数组,我只需要打电话给单身人士。但这基本上就像使用全局变量一样吗?
有没有“更清洁”的方法呢?
答案 0 :(得分:1)
您的描述非常模糊,但我认为您正在寻找X-Macros:
https://en.wikipedia.org/wiki/X_Macro
这是一个代码构造,用于将不同类型的相关代码绑定在一起。常见用例是处理错误代码及其文本表示。
答案 1 :(得分:0)
我不完全确定你的问题,但从它的声音来看,我认为你正在寻找像linked list这样的数据结构。您可以比使用常规数组更轻松地添加元素,即新命令。显然有优点或缺点,没有其他问题的知识,很难说你究竟能用什么。