遗留项目中的重复代码删除策略
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<>
的需要,你可以将Type
设为CRTP,那将是静态多态性,一切都在编译时确定时间。
@DeiDei 嗯,TBF 这样的设计缺陷经常出现在遗留代码中。
请正确格式化您的代码块并使用实际的 c++ 语法。
【参考方案1】:
有没有更简单/优雅的方法来避免这种代码重复?
最简单的方法是将somefunc()
设为模板函数:
template <typename T>
void somefunc(arg1,arg2,T* Ptr)
//some logic
因此,您可以使用Type1
或Type2
调用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
范围块中可见,您需要再次复制逻辑。
【讨论】:
以上是关于遗留项目中的重复代码删除策略的主要内容,如果未能解决你的问题,请参考以下文章
删除 ListView 中 ArrayAdapter<String> 中的项目 [重复]