Thema: Delphi Refactorings in Delphi?

Einzelnen Beitrag anzeigen

PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Refactorings in Delphi?

  Alt 31. Dez 2012, 23:44
Ausgehend von folgendem Code wurde testweise die Code-Auswahl c := a + b mit Delphis Refactoring-Methode bearbeitet:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := 2;
  b := 3;
  c := a + b;
end;
Das in Delphi XE2 eingebaute "Methode extrahieren" macht daraus:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b: Integer;
begin
  a := 2;
  b := 3;
  ExtractedMethod(a, b);
end;

procedure TForm1.ExtractedMethod(a: Integer; b: Integer);
var
  c: Integer;
begin
  c := a + b;
end;
D.h. es wird einfach und simpel die Anweisung c := a + b in eine Prozedur ausgelagert. Eine Parameter-Bearbeitung ist im Refactoring-Dialog nicht möglich. Die Rückgabe eines Ergebnisses ist nicht vorgesehen, da der Code selbst eine solche ja nicht benötigt. Streng nach Compiler-Logik eben.

Die erzeugte Prozedur sieht jedoch anders aus, wenn die Variable c NACH der Codeauswahl c := a + b noch verwendet wird:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b, c, d: Integer;
begin
  a := 2;
  b := 3;
  c := a + b;
  d := a + b + c;
end;
In diesem Fall erzeugt das Delphi-Refactoring diesen Code:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b, c, d: Integer;
begin
  a := 2;
  b := 3;
  ExtractedMethod(a, b, c);
  d := a + b + c;
end;

procedure TForm1.ExtractedMethod(a: Integer; b: Integer; var c: Integer);
begin
  c := a + b;
end;
Mit dem var-Parameter berücksichtigt das Delphi-Refactoring intelligenterweise, dass die Variable c später noch verwendet wird.

(ModelMaker Code Explorer setzt hier unnötigerweise 3 var-Parameter, obwohl an die Variablen a und b innerhalb der Prozedur ja gar nichts zugewiesen wird):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b, c, d: Integer;
begin
  a := 2;
  b := 3;
  (*TODO: extracted code
  c := a + b;
  *)

  NewMethod(a, b, c);
  d := a + b + c;
end;

procedure TForm1.NewMethod(var a, b, c: Integer);
begin
  c := a + b;
end;
Das bedeutet also: Wenn man die Rückgabe eines Ergebnisses benötigt, kann man dies mit einem einfachen Trick erreichen. Man verwendet einfach die gewünschte Rückgabe-Variable in einer Dummy-Anweisung NACH der Code-Auswahl:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := 2;
  b := 3;
  c := a + b;
  c := c; // Dummy-Anweisung
end;
Das Delphi-Refactoring macht daraus:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a, b, c: Integer;
begin
  a := 2;
  b := 3;
  ExtractedMethod(a, c, b);
  c := c; // Dummy-Anweisung
end;

procedure TForm1.ExtractedMethod(a: Integer; var c: Integer; b: Integer);
begin
  c := a + b;
end;
  Mit Zitat antworten Zitat