Home » Tutorials » Sonstiges » Refactoring oder Wie warte ich meinen Code?

Refactoring oder Wie warte ich meinen Code?

Methoden extrahieren

Wieder eine Situation, die vielleicht der eine oder andere kennen mag. Zwischendurch, irgendwo in dem bereits hochkomplexen Programm, wägt man ab, ob man nun eine kleine Aufgabe in eine neue Prozedur packen soll oder sie einfach so in die aktuelle Prozedur reinschreibt. Man entscheidet sich für das Letztere, denn schließlich sind es nur ein paar Zeilen. Aber je weiter man schreibt, umso komplizierter wird es und aus den zwei-, drei Codezeilen ist plötzlich ein riesiger Codekomplex von eher zwanzig oder dreißig Codezeilen geworden. Was nun? Eine neue Methode erstellen, den Code hineinkopieren und die Methode dann an der ursprünglichen Stelle des Codes aufrufen. Oder aber das Refactoring anwenden. Auch hierfür bietet Delphi eine Möglichkeit (Erwähnte ich schon, das Programmierer faul sind?…).
Wir können die beliebigen Codezeilen markieren und dann nach einem Rechtsklick „Refactoring->Methode extrahieren“ auswählen.
An dieser Stelle wollen wir uns kein hochkomplexes Beispiel ansehen. Belassen wir es bei folgendem Minimalbeispiel:

procedure TFormular_Main.FormCreate(Sender: TObject);
begin
  if Random(10) > 5 then
     MessageDlg('Fehler',mtError,[mbOK],0);
  Self.Caption := 'Hallo, Welt';
end;

Wir möchten nun die oberen beiden Codezeilen der Prozedur in eine neue Methode packen. Wir markieren sie und wählen das oben genannte „Refactoring->Methode extrahieren“ aus. Einmal mehr zeigt uns Delphi einen übersichtlichen Dialog.

In das Feld „Neue Methode“ kommt der zukünftige Name der neuen Prozedur hinein. Darunter zeigt uns Delphi sogar elegant, wie diese Prozedur später aussehen wird. Unser Beispiel sieht anschließend z.B. so aus:

procedure TFormular_Main.FormCreate(Sender: TObject);
begin
  ExtractedMethod;
  Self.Caption := 'Hallo, Welt';
end;

procedure TFormular_Main.ExtractedMethod;
begin
  if Random(10) > 5 then
    MessageDlg('Fehler', mtError, [mbOK], 0);
end;

Natürlich sollte man in der Realität einen etwas aussagekräftigeren Namen wählen, aber für unser Beispiel reicht es aus. Leider ist das Methoden-Extrahieren aber nicht allmächtig. Anweisungen können extrahiert werden, Ausdrücke aber nicht. Anweisungen, die „inherited“ beinhalten, können ebenfalls nicht extrahiert werden. Anweisungen, die innerhalb eines „with“-Blocks stehen, können ebenfalls nicht extrahiert werden. Auch Anweisungen, die selbst Aufrufe von lokalen Methoden enthalten, können nicht extrahiert werden.