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

是否有针对.net(或至少是c#)的安全重构工具?,c#,.net,refactoring,C#,.net,Refactoring,我最近读了Michael C.Feathers的书《有效地使用遗留代码》,他提到了一种测试自动重构工具安全性的方法 我的问题是:有没有适合.net平台的安全重构工具?;这意味着工具只允许真正的重构,例如,在下面的示例中不允许对temp变量进行inline变量重构,或者至少显示一个警告,表明我正在更改逻辑 class Program { private static int _x; static void Main() { int temp = Test(

我最近读了Michael C.Feathers的书《有效地使用遗留代码》,他提到了一种测试自动重构工具安全性的方法

我的问题是:有没有适合.net平台的安全重构工具?;这意味着工具只允许真正的重构,例如,在下面的示例中不允许对
temp
变量进行
inline变量
重构,或者至少显示一个警告,表明我正在更改逻辑

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,但没有全面单元测试的安全网。我不知道在这个领域有什么更好的C#工具。

安全是相当主观的

虽然这两种工具在你看来并不被认为是“安全的”,但在你看来,这两种工具都非常有用。没有工具是完美的。如果他们做了你不喜欢的事情,要么避免做,要么创造一个变通办法。

我不同意你的“测试”显示失败

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


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

要真正安全地进行自动重构是非常困难的。

当我们第一次在visualc#中引入重构时,我们问自己这样一个问题:我们的重构需要一直保持完全正确,还是应该允许它们在某些情况下出错

要想一直保持正确,需要程序员付出大量努力,这意味着我们只需要进行少量的重构。这也会降低重构的速度,因为重构会花费大量时间进行验证

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

TDD团队会很快发现错误,但他们也会很快学会不信任我们的重构工具。他们会犹豫是否使用它们,并在大多数情况下寻求其他解决方案(查找并替换,而不是重命名)

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

因此,我们决定少做一些高质量的重构,而不是做很多不可靠的重构。今天有6个

回顾过去,我希望我们只做了重命名、提取方法和引入局部变量。从实现角度来看,后两个几乎相同。3个参数的重构(过去有第7个,将局部变量提升为参数,但在VS2010中被删掉)是一项繁重的工作,可能不值得


我的建议是执行TDD,为您提供大量的测试集合,以便您可以安全地重构,无论您是使用工具还是手动重构。

我认为安全重构可以作为您案例的工具。 即使它是针对Java的,它的概念也可能适用于其他OO语言


是的。这就是为什么你应该在每次重构之后测试你的代码,这样你就知道你什么时候改变了逻辑。如果这个工具真的引入了错误,我会接受OPs语句,比如使用一个反转if语句重构,这会导致不同的逻辑结果。实际上,我使用这个工具来应用重构,而不是重构。重构的定义是在不修改其行为的情况下更改代码,但该工具更改了某些行为,因此不应将此功能称为重构。当然,让单元测试来涵盖这一点总是最好的,但实际上,如果您可以应用这些自动重构而不必担心破坏现有功能,那么您的工作效率会更高。但实际上,我通过该工具对代码所做的并不是重构。该工具应该只为我提供进行重构的能力,如果它真的是重构,那就意味着它没有改变逻辑。因此,我的观点是,该工具不应该提供做一些不是真正重构的事情的可能性,或者至少给它贴上不同的标签/显示一些警告/无论什么@RoXX,你想要的是非常不现实的IMHO。重构名称也很正确,因为它是一个可以用来进行重构的工具;当然,你可以用它来做其他的事情,就像你可以用砖头敲钉子一样。这不一定是最好的做法,但它是有效的,不是砖块的预期行为,但没有办法阻止你这样做。制作一个在大多数情况下都能工作的智能工具是相当困难的,特别是在当今编程语言所给予的巨大自由的情况下。我同意这样的观点,即你应该总是有单元测试来覆盖你的重构,但实际上如果你有一个只允许安全重构的工具,例如,在将单元测试添加到遗留代码之前,您可以应用一些基本的重构,或者使代码可测试,这将使您的工作效率更高。从功能的角度来看,重构不应该具有固有的风险。这只是表明工具的强度不足以进行检查,因此工具构建者提供这些工具时没有进行必要的检查。买家要小心。(别误会我的意思:很难实现所有必要的检查:你需要一个编译器的完整前端)。你有没有一个工具可以按照你想要的方式运行的例子,甚至对于另一种语言?实际上,我希望该工具不会提供这种特定的重构,或者显示出某种警告,这将导致
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;
    }
}