【问题标题】:How to refactor a function with different struct pointers as parameters?如何重构具有不同结构指针作为参数的函数?
【发布时间】:2020-06-19 18:00:00
【问题描述】:

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

【问题讨论】:

  • 这个例子似乎有点做作,所以我不确定我是否理解这样做的动机。在上面的示例中,您可以轻松地将主体连接到一个循环中,这似乎比切换两个不同的结构要干净得多,假设您只有 2 个。
  • 它总是一个只包含整数的结构吗?

标签: c pointers struct refactoring void


【解决方案1】:

这里想到了两个修改。首先,两个循环都依赖于同一个计数器,并且计数器独立于循环体中的项目......因此,从逻辑上讲,您至少应该能够做到这一点:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2011-04-15
    • 2021-01-25
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多