c - C 中参数数量可变的函数和面向设计的问题

标签 c design-patterns variadic-functions

我有一个名为 SetParams(...) 的 C 函数,它具有可变数量的参数。该函数建立了一个静态数据结构(我们将其命名为Data)。 SetParams 与参数对一起使用,例如SetParams("paramA", paramA_value, "paramB", paramB_value)等也可以多次调用,例如

SetParams("paramA", paramA_value);
SetParams("paramB", paramB_value);
...

设置完所有“参数”后,将调用另一个不带参数的函数(让我们将其命名为Execute):

Execute();
// uses data from static 'Data' and performs error_handling and execution

我想知道我是否可以以更面向对象的方式构建这种代码。因此,我需要一些建议,尤其是关于错误处理的建议,因为某些参数对可能与其他参数相矛盾。

最佳答案

在 C 中创建面向对象设计的一般做法是,对于您拥有的每个方法,您都将传递对用于存储所有类成员变量的结构的引用。换句话说,在 C++ 中你有 listObj.clear() 你在 C 中有 list_clear(&listObj)

这有点丑陋,但这是必要的,除非您想使用静态成员变量并将实现限制为仅使用一次。

在下面的示例中,请注意每个方法中如何传入对 struct 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);

关于可变参数方法。如果可能的话,我会尽量避免使用它们,一次只添加一个。在我看来,验证参数的业务逻辑是一个完全不同的话题。我需要更多信息来推荐最佳方法。但是......在我看来,因为你将不得不进行验证,例如 if( MethodA ) 然后检查是否存在其他参数......为用户的每个 MethodType 创建多个 SetParam 方法可能更容易可以在脚本中指定。

关于c - C 中参数数量可变的函数和面向设计的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1260109/

相关文章:

使用指针将 Integer 逐位转换为动态分配的 Char 数组

scala - 在 Scala 中将 Seq[T] 作为可变参数传递

ruby-on-rails - rails : replacing try with the Null Object Pattern

使用 va_list 调用 printf

mips - 可变参数在 mips 中工作

c - 让用户定义数组的大小

c - 从 fgets() 输入中删除换行符

c - 在 C 中将 time_t 设置为下一个晚上 10 点?

design-patterns - 服务层类是否违反了 SRP 原则?

java - 对 Web 服务客户端隐藏数据对象结构和字段