Frage

Ich bin einsteigen gerade auf dem ersten großen Refactoring, und benötigen eine (leider groß) Klasse in zwei aufzuspalten, die dann nur über eine Schnittstelle kommunizieren. (My Presenter hat sich einen Controller sein, und muss GUI-Logik aus dem App-Logik trennen). Mit C # in Visual Studio 2008 und ReSharper, was ist der einfachste Weg, dies zu erreichen?

Was ich werde versuchen, ist Sammeln Sie a) die Mitglieder für die neue Klasse und „extrahieren neue Klasse“ b) aufzuräumen das resultierende Chaos c) "Extract Interface" d) jagen alle Verweise auf die Klasse und wandeln sie Verweise auf eine Schnittstelle

, aber ich habe noch nie gemacht, und ich fragen, ob jemand einen guten Tipps oder gotchas weiß, bevor ich alles anfangen zerreißen ... Dank!

War es hilfreich?

Lösung

Baby Schritte.

Schritt 1: Machen Sie eine kleine Änderung ReSharper ausgezeichneten Refactoring mit
. Schritt 2: Test (vorzugsweise Unit-Test) der Code noch, um sicherzustellen, arbeitet
Schritt 3: Commit zur Quellcodeverwaltung

Wiederholen Sie diese 3 Schritte viele Male.

Vielleicht wird dies nicht funktionieren, wenn Sie eine der diese tun „muss ein großer Schritt auf einmal“ Refactoring. In diesem Fall tun, wie viele kleine Refactorings wie möglich, bevor sie den Sprung in den großen Schritt.

Andere Tipps

Rufen Sie mich an Altmode, aber persönlich verwende ich die automatisierten Funktionen, die Sie nur beschrieben, wenn es für technische Aufgaben ist (wie Umbenennen, etc ...)

Für alle anderen Refactoring, wie Extrahieren von Schnittstellen und solche, ziehe ich es manuell zu tun. Sie werden feststellen, dass es noch mehr Refactoring Sie tun können, und in der Regel wird der Code kommt saubere.

Ich habe nur einen wichtigen Ratschlag - macht absolut sicher, dass Sie wieder in den Zustand zurückkehren können, bevor Sie das Refactoring ohne etwas zu verlieren begannen. Dann taucht nur in und für ihn gehen. Sie können auch wieder zu stoppen und starten Sie am Ende mit, aber das ist nichts zu befürchten (solange Sie meinen einen Rat beherzigt). Sie werden eine Menge tun, es lernen.

Kurze Antwort hier zuerst, ich werde Blog-Post über mich, vielen Dank für eine Idee schreiben!

Also, nehmen wir an, wir haben diese:

class PresenterAndController
  {
    public void Control()
    {
      Present();
    }

    public void Present()
    {
      // present something
    }
  }

Zuerst müssen wir alle direkten Mitglieder konvertieren Nutzungen in indirekten, das heißt qualifizieren sie mit dem Feld. Dazu verwendet Extrakt Super Refactoring zu extrahieren Presenter Teil in übergeordneter Klasse:

  internal class Presenter
  {
    public void Present()
    {
      // present something
    }
  }

  class PresenterAndController : Presenter
  {
    public void Control()
    {
      Present();
    }
  }

Erstellen Sie Feld in PresenterAndController, die eine Delegierung wird und generieren verwenden (Alt-Ins) delegieren Mitglieder zu schaffen. Sie werden passieren Basis Methoden zu verstecken, da sie die gleichen sind:

  internal class Presenter
  {
    public void Present()
    {
      // present something
    }
  }

  class PresenterAndController : Presenter
  {
    private Presenter myPresenter;

    public void Present() // hides base method
    {
      myPresenter.Present();
    }

    public void Control()
    {
      Present(); // it now references method from this type
    }
  }

Presenter aus der Vererbungsliste entfernen und Sie sind mit Splitting-Klassen erfolgt. Jetzt können Sie Schnittstellen extrahieren, Basistypen verwenden, wo möglich und ansonsten ordentlich es auf.

.

Ich habe noch nie Visual Studio, aber ich finde das automatische Refactoring in Eclipse als ziemlich zuverlässig verwendet - zumindest so zuverlässig, wie ich tun würde die gleiche Arbeit

, bevor Sie das tun, investieren in der Quellcodeverwaltung: lernen Git. Refactoring ohne SCM ist wie mit verbundenen Augen fahren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top