如何重构具有不同结构指针作为参数的函数?

时间:2020-03-07 01:23:53

标签: c pointers struct refactoring void

假设我有这段代码,带有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->????);
  }
}

1 个答案:

答案 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);
  }
}

那样,您总共只使用一个循环,并且该函数在每次循环迭代中都处理两个字段。

相关问题