标签: refactoring

如何处理"签名/未签名的不匹配"警告(C4018)?

我使用大量用C++编写的计算代码,考虑到高性能和低内存开销.它大多使用STL容器vector,并且几乎在每个函数中遍历那些容器.

迭代代码如下所示:

for (int i = 0; i < things.size(); ++i)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但它会产生签名/未签名的不匹配警告(Visual Studio中的C4018).

替换int某种unsigned类型是一个问题,因为我们经常使用OpenMP pragma,它需要计数器int.

我即将压制(数百个)警告,但我担心我错过了一些优雅的解决方案.

在迭代器上.我认为在适当的地方应用迭代器很棒.我正在使用的代码永远不会将随机访问容器更改为list某种东西(因此迭代int i已经是容器不可知),并且总是需要当前索引.您需要键入的所有其他代码(迭代器本身和索引)只会使问题复杂化并模糊底层代码的简单性.

c++ refactoring

71
推荐指数
5
解决办法
9万
查看次数

如何使数据绑定类型安全并支持重构

当我希望将控件绑定到我的对象的属性时,我必须提供属性的名称作为字符串.这不是很好,因为:

  1. 如果删除或重命名该属性,我不会收到编译器警告.
  2. 如果使用重构工具重命名该属性,则很可能不会更新数据绑定.
  3. 如果属性的类型错误,我在运行时之前不会收到错误,例如将整数绑定到日期选择器.

是否有一个设计模式可以解决这个问题,但仍然易于使用数据绑定?

(这是WinForm,Asp.net和WPF中的一个问题,很可能是很多其他系统)

我现在已经找到了" C#中的nameof()运算符的变通方法:typesafe databinding ",它也是解决方案的一个很好的起点.

如果您在编译代码后愿意使用后处理器,那么notifypropertyweaver非常值得关注.


当绑定在XML而不是C#中完成时,任何人都知道WPF的良好解决方案吗?

.net c# data-binding refactoring type-safety

69
推荐指数
4
解决办法
2万
查看次数

在IntelliJ中重新排序Java类方法的简单方法?

有没有比在IntelliJ中的类源文件中重新排序方法更简单的方法,而不是手动剪切和粘贴代码?现在我经常在重构遗留代码时需要这个,例如在源代码中移动相关的方法.

在Eclipse AFAIK中,有一个类似于IntelliJ的Structure视图的视图,我可以在其中拖放方法.但是,这在IntelliJ中不起作用,我也无法从其帮助中找到任何提示.

我使用IntelliJ 9.0.2是具体的.

java methods refactoring intellij-idea

69
推荐指数
5
解决办法
2万
查看次数

如何在Eclipse中快速实现/覆盖方法?

如果我想覆盖一些方法,我现在右键单击类名,选择"Source" - >"Override/impl ...".

是否有快捷方式或其他方式在Eclipse中更快地完成此操作?

java eclipse ide refactoring keyboard-shortcuts

68
推荐指数
7
解决办法
7万
查看次数

用C++ 11重构

鉴于c ++许多程序员提供的新工具集,旨在实现代码简化,表达性,效率,浏览旧代码并进行调整(有些无意义,有些成功)以实现他们的目标.尽管不要在这些工作上浪费太多时间,只是做出非侵入性和自包含的变化,但最佳做法是什么?

让我勾勒出明显的:

  • 使用auto运行基于迭代器的循环:

    for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;     
    ++it);
    // becomes
    for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用tie来进行多个赋值,这些赋值只产生C风格的代码行(如何一次将多个值分配到结构中?)

    a = 1;
    b = 2; 
    c = 3;
    d = 4; 
    e = 5;
    // becomes
    std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
    
    Run Code Online (Sandbox Code Playgroud)
  • 要使类不可继承,只需将其声明为"final"并删除实现此类行为的代码http://www.parashift.com/c++-faq/final-classes.html

  • 使用delete关键字显式隐藏构造函数/析构函数,而不是将它们声明为私有(例如,用于创建基于堆的对象的代码,不可复制的对象等)

  • 创建简单的仿函数只是为了将单个STL算法的执行变为lambda函数(除了减少代码混乱,你还能保证内联调用)

  • 仅使用智能指针简化对象的RAII包装

  • 摆脱bind1st,bind2nd只需使用bind

  • <type_traits>提供的标准代码替换类型特征的手写代码(Is_ptr_but_dont_call_for_const_ptrs <>等:))

  • 停止包含现在在STL中实现的函数的boost标头(BOOST_STATIC_ASSERT vs static_assert)

  • 为类提供移动语义(虽然这不符合脏/快/易更改的条件)

  • 在可能的情况下使用nullptr而不是NULL宏,并删除填充指针的容器的代码,其中0已转换为对象类型

    std::vector<foo*> …
    Run Code Online (Sandbox Code Playgroud)

