2010-09-17 1 views
5

Ich habe vor kurzem Michael C. Feathers Buch Working effectively with legacy code gelesen und stieß auf den Punkt, wo er einen Weg zur Überprüfung der Sicherheit von automatischen Refactoring-Tools erwähnt.Gibt es ein sicheres Refactoring-Tool für .net (oder mindestens C#)?

Meine Frage ist: Gibt es irgendwelche sicheren Refactoring-Tools für die .net-Plattform?; das bedeutet Werkzeuge, die nur echte Refactorings und z.B. Erlauben Sie nicht die inline variable Refactoring auf der temp Variable im folgenden Beispiel, oder zeigen Sie zumindest eine Warnung, dass ich Logik ändern.

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; 
    } 
} 

ich getestet habe dieses Beispiel auf die Refactoring-Tools Resharper und Coderush + Refactor pro mit den neuesten Versionen und beide bestanden den Test nicht und erlaubt das Refactoring:

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

Haben Sie ein Beispiel für ein Werkzeug, das * * die Art und Weise durchführen würden Sie, auch für eine andere Sprache wünschen? –

+1

Eigentlich würde ich wollen, dass das Tool dieses spezielle Refactoring nicht anbietet oder irgendeine Art von Alarm anzeigt, dass dies die Logik des Codes ändern würde. Da ein Refactoring die Logik nicht ändern darf, siehe die Definition unter Wikipedia: http://en.wikipedia.org/wiki/Refactoring. – RoXX

Antwort

5

Um mit automatisierten Refactorings wirklich sicher zu sein, ist sehr schwierig.

Als wir Refactorings zum ersten Mal in Visual C# eingeführt haben, haben wir uns die folgende Frage gestellt: Müssen unsere Refactorings die ganze Zeit die richtigen Dinge korrigieren, oder sollten wir ihnen erlauben, in bestimmten Fällen Fehler zu machen?

Um die ganze Zeit recht zu haben, würde viel Programmieraufwand nötig sein, was bedeutet, dass wir nur ein paar Refactorings in der Box bekommen würden. Es würde auch die Refactorings verlangsamen, da sie viel Zeit in die Validierung investieren würden.

Wenn man ihnen erlaubt, Fehler zu machen, wären sie für Teams ohne große automatisierte Testabdeckung nutzlos. TDD-Teams haben gute Tests, aber das ist nur ein Teil der Visual Studio-Benutzerbasis. Wir wollten keine Features machen, die wir den Leuten mitteilen mussten!

TDD-Teams würden schnell Fehler machen, aber sie würden genauso schnell lernen, unseren Refactoring-Tools nicht zu vertrauen. Sie würden zögern, sie zu benutzen, und suchen die meiste Zeit nach anderen Lösungen (Finden und Ersetzen statt Umbenennen).

Auch als C# -Team waren wir in einer guten Position, um High-Fidelity-Refactorings durchzuführen. Wir hatten einen einzigartigen Vorteil, mit den C# -Sprachdesignern und dem Compiler-Team auf dem Flur. Wir wussten, dass wir unsere Stärken ausspielen sollten.

Also entschieden wir uns, weniger hochwertige Refactorings zu machen, statt viele Refactorings, die nicht so zuverlässig waren. Heute gibt es 6.

Visual Studio Refactorings

Im Rückblick, ich wünschte, wir nur getan hatte, Umbenennen, Methode extrahieren und Einführung Lokale Variable. Die letzten beiden sind in der Implementierung fast identisch. Die 3 Parameter-Refactorings (es gab früher eine 7., Local Variable zu Parameter promoten, aber es war in VS2010 geschnitten) waren eine Menge Arbeit, um richtig zu machen, und waren es wahrscheinlich nicht wert.

Meine Empfehlung ist tun TDD, gibt Ihnen eine große Sammlung von Tests, so dass Sie sicher refaktorieren können, ob Sie ein Werkzeug verwenden oder es von Hand tun.

10

Refactoring ist von Natur aus riskant. Sich nur auf ein Tool zu verlassen, um Ihren Code sicher zu machen, ist unklug imo.

Wir verwenden Resharper aber nicht ohne das Sicherheitsnetz von umfangreichen Unit-Tests. Ich kenne kein besseres C# -Tool in diesem Bereich.

+1

Ich stimme dem Punkt zu, dass Sie immer Unit-Tests haben sollten, um Ihr Refactoring abzudecken, aber tatsächlich, wenn Sie ein Werkzeug hätten, das nur sichere Refactorings erlaubt, könnten Sie z.B. Wenden Sie einige grundlegende Refactorings an, bevor Sie Legacy-Code mit Unit-Tests erweitern oder den Code testbar machen, um Ihre Produktivität zu steigern. – RoXX

+2

Refactoring * sollte nicht inhärent riskant in Bezug auf die Funktionalität sein. Dies zeigt nur, dass die Werkzeuge nicht stark genug sind, um die Prüfung durchzuführen, so dass die Werkzeughersteller sie ohne die notwendige Überprüfung anbieten. Käufer aufgepasst. (Verstehen Sie mich nicht falsch: Es ist * schwer *, alle notwendigen Prüfungen zu implementieren: Sie benötigen das komplette Frontend eines Compilers). –

2

„Safe“ ist eher subjektiv ....

Während diese beiden Werkzeuge aus nicht „sicher“ auf der Grundlage dieser Test in Ihrem Kopf in Betracht gezogen werden beide dieser Werkzeuge sind sehr nützlich. Kein Werkzeug ist perfekt. Wenn es eine Situation gibt, in der sie etwas tun, das du nicht magst, dann meide es entweder, es zu tun oder erschaffe eine Arbeit.

5

Ich stimme nicht zu, dass Ihr "Test" Fehler zeigt.

Sie haben die Logik geändert, nicht das Werkzeug. Sie haben den Code so geändert, dass eine Methode wiederholt statt einmal aufgerufen wird.

Die Werkzeuge haben nur getan, was Sie ihnen gesagt haben.

+0

Yup. Aus diesem Grund sollten Sie Ihren Code nach jedem Refactoring testen, damit Sie * wissen *, wenn Sie die Logik ändern. – strager

+0

Ich würde die OPs-Anweisung akzeptieren, wenn das Tool den Fehler wirklich einführte, wie zum Beispiel die Verwendung eines invertierten if-Statement-Refactorings, das zu einem anderen logischen Ergebnis führte. –

+2

Eigentlich benutzte ich das TOOL, um ein Refactoring anzuwenden, das kein Refactoring war. Die Definition von Refactoring ändert den Code, ohne sein Verhalten zu ändern, aber das Tool hat ein bestimmtes Verhalten geändert, so dass es diese Funktionalität nicht als Refactoring bezeichnen sollte. Natürlich ist es immer am besten, Komponententests durchzuführen, aber Sie wären produktiver, wenn Sie diese automatischen Refactorings anwenden könnten, ohne sich um die Funktionalität von – RoXX