是否有.net(或至少c#)的安全重构工具?

RoX*_*oXX 5 .net c# refactoring

我最近阅读了Michael C. Feathers的书,Working effectively with legacy code并提到了一种测试自动重构工具安全性的方法.

我的问题是:.net平台有没有安全的重构工具?; 这意味着只允许实际重构的工具,例如,在以下示例中不允许inline variabletemp变量进行重构,或者至少显示我正在更改逻辑的警告.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经在重构工具ResharperCoderush + 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*end 10

重构具有内在的风险.单纯依靠工具来保证代码安全是不明智的.

我们使用Resharper但不是没有综合单元测试的安全网.我不知道这个领域有更好的C#工具.

  • 从功能的角度来看,重构*不应该具有内在的风险.这只是表明这些工具不够强大,无法进行检查,因此工具制造商无需进行必要的检查即可提供这些工具.买家要小心.(不要误解我的意思:实现所有必要的检查是很难的:你需要的是编译器的完整前端). (2认同)

Chr*_*sic 5

我不同意你的"测试"显示失败.

你改变了逻辑,而不是工具.您更改了代码,以便重复调用方法而不是一次.

这些工具只是做了你告诉他们要做的事情.

  • 实际上我使用TOOL来应用重构,这不是重构.重构的定义是在不修改其行为的情况下更改代码,但该工具改变了一些行为,因此不应该将此功能称为重构.当然,进行单元测试以保证这一点总是最好的,但实际上如果你可以应用这些自动重构而不必担心破坏现有功能,你会更有效率 (2认同)
  • 但实际上我通过该工具对代码所做的并不是重构。该工具应该只为我提供重构的能力,如果它真的是重构,那就意味着它不会改变逻辑。所以我的观点是该工具不应该提供做一些不是真正重构的事情的可能性,或者至少将其标记为不同/显示一些警告/任何 http://en.wikipedia.org/wiki/Code_refactoring (2认同)

Jay*_*uzi 5

使用自动重构非常安全非常困难.

当我们第一次在Visual C#中引入重构时,我们问自己这个问题:我们的重构是否需要一直完全正确,或者我们应该允许它们在某些情况下犯错?

一直都是正确的需要很多程序员的努力,这意味着我们只需要在框中进行一些重构.它还会使重构变慢,因为它们会花费大量时间进行验证.

允许他们犯错将使他们对任何没有很好的自动化测试覆盖率的团队毫无用处.TDD团队有很好的测试,但这只是Visual Studio用户群的一部分.我们不想制作我们不得不告诉人们不要使用的功能!

TDD团队会很快发现错误,但他们会尽快学会不相信我们的重构工具.他们在使用它们时犹豫不决,并且在很多时候寻找其他解决方案(查找和替换而不是重命名).

此外,作为C#团队,我们处于一个很好的位置,可以进行高保真的重构.我们有一个独特的优势,C#语言设计师和编译团队就在大厅里.我们知道我们应该发挥我们的优势.

因此,我们决定减少高质量的重构,而不是大量不那么可靠的重构.今天有6个.

Visual Studio重构

回顾过去,我希望我们只完成重命名,提取方法和引入局部变量.最后两个几乎是相同的,实现方式.3个参数重构(曾经是第7个,将参数提升为局部变量,但它在VS2010中被切割)是很多工作要做对,可能不值得.

我的建议是做TDD,给你一大堆测试,这样你就可以安全地重构,无论你是使用工具还是手工操作.