标签: refactoring

任何基于libclang的C/C++重构工具?(即使是最简单的"玩具示例")

正如我已经指出的那样 - 在这里 - 似乎clang的libclang应该非常适合实现C/C++代码分析和修改(查看视频演示和幻灯片)这样的艰巨任务.

你知道任何基于libclang的C/C++重构工具吗?

"任何"包括甚至简单的alpha状态项目,支持一种重构技术.它可以没有预处理器支持.作为功​​能上我正在谈论的一个例子:更改方法名称,它是否支持多个文件或一次只支持一个文件.您可能想知道要求甚至是小工作示例的目标是什么我的想法是创建一个代码示例列表和一个位置的小工具将提供更好的资源来学习如何使用libclang实现重构.我相信,从简单的项目可能会以适当的开源方式成长更大的项目:).

c++ refactoring llvm clang

47
推荐指数
6
解决办法
1万
查看次数

检测重复代码的工具(Java)

我在一个项目中,以前的程序员一直在复制粘贴代码.这些代码实际上是相同的(或非常相似),它们可以重构为一个.

我花了无数个小时手动重构这些代码,但我认为必须有更好的方法.有些是非常简单的静态方法,可以被移动到祖先类中(但是被以前的初级程序员复制粘贴).

是否有代码分析工具可以检测到这一点并提供报告/建议?如果可能的话,我更喜欢免费/开源工具.

java refactoring code-analysis

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

如何在Intellij Idea中提取私有静态常量?

要提取常量,我可以使用ctrl+ alt+ c,即"提取"创建公共常量:

public static final String CONST = "123";
Run Code Online (Sandbox Code Playgroud)

所以我需要手动键入private.有没有办法默认使用私有范围提取常量?

java refactoring keyboard-shortcuts const intellij-idea

45
推荐指数
1
解决办法
7343
查看次数

Python:避免关于太多参数的pylint警告

我想将一个大的Python函数重构为较小的函数.例如,请考虑以下代码段:

x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
Run Code Online (Sandbox Code Playgroud)

当然,这是一个微不足道的例子.在实践中,代码更复杂.我的观点是它包含许多必须传递给提取函数的局部范围变量,它们可能如下所示:

def mysum(x1, x2, x3, x4, x5, x6, x7, x8, x9):
    x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
    return x
Run Code Online (Sandbox Code Playgroud)

问题是pylint会触发有关太多参数的警告.做以下事情可以避免警告:

def mysum(d):
    x1 = d['x1']
    x2 = d['x2']
    ...
    x9 = d['x9']
    x = x1 + x2 + x3 + x4 + x5 + x6 + x7 …
Run Code Online (Sandbox Code Playgroud)

python refactoring pylint

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

应该测试内部实现,还是仅测试公共行为?

给定软件......

  • 该系统由几个子系统组成
  • 每个子系统由几个组件组成
  • 每个组件都使用许多类实现

...我喜欢编写每个子系统或组件的自动化测试.

我没有为组件的每个内部类编写测试(因为每个类都有助于组件的公共功能,因此可以通过组件的公共API从外部测试/测试).

当我重构组件的实现时(我经常这样做,作为添加新功能的一部分),因此我不需要改变任何现有的自动化测试:因为测试仅依赖于组件的公共API和公共API通常是扩大而不是改变.

我认为这个政策与重构测试代码这样的文件形成了鲜明的对比,后者说...

  • "......单元测试..."
  • "......系统中每个班级的测试班......"
  • "......测试代码/生产代码比率...理想地被认为接近1:1的比例......"

...所有这些我认为我不同意(或至少不练习).

我的问题是,如果你不同意我的政策,你会解释原因吗?在什么情况下这种测试程度不足?

综上所述:

  • 公共接口经过测试(并经过重新测试),很少改变(它们被添加到但很少被改变)
  • 内部API隐藏在公共API之后,可以在不重写测试公共API的测试用例的情况下进行更改

脚注:我的一些"测试用例"实际上是作为数据实现的.例如,UI的测试用例包含数据文件,其中包含各种用户输入和相应的预期系统输出.测试系统意味着拥有测试代码,该代码读取每个数据文件,将输入重放到系统中,并断言它获得相应的预期输出.

虽然我很少需要更改测试代码(因为公共API通常是添加而不是更改),但我发现有时候(例如每周两次)需要更改一些现有的数据文件.当我更好地更改系统输出(即新功能改进现有输出)时可能会发生这种情况,这可能导致现有测试"失败"(因为测试代码只会尝试断言输出没有改变).要处理这些情况,我会执行以下操作:

  • 重新运行自动化测试套件,该套件有一个特殊的运行时标志,告诉它不要断言输出,而是将新输出捕获到新目录中
  • 使用可视化差异工具查看哪些输出数据文件(即哪些测试用例)已更改,并验证这些更改是否正常并且符合新功能的预期
  • 通过将新目录中的新输出文件复制到运行测试用例的目录(覆盖旧测试)来更新现有测试

脚注:通过"组件",我的意思是"一个DLL"或"一个组件"...这个大到足以在系统的体系结构或部署图上可见,通常使用数十个或100个类实现,以及因此与公共API只包含约1或接口少数......一些可能被分配到的开发商之一的团队(其中不同的组件被分配到不同的团队),并且将根据康威定律有一个相对稳定的公共API.


脚注:文章面向对象测试:神话与现实说,

