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

Posted

技术标签:

【中文标题】遗留项目中的重复代码删除策略【英文标题】:Duplicate code removal strategy in a legacy project 【发布时间】:2018-12-25 12:05:48 【问题描述】:

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

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

Boost 变体的想法。看起来和上面的方法差不多。

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

【问题讨论】:

如果你有多态类,你需要用dynamic_cast进行区分,也许你的设计是错误的。您可以在问题中添加示例声明。 你也可以避免对dynamic_cast&lt;&gt; 的需要,你可以将Type 设为CRTP,那将是静态多态性,一切都在编译时确定时间。 @DeiDei 嗯,TBF 这样的设计缺陷经常出现在遗留代码中。 请正确格式化您的代码块并使用实际的 c++ 语法。 【参考方案1】:

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

最简单的方法是将somefunc() 设为模板函数:

template <typename T>
void somefunc(arg1,arg2,T* Ptr) 

      //some logic

因此,您可以使用Type1Type2 调用somefunc(),而无需使用dynamic_cast&lt;&gt; 确定这些:

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 范围块中可见,您需要再次复制逻辑。

【讨论】:

以上是关于遗留项目中的重复代码删除策略的主要内容,如果未能解决你的问题,请参考以下文章

删除 ListView 中 ArrayAdapter<String> 中的项目 [重复]

浅议.NET遗留应用改造

如何在perl中删除哈希值中的重复值?

将项目添加到列表时,python 中的奇怪问题是删除 \xa0 和其他编码[重复]

使用 LINQ 删除列表中的项目 [重复]

从Python列表中的特定位置删除项目[重复]