1

我有一个以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

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

4

4 回答 4

2

在 C 中创建面向对象设计的一般做法是,对于您拥有的每个方法,您都将传入对用于存储所有类成员变量的结构的引用。换句话说,在 C++ 中,你会listObj.clear()在 C 中拥有你 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);

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

于 2009-10-05T21:07:14.240 回答
1

我建议使用链表来存储您的参数并将所有方法作为指向结构的函数指针。

struct MyClass {
  struct LinkedList* params;
  void (*setParams)(...);
  void (*execute)()
}

链表将是一个键值对

struct LinkedList {
   struct LinkedList *next;
   char * key;
   char * value;
}
于 2009-08-11T12:54:33.163 回答
0

我不知道您是如何实现 SetParams 的,从声音上看,它只是进行了一点解析和存储,并将错误处理向下游转发到 Execute 调用。由于您使用的是可变长度参数,您是否使用 va_* 宏?使用格式字符串这样做可能允许您将错误处理插入到您的 SetParams 调用中,并允许 Execute 仅迭代值并执行其操作。

通常,如果您有一个处理设置参数的函数,那么您应该在其中管理与设置参数相关的错误。在执行命令时遇到的错误应该在执行函数中解决。

于 2009-08-11T13:14:46.953 回答
0

你不能这样做,因为在 C 中,可变参数函数不知道你提供的参数的数量,所以你需要以某种方式让函数知道它,比如指定参数的数量作为第一个参数或使用printf方式,当参数的数量可以从格式字符串中找到。

于 2009-08-11T13:35:36.820 回答