c++ - 几种具体方法还是一种通用方法?

标签 c++

这是我长时间查看这个精彩网页后的第一个问题。

可能我的问题有点愚蠢,但我想知道其他人对此的看法。创建多个特定方法或仅创建一个通用方法哪个更好?这是一个例子...

unsigned char *Method1(CommandTypeEnum command, ParamsCommand1Struct *params)
{
if(params == NULL) return NULL;

// Construct a string (command) with those specific params (params->element1, ...)

return buffer; // buffer is a member of the class 
}

unsigned char *Method2(CommandTypeEnum command, ParamsCommand2Struct *params)
{
...
}

unsigned char *Method3(CommandTypeEnum command, ParamsCommand3Struct *params)
{
...
}
unsigned char *Method4(CommandTypeEnum command, ParamsCommand4Struct *params)
{
...
}

unsigned char *Method(CommandTypeEnum command, void *params)
{
switch(command)
{
case CMD_1:
{
if(params == NULL) return NULL;

ParamsCommand1Struct *value = (ParamsCommand1Struct *) params;

// Construct a string (command) with those specific params (params->element1, ...)

return buffer;
}
break;

// ...

default:
break;
}
}

我不太喜欢后一个选项的主要一点是,

ParamsCommand1Struct *value = (ParamsCommand1Struct *) params;

因为“params”不能是指向“ParamsCommand1Struct”的指针,而是指向“ParamsCommand2Struct”或其他人的指针。

非常感谢您的意见!

最佳答案

一般答案

Writing Solid Code Steve Macguire 的建议是针对特定情况选择不同的函数(方法)。原因是您可以断言与特定情况相关的条件,并且可以更轻松地进行调试,因为您有更多上下文。

一个有趣的例子是标准 C 运行时的动态内存分配函数。其中大部分都是多余的,因为 realloc 实际上可以完成(几乎)您需要的所有操作。如果您有 realloc,则不需要 mallocfree。但是,当您拥有这样一个用于多种不同类型的操作的通用函数时,很难添加有用的断言,也很难编写单元测试,并且很难看到调试时发生的情况。 Macquire 更进一步并建议,realloc 不仅应该只执行 _re_allocation,而且它可能应该是两个不同的函数:一个用于增大块,另一个用于缩小块。

虽然我总体上同意他的逻辑,但有时拥有一种通用方法具有实际优势(通常当操作高度数据驱动时)。因此,我通常根据具体情况做出决定,偏向于创建非常具体的方法,而不是过于通用的方法。

具体答案

就您而言,我认为您需要找到一种方法将通用代码从细节中分离出来。 switch 通常是一个信号,表明您应该使用带有虚函数的小型类层次结构。

如果您喜欢单一方法,那么它可能应该只是更具体方法的调度程序。换句话说,switch 语句中的每种情况都只需调用相应的 Method1Method2 等。如果您希望用户仅看到通用方法,那么您可以将具体实现设为私有(private)方法。

关于c++ - 几种具体方法还是一种通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12185234/

相关文章:

c++ - Visual C++ 对 std::map 的实现

c++ - 当父进程被杀死时,使用 fork() 创建的子进程是否会自动被杀死?

c++ 如何使用用户输入的变量将二维数组传递给函数?

c# - 如何使用 MTP 从 USB 设备上传和下载数据(设备不是相机)

c++ - 什么是 “Microsoft C++ Visual Runtime Library: Runtime error!”

c++ - 将文件读入 std::vector<char> 的有效方法?

android - 意外删除后如何恢复预建文件?

c++ - 任何人都可以提供有关 rgbx8888 格式的详细解释吗?

c++ - std::unordered_map 非常高的内存使用率

c++ - 程序中不明确的指针缺陷