我有一个名为SetParams(...)
的C函数,其参数可变。此函数设置静态数据结构(让我们将其命名为Data
)。 SetParams
与参数对一起使用,例如SetParams("paramA", paramA_value, "paramB", paramB_value)
等。也可以多次调用e.g.
SetParams("paramA", paramA_value);
SetParams("paramB", paramB_value);
...
当设置了所有'参数'后,调用另一个函数(我们将其命名为Execute
),该函数不带参数:
Execute();
// uses data from static 'Data' and performs error_handling and execution
我想知道我是否可以以面向对象的方式构建这种代码。所以,我想要一些建议,尤其是错误处理,因为一些args可能与其他args相矛盾。
答案 0 :(得分:2)
在C中创建面向对象设计的一般做法是,您将通过对结构的引用传递的每个方法,该结构用于存储所有类成员变量。换句话说,在C ++中,您拥有listObj.clear()
中的list_clear(&listObj)
。
这有点难看,但除非您想使用静态成员变量并将实现限制为仅使用一次,否则这是必要的。
在下面的示例中,请注意每个方法中如何传入对结构ParamUtilObj的引用。
// --- paramUtil.h
// Stores all the objects member variables (public and private)
struct ParamUtilObj {
int paramCnt;
char param1[25];
char param2[25];
...
};
bool paramUtil_initialize( struct* ParamUtilObj pData );
bool paramUtil_addParam( struct* ParamUtilObj pData, const char* pKey, const char* pValue );
bool paramUtil_execute( struct* ParamUtilObj pData);
关于可变方法。如果可能的话,我会尽量避免使用它们,然后一次添加一个。在我看来,验证params的业务逻辑是一个完全不同的主题。我需要更多信息来推荐最佳方法。但是......在我看来,因为你将不得不进行验证,例如if(MethodA)然后检查是否存在其他一些参数......为每个MethodType创建几个SetParam方法可能更容易可以在脚本中指定。
答案 1 :(得分:1)
我建议使用链表来存储你的参数,并将所有方法作为函数指针放到结构中。
struct MyClass {
struct LinkedList* params;
void (*setParams)(...);
void (*execute)()
}
链表是一个键值对
struct LinkedList {
struct LinkedList *next;
char * key;
char * value;
}
答案 2 :(得分:0)
我不知道你是如何实现你的SetParams的,它只是做了一点点的解析和存储,并将错误处理下游转发到Execute调用。 由于您使用的是可变长度参数,您使用的是va_ *宏吗?使用格式字符串执行此操作可能允许您将错误处理插入到SetParams调用中,并允许Execute迭代值并执行其操作。
通常,如果您有一个处理设置参数的函数,那么您应该管理与设置参数相关的错误。执行命令时遇到的错误应该在执行函数中解决。
答案 3 :(得分:0)
你不能这样做,因为在C中,可变参数函数不知道你提供的参数的数量,所以你需要以某种方式让函数知道它,比如指定params的数量作为第一个参数或使用{{1当格式字符串可以找到参数个数时。