Стратегия удаления дубликата кода в устаревшем проекте - PullRequest
0 голосов
/ 25 декабря 2018

Я недавно начал работать над устаревшим проектом.Я мог видеть много дублирования кода в формате ниже:

void somefunc(arg1,arg2,Type1 * Ptr) 
{
      //some logic
}

// перегружен на Type2

void somefunc(arg1,arg2,Type2 * Ptr) 
{
         //same logic
}

Единственная разница между этими двумя функциями - тип третьего аргумента . Тип1 и Тип2 являются производными от Тип .

Тип определяется во время выполнения.Итак, я попробовал что-то вроде этого

void somefunc(arg1,arg2,Type * Ptr) 
{
    if (arg1.version > 14) 
        Type1 *ptr = dynamic_cast<Type1*>(Ptr);
    else
        Type2 *ptr = dynamic_cast<Type2*>(Ptr);

    //some logic using ptr
}

Но для определения правильного типа во время выполнения требуется dynamic_cast.И я должен обновить код во многих местах с помощью блоков if else.

Вариант Thought of Boost.Это похоже на описанный выше подход.

Есть ли более простой / элегантный способ избежать такого рода дублирования кода?

1 Ответ

0 голосов
/ 25 декабря 2018

Есть ли более простой / элегантный способ избежать такого рода дублирования кода?

Самый простой подход - сделать somefunc() функцией шаблона:

template <typename T>
void somefunc(arg1,arg2,T* Ptr) 
{
      //some logic
}

Таким образом, вы можете вызвать somefunc() с Type1 или Type2 без необходимости определять их с помощью dynamic_cast<>:

Type1 a;
Type2 b;

somefunc(x,y,&a); // Uses Type1
somefunc(x,y,&b); // Uses Type2

Тип определяется во время выполнения.Поэтому я попробовал что-то вроде этого

void somefunc(arg1,arg2,Type * Ptr) 
{
    if (arg1.version > 14) 
        Type1 *ptr = dynamic_cast<Type1*>(Ptr);
    else
        Type2 *ptr = dynamic_cast<Type2*>(Ptr);

    //some logic using ptr
}

Это не может сработать, так как ptr объявлен видимым только в блоках контекста if / else, и вам нужноповторить логику снова.

...