c++ refactoring c++11

68
推荐指数
9
解决办法
5120
查看次数

在现代C和C++中不推荐使用f(void)

我目前正在重构/整理C++项目中使用的一些旧C代码,并定期查看以下函数:

int f(void)
Run Code Online (Sandbox Code Playgroud)

我倾向于写作:

int f()
Run Code Online (Sandbox Code Playgroud)

是否有任何理由不在整个代码库中用()替换(void)以提高一致性,或者两者之间是否存在我不知道的细微差别?更具体地说,如果C++中的虚拟成员函数被描述为:

virtual int f(void)
Run Code Online (Sandbox Code Playgroud)

派生类包括成员函数:

int f()
Run Code Online (Sandbox Code Playgroud)

这是一个有效的覆盖?另外,基于几乎相同的签名,我是否可能遇到任何链接器问题?

c c++ refactoring void

67
推荐指数
3
解决办法
1万
查看次数

您为Python使用了哪些重构工具?

我有一堆我要重命名的课程.其中一些名称很小,名称在其他类名称中重复使用,我不希望更改名称.其中大部分都存在于Python代码中,但我们也有一些引用类名的XML代码.

简单的搜索和替换只能让我到目前为止.在我的情况下,我想将AdminAction重命名为AdminActionPlug和AdminActionLogger为AdminActionLoggerPlug,因此第一个的搜索和替换也会错误地击中第二个.

有没有人有Python重构工具的经验?如果他们也可以修复XML文档中的类名,则可以获得奖励积分.

python refactoring

66
推荐指数
4
解决办法
3万
查看次数

Visual Studio:是否有"移动类到不同的命名空间"重构?

我正在做一些架构清理,涉及将一堆类移动到不同的项目和/或命名空间.目前我正在手动移动文件,构建,然后根据需要手动添加使用Foo语句来解决编译错误.有人知道这样做的更聪明的方法吗?(我们是CodeRush和Refactor!商店,但我很想知道Resharper是否支持这个)

refactoring visual-studio

66
推荐指数
5
解决办法
4万
查看次数

如果我在我的C++项目中使用C-Style强制转换,是否值得重构C++强制转换?

我在15K LOC C++项目中使用C风格的强制转换,90%的时间用于子类和基类之间的强制转换.

即使我读到使用它们是不好的,并且它们可能导致严重的错误,因为它们不像C++演员那样安全,我仍然觉得使用它们非常精细和舒适.

到目前为止,我没有遇到过我的项目中的一个错误,例如,一个意外错误的C-Style演员 - 真的.

我没有使用它们有两个主要原因:

  • 我对他们还不太了解
  • 我不喜欢他们的语法,他们更冗长,更难为我阅读

我的问题:

  • (为什么)我应该重构我的项目以使用C++风格的演员表吗?
  • 为什么我应该在未来的项目中使用C++风格的演员表?

我使用C++为我提供的所有其他优点,包括虚拟和抽象基类,命​​名空间,STL等,而不是新的类型转换语法." 你为什么不只是使用C呢? " 这个论点对我来说不起作用.

c++ refactoring casting

65
推荐指数
4
解决办法
5569
查看次数

在Rails应用程序中查找未使用的代码

如何找到生产中正在运行的代码?

该应用程序经过了充分测试,但有很多测试可以测试未使用的代码.因此,他们在运行测试时得到报道......我想重构和清理这个烂摊子,它不断浪费我的时间.我有很多背景工作,这就是为什么我想要制作环境来指导我.在heroku运行我可以旋转dynos以补偿探查器对性能的影响.

相关问题如何在Ruby应用程序中找到未使用的方法?没有用.

额外奖励:用于显示运行代码行的频率的指标.不知道为什么我想要它,但我做到了!:)

ruby refactoring code-coverage ruby-on-rails

65
推荐指数
5
解决办法
2万
查看次数