【发布时间】:2015-10-19 10:47:09
【问题描述】:
我声明了几个包含不同数据的struct。我还有一个对应于这些结构的enum。我的代码中有几个地方需要访问有关结构的信息,并且我正在通过枚举进行操作。这导致返回此信息的 switch 语句很少。
我已将这些 switch 语句包含在它们自己的函数中,以便尽可能重复使用。这导致了三个看起来非常相似的函数。
示例伪代码:
#include <stdio.h>
typedef struct
{
int varA;
char varB;
} A;
typedef struct
{
int varA;
int varB;
int varC;
} B;
typedef struct
{
int varA;
short varB;
} C;
typedef enum { structA, structB, structC } STRUCT_ENUM;
int returnSize(STRUCT_ENUM structType)
{
int retVal = 0;
switch(structType)
{
case structA:
retVal = sizeof(A);
break;
case structB:
retVal = sizeof(B);
break;
case structC:
retVal = sizeof(C);
break;
default:
break;
}
return retVal;
}
void printStructName(STRUCT_ENUM structType)
{
switch(structType)
{
case structA:
printf("Struct: A\r\n");
break;
case structB:
printf("Struct: B\r\n");
break;
case structC:
printf("Struct: C\r\n");
break;
default:
break;
}
}
void createDataString(STRUCT_ENUM structType, char* output, unsigned char* input)
{
switch(structType)
{
case structA:
{
A a = *(A*)input;
sprintf(output, "data: %d, %d", a.varA, a.varB);
break;
}
case structB:
{
B b = *(B*)input;
sprintf(output, "data: %d, %d, %d", b.varA, b.varB, b.varC);
break;
}
case structC:
{
C c = *(C*)input;
sprintf(output, "data: %d, %d", c.varA, c.varB);
break;
}
default:
break;
}
}
int main(void) {
char foobar[50];
printf("Return size: %d\r\n", returnSize(structA));
printStructName(structB);
C c = { 10, 20 };
createDataString(structC, foobar, (unsigned char*) &c);
printf("Data string: %s\r\n", foobar);
return 0;
}
这些免费函数基本上包含相同的switch,但在case 中放置了不同的代码。使用此设置,添加新结构和枚举值会导致代码中的三个位置需要更改。
问题是:有没有办法将其重构为更易于维护的东西?额外的限制是代码是用 C 编写的。
编辑:在线示例:http://ideone.com/xhXmXu
【问题讨论】:
-
这不能在 C 中编译。
A、B和C是什么?这些名称未声明。 C 确实有“对象”。 -
@Olaf 它只是显示想法的伪代码,而不是整个代码。没有类的情况下,C 怎么有对象?
-
port70.net/~nsz/c/c11/n1570.html#3.15 你也可以在 C 中做 OOP。
-
@Olaf 编辑了问题并添加了工作实现。不过,这个问题更具理论性。
标签: c refactoring