Entwickler-Ecke

Sonstiges (Delphi) - Refractoring -> Methode extrahieren


bole - Sa 09.10.10 01:31
Titel: Refractoring -> Methode extrahieren
Hallo

Ich habe in thread über Schleifenabbruch http://www.delphi-forum.de/viewtopic.php?t=101855&start=0&postorder=asc
den Tipp über Refractoring -> Methode extrahieren von user profile iconjaenicke gelesen. Dies kannte ich bisher noch nicht, deshalb wollte ich es mal probieren...

Doch entweder bin ich zu blöd dies richtig zu machen oder ich habe den Zweck dieser Funktion nicht richtig verstanden. :gruebel:

Delphi extrahiert mir nur ein Code-Gerüst ohne Inhalt!

Wenn ich zum Beispiel aus diesen Code den markierten Teil mit 'methode extrahieren' in eine Procedure machen möchte kommt nur der folgende Code heraus:

Original Code Fragment

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
while (rest > 0and (MarktPosIX >= i) do
     begin;
       If Marktpos[i].Quali=q then
       begin;
         If Marktpos[i].Anz >= Rest then
         Begin
         // angebot kann nachfrage decken
           Quali[q].preis:=Quali[q].preis+rest*MarktPos[i].Preis;
           Rest:= 0;
           memo1.lines.Add('ok '+inttostr(q)+floattostr(Quali[q].preis)+'  '+inttostr(rest));
         End
         else
         begin;
         // angebot kann nachfrage nicht decken
           Quali[q].preis:=Quali[q].preis+MarktPos[i].anz*MarktPos[i].Preis;
           Rest:=Rest-Marktpos[i].Anz;
           memo1.lines.Add('nok '+inttostr(q)+floattostr(Quali[q].preis)+'  '+inttostr(rest));
         end;

       end;
       inc(i);
     end;
     If rest > 0 then
     begin;


Extracted Method:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm2.ExtractedMethod;
begin
  begin
  end;
end;


Der Inhalt der Procedure ist gelöscht!

Mache ich da was falsch? So sehe ich nicht wirklich einen Sinn hinter dieser Funktion...

Vielen Dank für Eure Erklärungen

Gruss
Bole


jaenicke - Sa 09.10.10 08:42

Steht es denn in der Vorschau richtig da?
Welche Delphiversion ist das?

Ich habe aber auch schon gemerkt, dass es in seltenen Fällen mal nicht richtig klappt.


bole - Sa 09.10.10 14:04

Hallo

Schon in der Vorschau ist nur das Code Gerüst.

Ich verwende Turbo Delphi 2006.

Gruss

Bole


jaenicke - Sa 09.10.10 14:20

Hinter dem begin vor dem Bereich ist ein Semikolon, ich vermute daran liegt es.


bole - Sa 09.10.10 15:28

Vielen Dank für den Tipp. Es scheint wirklich an diesem Semikolon gelegen zu haben... ohne funktioniert es tiptop.

Ich schliesse eigentlich jeden Befehl ausser vor Else aus Gewohnheit mit einem Semikolon ab. Ich denke so habe ich es Gelernt vor X Jahren mit Turbo Pascal....

Es war mir nicht klar das es dadurch zu Problemen kommen kann!

Gruss

Bole


delphi10 - So 10.10.10 00:25

user profile iconbole hat folgendes geschrieben Zum zitierten Posting springen:
Vielen Dank für den Tipp. Es scheint wirklich an diesem Semikolon gelegen zu haben... ohne funktioniert es tiptop.

Ich schliesse eigentlich jeden Befehl ausser vor Else aus Gewohnheit mit einem Semikolon ab. Ich denke so habe ich es Gelernt vor X Jahren mit Turbo Pascal....

Auch vor x-Jahren hat es in Turbo-Pascal kein Semikolon hinter begin gegeben respektive hat die Syntax das nicht verlangt.


bole - So 10.10.10 12:38

Es mag sein das in der Syntax nicht wirklich ein Semikolon nach dem Begin verlangt wurde.

Wahrscheinlich hat es sich mein Lehrer auch ziehmlich einfach gemacht in dem er einfach die Regel aufstellte dass jeder Befehl ausser vor Else mit einem Semikolon abzuschliessen ist...

Bisher hatte ich deswegen auch noch nie bewusst Probleme.

Gruss

Bole


Tankard - So 10.10.10 14:07

Richtiges Pascal verlangt nicht wirkliche immer ein ;

zb.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
program test;
begin
  if ausdruck then
    begin
      anweisung1;
      anweisung2       // hier kommt eigentlich kein ; hin
    end
  else
    anweisung3        //hier auch nicht da letzter befehl for end
end.



wobei delphi bei diesen sachen ne fehler meldet.


Martok - So 10.10.10 14:31

Und wie mir user profile iconBenBE erklärte (was ich auch nicht wusste):

GeSHi-IRC hat folgendes geschrieben:
<BenBE> The ; directly after begin is valid: You can have empty statements.
<BenBE> ;;; is valid Pascal.
Deswegen dürfte wohl das Begin; funktioniert haben. Aber wenn ich einen Parser bauen müsste, würde ich wohl auch nicht dran denken... und bei D2k6 war das Refactoring sowieso noch etwas holprig. Würde mich mal interessieren, ob aktuelle Versionen da immer noch drüber stolpern.


user profile iconbole hat folgendes geschrieben Zum zitierten Posting springen:
Wahrscheinlich hat es sich mein Lehrer auch ziehmlich einfach gemacht in dem er einfach die Regel aufstellte dass jeder Befehl ausser vor Else mit einem Semikolon abzuschliessen ist...
Das wäre ja noch i.O. - Aber: begin ist kein Befehl, sondern ein Blockanfang. Nach deiner Interpretation könnte man auch nach then ein ; setzen. Und was da passiert, wissen wir ja alle ;)


jaenicke - So 10.10.10 14:45

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Würde mich mal interessieren, ob aktuelle Versionen da immer noch drüber stolpern.
Ja, tun sie. Auf die Idee kommt einfach niemand. ;-)

Mein eigener Parser stolpert da übrigens auch.


bole - So 10.10.10 15:30

Zitat:
Ja, tun sie. Auf die Idee kommt einfach niemand. ;-)


Ich scheinbar schon... :lol:

Gruss
Bole


BenBE - So 10.10.10 15:40

Hat das denn schon mal jemand an Borland Inprise CodeGear Embarcadingsbums gemeldet?