旧项目中的重复代码删除策略
Duplicate code removal strategy in a legacy project
我最近开始做一个遗留项目。我可以看到下面格式的很多代码重复:
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
}
因此,您可以使用 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
范围块中声明为可见,并且您需要再次复制逻辑。
相关文章:
- 为什么示例代码访问IUnknown中已删除的内存
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 使用代码调整删除"comparison is always false"警告
- 如何修复我的代码以删除字符串中的空格
- 从代码中删除SAL注释是否安全
- 从文本文件中读取的代码,删除停止语,然后应用大小写折叠
- 如何从代码中删除C样式注释
- C-do{.}while(0);可以从代码中删除,不包括嵌套的if-else用法
- 为什么在我的代码中删除 ostringstream 对象会导致分段错误
- 使用 sed 从C++代码中删除异常规范
- 从 C++ 代码中删除注释,同时保留行号
- 为什么此代码不删除中间数字?
- 尝试从用户C++输入的代码中删除注释
- 使用QFile::remove()从C++代码中删除文件将留下.nfsxxxxx文件
- 如何在这个简单的代码中删除重复
- 在生产代码中删除dynamic_cast是安全的吗?
- 代码清理-删除c++中无用的文件,包括,全局变量和函数
- 我想从这段代码中删除使用命名空间std,但我不确定什么都需要用std::作为前缀
- C/C++编译器警告:是清理所有代码以删除它们,还是将它们保留在中