我现在需要重构一份C语言的代码,现有的代码每次增加新的写入字段,都需要在switch中增加一个case,以及增添对应的read和set方法,我需要如何抽象出接口?使得无需每次需要增添新的代码?请写一个例子示意。
时间: 2024-02-23 20:59:27 浏览: 16
好的,针对你的问题,我给出以下的解决方案。
首先,我们可以将每个字段抽象为一个结构体,包含字段名、字段值和读写方法。然后,我们可以将所有的字段放入一个数组中,这样就可以通过索引来访问对应的字段。
接下来,我们可以定义一个通用的读取和设置字段值的函数,它可以根据传入的字段名来查找对应的字段,并调用对应的读写方法来修改或读取字段值。
下面是一个示例代码:
```c
#include <stdio.h>
#include <string.h>
// 字段结构体
typedef struct {
char *name; // 字段名
int value; // 字段值
void (*set)(int); // 设置值的方法
int (*get)(); // 获取值的方法
} Field;
// 定义字段数组
Field fields[] = {
{"field1", 0, setField1, getField1},
{"field2", 0, setField2, getField2},
{"field3", 0, setField3, getField3},
// 可以继续添加更多的字段
};
// 通用的读取和设置字段值的函数
void setFieldValue(char *name, int value) {
int i;
for (i = 0; i < sizeof(fields) / sizeof(fields[0]); i++) {
if (strcmp(fields[i].name, name) == 0) {
fields[i].set(value);
return;
}
}
printf("Error: field %s not found!\n", name);
}
int getFieldValue(char *name) {
int i;
for (i = 0; i < sizeof(fields) / sizeof(fields[0]); i++) {
if (strcmp(fields[i].name, name) == 0) {
return fields[i].get();
}
}
printf("Error: field %s not found!\n", name);
return -1;
}
// 实现具体的字段读写方法
void setField1(int value) {
fields[0].value = value;
}
int getField1() {
return fields[0].value;
}
void setField2(int value) {
fields[1].value = value;
}
int getField2() {
return fields[1].value;
}
void setField3(int value) {
fields[2].value = value;
}
int getField3() {
return fields[2].value;
}
int main() {
setFieldValue("field1", 10);
setFieldValue("field2", 20);
setFieldValue("field3", 30);
printf("field1 = %d\n", getFieldValue("field1"));
printf("field2 = %d\n", getFieldValue("field2"));
printf("field3 = %d\n", getFieldValue("field3"));
return 0;
}
```
在这个示例代码中,我们定义了三个字段,每个字段都有一个对应的读写方法。我们通过将所有的字段放入一个数组中,来实现通用的读写方法。这样,当需要添加新的字段时,只需要在数组中添加一个新的结构体即可,无需修改其他代码。
希望这个示例代码可以对你有所帮助!