旧项目中的重复代码删除策略

Duplicate code removal strategy in a legacy project

本文关键字:代码 码删除 策略 项目      更新时间:2023-10-16

我最近开始做一个遗留项目。我可以看到下面格式的很多代码重复:

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

在 Type2 上重载

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

这两个函数之间的唯一区别是 第三个论点Type1 和 Type2 派生自 Type

类型在运行时确定。所以我尝试了这样的事情

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来确定运行时的正确类型。而且我必须在很多地方更新代码,如果其他块。

想到了提升变体。它似乎与上述方法类似。

有没有更简单/优雅的方法来避免这种代码重复?

有没有更简单/优雅的方法来避免这种代码重复?

最简单的方法是将somefunc()做成一个模板函数:

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

因此,您可以使用 Type1Type2 调用 somefunc(),而无需使用 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范围块中声明为可见,并且您需要再次复制逻辑。