AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Refactorings in Delphi?

Ein Thema von PeterPanino · begonnen am 31. Dez 2012 · letzter Beitrag vom 1. Jan 2013
Antwort Antwort
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Refactorings in Delphi?

  Alt 31. Dez 2012, 21:48
Bei mir geht es erfahrungsgemäß schneller und zuverlässiger, einfach den Code zu copy-pasten und dann ggf. die Variablen mit dem Sync-Editor oder dem Umbenenn-Refactoring-Tool (z.B. in "Result") umzubenennen, wenn ich Code in eine Funktion auslagern will.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#2

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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.966 Beiträge
 
Delphi 12 Athens
 
#3

AW: Refactorings in Delphi?

  Alt 1. Jan 2013, 01:56
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:
Naja, entweder braucht man sie, dann braucht man auch keinen Dummy, oder man braucht sie nicht, dann hat man das Problem gar nicht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
PeterPanino

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

AW: Refactorings in Delphi?

  Alt 1. Jan 2013, 11:38
Naja, entweder braucht man sie, dann braucht man auch keinen Dummy, oder man braucht sie nicht, dann hat man das Problem gar nicht.

Naja, meine Überlegung war, dass man die extrahierte Methode sowie den Aufruf dann an anderer Stelle verwenden würde.

Aber ich habe mir jetzt ModelMaker Code Explorer näher angesehen: Das ist ein phantastisches Werkzeug, das WEIT über die Delphi-Refactorings hinausgeht! Ich werde es mir sicher zulegen.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Refactorings in Delphi?

  Alt 1. Jan 2013, 11:42
Also ich habe im ModelMaker keine tollen Refactorings entdeckt: Editierhilfen ja. Tolle(!) Refactorings: Nein.
http://de.wikipedia.org/wiki/Refactoring

Edit:
Wenn man sich mal den Katalog von Martin Fowler anschaut, dann sieht man, das in Delphi doch einiges umgesetzt wurde. Man muss zudem bedenken, das einige Refactorings algorithmisch gar nicht umzusetzen sind (z.B.: "Replace Iteration with Recursion").

Mittlerweile wird Refactoring allerdings auch mit 'Einfügen von kleinen Codeschnippets' gleichgesetzt ('Setter Guard','Parameter Contract'). Das ist -so gesehen- kein Refactoring, sondern eine Erweiterung, ist aber genauso wichtig.

Geändert von Furtbichler ( 1. Jan 2013 um 11:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz