假设我有这段代码,带有2个结构和一个接受此2个结构作为参数的大函数:
typedef struct
{
int field_A;
int field2_A;
} A;
typedef struct
{
int field_B;
int field2_B;
} B;
void function_need_refactor(A *a, B *b)
{
for(i = 0; i < SIZE; i++)
{
do_something(a->field_A);
}
for(i = 0; i < SIZE; i++)
{
do_something(b->field2_B);
}
}
如何将两个for循环都替换为一个函数?我考虑过为每个结构使用void指针和标识符,但无法给出答案。有没有一种干净的方法可以重构它?还是不可能?
void refactored_function(void* my_struct, char type_identifier)
{
//code to identify the type
for(i=0; i < SIZE; i++)
{
do_something((cast)my_struct->????);
}
}
答案 0 :(得分:0)
在这里想到两个修改。首先,两个循环都依赖于相同的计数器,并且该计数器与循环主体中的项目无关...因此,从逻辑上讲,您至少应该能够做到这一点:
typedef struct
{
int field_A;
int field2_A;
} A;
typedef struct
{
int field_B;
int field2_B;
} B;
void function_need_refactor(A *a, B *b)
{
for(i = 0; i < SIZE; i++)
{
do_something(a->field_A);
do_something(b->field2_B);
}
}
但是您也许还可以重构do_something()
使其在两种情况下均可使用
typedef struct
{
int field_A;
int field2_A;
} A;
typedef struct
{
int field_B;
int field2_B;
} B;
void function_need_refactor(A *a, B *b)
{
for(i = 0; i < SIZE; i++)
{
do_something(a->field_A, b->field2_B);
}
}
那样,您总共只使用一个循环,并且该函数在每次循环迭代中都处理两个字段。