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