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;