Как реорганизовать функцию с различными указателями структур в качестве параметров? - PullRequest
0 голосов
/ 07 марта 2020

Предположим, у меня есть этот кусок кода с 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 голосов
/ 07 марта 2020

Здесь на ум приходят две модификации. Прежде всего, оба цикла полагаются на один и тот же счетчик, и счетчик не зависит от элементов в теле l oop ... Таким образом, логически вы должны хотя бы сделать это:

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

Таким образом, вы используете только одну l oop сумму, и функция обрабатывает оба поля на каждая л oop итерация.

...