神话:黑盒测试就足够了. 如果您使用类接口或规范仔细测试测试用例设计,则可以确保该类已经完全运用.白盒测试(查看方法的实现来设计测试)违反了封装的概念.

现实:OO结构很重要,第二部分.许多研究表明,开发人员认为黑盒测试套件非常彻底,只能在测试实施中使用三分之一到一半的语句(更不用说路径或状态)了.这有三个原因.首先,选择的输入或状态通常执行正常路径,但不强制所有可能的路径/状态.其次,单独的黑盒测试无法揭示惊喜.假设我们已经测试了被测系统的所有指定行为.为了确信没有未指明的行为,我们需要知道系统的任何部分是否未被黑盒测试套件执行.获取此信息的唯一方法是通过代码检测.第三,通常很难在不检查源代码的情况下执行异常和错误处理.

我应该补充一点,我正在进行白盒功能测试:我看到了代码(在实现中),我编写了功能测试(驱动公共API)来练习各种代码分支(功能实现的细节).

refactoring integration-testing automated-tests unit-testing code-coverage

44
推荐指数
4
解决办法
1万
查看次数

Eclipse:最有用的重构

我不时地使用Eclipse重构功能.有些技术比其他技术更明显,有些我从未尝试过.

什么重构对您最有用,为什么?

注意:我觉得这个演示文稿非常有用,也许是因为它是示例驱动因此很容易理解:

" 为每个人重构 - 如何以及为什么使用Eclipse的自动重构功能 "

编辑:这篇文章也很有用(谢谢抖动)

探索Eclipse JDT中的重构函数

java eclipse refactoring

44
推荐指数
5
解决办法
3万
查看次数

您是否应该将您采用的第三方库包装到项目中?

我今天和同事讨论过.

他声称每当你使用第三方库时,你应该总是为它写一个包装器.因此,您可以随时更改内容并根据具体用途调整内容.

总是不同意这个词,关于log4j的讨论已经出现了,我声称log4j经过了很好的测试和经过时间验证的API和实现,所有可以想象的都可以后验配置,你不应该包装.即使你想要包装,也有经过验证的包装器,如commons-logging和log5j.

我们讨论的另一个例子是Hibernate.我声称它有一个非常大的API被包装.此外,它还有一个分层API,可让您根据需要调整其内部.我的朋友声称他仍然相信它应该被包装但是他没有这样做因为API的大小(这个同事在我们当前的项目中比我更老练).

我声称这个,并且应该在特定情况下进行包装:

  • 您不确定图书馆如何满足您的需求
  • 您将只使用一小部分库(在这种情况下,您可能只暴露其API的一部分).
  • 您不确定库的API或实现的质量.

我还坚持认为,有时你可以包装代码而不是库.例如,将与数据库相关的代码放在DAO层中,而不是抢先包装所有的hibernate.

嗯,最后这不是一个真正的问题,但您的见解,经验和意见都受到高度赞赏.

refactoring

44
推荐指数
6
解决办法
6463
查看次数

在VS2008中使用Curly Braces {}包围代码块的任何方法?

我总是发现自己需要在花括号{}中包含一段代码,但不幸的是,它不包含在C#环绕声代码片段中,这似乎是一种疏忽.我也找不到任何建立你自己的环绕片段的东西(只是其他类型的片段).

我实际上也在运行Resharper,但它似乎也没有这个功能(或者我还没想过如何激活它).

我们拥有包括编码标准的代码,甚至单行的之后,如果还是别人的大括号,所以如果我可以只让ReSharper的做自动重构会更加美好!

c# resharper refactoring visual-studio-2008 code-snippets

44
推荐指数
3
解决办法
2万
查看次数

使用不返回任何内容的return语句有什么好处?

我正在重构一个我从开源项目中获取的大型javascript文档.许多函数使用不一致的return语句.这是我的意思的一个简单例子:

var func = function(param) {
    if (!param) {
        return;
    }
    // do stuff
    return true;
}
Run Code Online (Sandbox Code Playgroud)

有时函数返回布尔值,有时返回字符串或其他东西.通常它们与return;条件内的简单语句不一致地配对.

The problem is that the code is complex. It is a parser that uses a multitude of unique RegEx matches, creates and destroys DOM nodes on the fly, etc. Preliminary testing shows that, in the above example, I could change the return; statement to become return false;, but I'm concerned that I may not realize that it had a …

javascript refactoring return-value

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

违反DRY原则总是不好吗?

我一直在讨论关于DRY(不要重复自己)的原则,也称为DIE(Duplication Is Evil),并且有投票,任何简单的代码重复总是邪恶的.我想听听你对以下几点的看法:

  1. 不确定的未来.让我们说,我们在两个地方有相同的代码.关键是,这两个地方只有偶然的内涵.有可能,它们将来会有所不同,因为它们的上下文和语义不同.从这些地方抽象并不便宜,如果其中一个地方发生变化,从抽象中解开将更加昂贵.
  2. 可读性.存在涉及若干变量或步骤的复杂计算.在代码的其他地方还有另一个代码,它们有一些相同的部分.问题是,如果我们取出公共部分,计算的可读性会降低,创建抽象将很难给它一个描述性的名称.更糟糕的是,如果算法的某些部分将来会像第1点那样发生变化.

上述情况是否是放弃抽象过程的好理由,只留下重复的代码以支持未来变更的风险或只是可读性?

refactoring design-patterns

44
推荐指数
4
解决办法
3633
查看次数