我最近阅读了Michael C. Feathers的书Working effectively with legacy code
,并提到了一种测试自动重构工具安全性的方法。
我的问题是: .net平台有没有安全的重构工具?;这意味着工具只允许真正的重构,例如不允许在以下示例中对inline variable
变量进行temp
重构,或者至少显示我正在更改逻辑的警告。
class Program
{
private static int _x;
static void Main()
{
int temp = Test();
for (int i = 0; i < 10; ++i)
{
Console.WriteLine(temp);
}
Console.ReadKey();
}
private static int Test()
{
return ++_x;
}
}
我已经使用最新版本在重构工具Resharper
和Coderush + Refactor pro
上测试了此示例,并且两者都未通过测试并允许重构:
class Program
{
private static int _x;
static void Main()
{
for (int i = 0; i < 10; ++i)
{
Console.WriteLine(Test());
}
Console.ReadKey();
}
private static int Test()
{
return ++_x;
}
}
答案 0 :(得分:10)
重构具有内在的风险。单纯依靠工具来保证代码安全是不明智的。
我们使用Resharper,但没有综合单元测试的安全网。我不知道这个领域有更好的C#工具。
答案 1 :(得分:5)
我不同意你的“测试”显示失败。
你改变了逻辑,而不是工具。您更改了代码,以便重复调用方法而不是一次。
这些工具只是做了你告诉他们要做的事。
答案 2 :(得分:5)
使用自动重构非常安全非常困难。
当我们第一次在Visual C#中引入重构时,我们问自己这个问题:我们的重构是否需要一直完全正确,或者我们应该允许它们在某些情况下犯错?
一直都是正确的,需要很多程序员的努力,这意味着我们只需要在框中获得一些重构。它还会使重构变慢,因为它们会花费大量时间进行验证。
允许他们犯错将使他们对任何没有很好的自动测试覆盖率的团队毫无用处。 TDD团队有很好的测试,但这只是Visual Studio用户群的一部分。我们不想制作我们不得不告诉人们不要使用的功能!
TDD团队会很快发现错误,但他们会尽快学会不相信我们的重构工具。他们在使用它们时犹豫不决,并在很多时候寻找其他解决方案(查找和替换而不是重命名)。此外,作为C#团队,我们处于有利位置,可以进行高保真的重构。我们有一个独特的优势,C#语言设计师和编译团队就在大厅里。我们知道我们应该发挥自己的优势。
因此,我们决定减少高质量的重构,而不是那些不那么可靠的重构。今天有6个。
回顾过去,我希望我们只完成重命名,提取方法和引入局部变量。最后两个几乎是相同的,实现方式。 3个参数重构(曾经是第7个,将参数提升为局部变量,但它在VS2010中被切断)需要做大量工作才能做到,而且可能不值得。
我的建议是做TDD ,为您提供大量测试,以便您可以安全地重构,无论您使用工具还是手工操作。
答案 3 :(得分:2)
“安全”是相当主观的......
虽然这两种工具在你的脑海中根据这个测试不被认为是“安全的”,但这两种工具都非常有用。没有工具是完美的。如果他们有某种情况,他们不喜欢避免这样做或创造一个解决方法。
答案 4 :(得分:0)
我认为Safe Refactor可以成为您案例的工具。 尽管它适用于Java,但其概念可能适用于其他OO语言。