Autor Beitrag
henny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126



BeitragVerfasst: Di 30.06.09 13:45 
Hallo ich habe ein Programm geschrieben das eine Methode hat mit 1000 zeilen und wo oft "begin" drin ist.
Am ende muss ich dann umgefähr 200 mal "end" schreiben
Kann man das irgendwie umgehen wie z.B. end*50 oder so?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 30.06.09 13:48 
Ja. Zerlege diese Monster-Methode in mehrere kleinere. Wenn das nicht direkt geht, überdenke dein Konzept.

_________________
We are, we were and will not be.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 30.06.09 14:08 
Die Komplexität dürfte so hoch sein, dass die Methode weder testbar noch wartbar ist. Refactoring ist die einzige Lösung.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 30.06.09 16:15 
1. Ein "end" hinschreiben.
2. Die Zeile markieren, kopieren und einfügen.
3. Jetzt die 2 Zeilen markieren, kopieren und einfügen.
4. Jetzt die 4 Zeilen markieren, kopieren und einfügen.
5. Jetzt die 8 Zeilen markieren, kopieren und einfügen.
6. Jetzt die 16 Zeilen markieren, kopieren und einfügen.
7. Jetzt noch 18 Zeilen markieren, kopieren und einfügen.

Wenn ich mich jetzt nicht irre, hat man dann 50 Zeilen mit "end".

Ich bezweifle allerdings, dass das sinnvoll ist. Du solltest Deinen Source wirklich überarbeiten, wie meine Vor-Poster schon geschrieben haben.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Di 30.06.09 17:49 
Zu Deinem Vorschlag user profile iconjasocul:
Das fände ich einfacher, wenn Du einfach nur einmal ein
ausblenden Delphi-Quelltext
1:
end;					
(auch gerne mit Zeilenumbruch dahinter, den man hier jetzt leider nicht sehen kann) reinschreibst,
dieses markierst und dann einfach nur einmal Strg+C, und danach einfach länger Strg+V gedrückt hältst.
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 30.06.09 20:34 
Wie wäre es mit Makros?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.06.09 20:53 
Was bringt es denn irgendwie das Kopieren zu vereinfachen? Ich meine wie schon gesagt wurde ist das Konzept so mehr als ungünstig. Richtig durchdacht und dann klappt das auch...
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 30.06.09 21:46 
user profile iconhenny hat folgendes geschrieben Zum zitierten Posting springen:
Hallo ich habe ein Programm geschrieben das eine Methode hat mit 1000 zeilen und wo oft "begin" drin ist.
Am ende muss ich dann umgefähr 200 mal "end" schreiben
Kann man das irgendwie umgehen wie z.B. end*50 oder so?


Ein echter Programmierer hätte schon längst ein Programm geschrieben das ihm 50 mal end erzeugt.

Ach, ich will nicht so sein:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Memo1.Clear;

  for i := 1 to 50 do
    Memo1.Lines.Add('  end;');
end;


In USA könnte ich mir das sogar patentieren lassen.

_________________
Popov
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 30.06.09 21:49 
Rückst du deinen Code eigentlich ein? Das bezweifle ich stark - nein, das kann gar nicht sein. Wenn du in deiner Prozedur am Ende 50 ends stehen hast, müsstest du - je nach Einstellung - um 100-200 Zeichen eingerückt haben. Das wäre sogar auf einem großen Breitbildschirm im Vollbildmodus mehr als die Hälfte der Fensters ;)

Jetzt mal im Ernst - das kann doch gar nicht funktionieren, oder tut es das?
R4id
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 28

Win XP Home, Win XP Prof.
D7 Prof., D2006 Arch., BCB2006 Arch.
BeitragVerfasst: Di 30.06.09 21:50 
Was macht den überhaupt eine Funktion mit 1000 Zeilen? Die längste Methode die ich geschrieben habe war für TeamSpeak 2 eine Viewer-Methode mit 780 Zeilen perfektem Code :shock:
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 30.06.09 22:21 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt mal im Ernst - das kann doch gar nicht funktionieren, oder tut es das?


Doch, gehen würde es schon und es wäre auch nicht sonderlich schwer. Aber etwas mehr arbeit als oben wäre es schon.

Ganz einfach: Code in ein Memo kopieren und das Memo von hinten nach vorne durchgegehen. Im ersten Durchgang alle Zeilen ohne begin löschen, im zweiten begins und ends zählen und die geschlossenen begins entfernen, in dritten begins gegen ends tauschen (in umgekehrter Reihenfolge). Aufwand etwa 10 Minuten. Aber in der Zeit kriegt man auch alle ends von hand geschlossen.

Aber ein Tipp fürs Leben: immer sofort das end nach begin schrieben. Ich hab schon seit Jahren keinen offenes begin geschrieben. Dann weiß man auch, daß alles geschlossen ist.

Und für die Faulen: unter Programmierthilfe begin und end eintragen. Dann reichte es begin zu tippen, dann Strg+J und schon ist end da.

_________________
Popov
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 01.07.09 15:12 
user profile iconPopov hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt mal im Ernst - das kann doch gar nicht funktionieren, oder tut es das?


Doch, gehen würde es schon und es wäre auch nicht sonderlich schwer. Aber etwas mehr arbeit als oben wäre es schon.

Ich meinte nicht, dass es schwer ist, 50 ends einzufügen, sondern dass sein Programm nicht funktionieren kann. Kein Mensch kann in einer 1000-Zeilen-Prozedur den Überblick behalten.

Hast du den Code wirklich am Stück runtergetippt, ohne einmal zu compilieren und zu testen? Denn dann hättest du ja Schritt für Schritt immer wieder mal ein paar ends einfügen müssen.

Btw: Hast du Lust, die Methode mal hier zu posten? Würde mich schon interessieren...
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 02.07.09 09:00 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
sondern dass sein Programm nicht funktionieren kann. Kein Mensch kann in einer 1000-Zeilen-Prozedur den Überblick behalten.


So ein Blödsinn. Man kann auch Spaghetti-Code strukturiert programmieren. Ich habe derartigen Source schon gesehen und problemlos nachvollziehen können. Aber vielleicht bin ich ja kein Mensch. :twisted:
Der Code muss funktionieren. Im Überblick muss man den nicht behalten, wenn er einmal läuft.

Empfehlenswert ist das allerdings nicht.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 02.07.09 10:28 
Wozu gibt's Code-Folding :P

Und um ehrlich zu sein: Ich hatte schon eine knapp 10kLOC-Prozedur und hab mich dort drin orientieren können. Da Spaghetties aber gegessen und nicht zu Code verarbeitet gehören ist das ja nahezu das schlimmste mögliche Fastfood-Verbrechen ;-) Abgesehen von unserem Rezeptvorschlag an Subway

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.07.09 10:32 
Ich hatte auch schon relativ lange Methoden (wenn auch eher bis vor ein paar Jahren, heute nicht mehr wirklich), aber ich hatte dort nie 50 ends hintereinander oder so.

Aber warten wir doch einfach einmal, ob user profile iconhenny selbst überhaupt noch etwas dazu sagt... ;-)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 02.07.09 11:13 
@henny: Kannst du mal den Code posten oder uns mitteilen, wie die grobe Struktur aussieht? Z.B. so: (?)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
if ... then 
begin 
end else 
begin 
  if ... then 
  begin 
  end else 
  begin
    if ... then
    begin
    end else
    begin
    end
  end 
end
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 02.07.09 21:04 
Ach was, in der C64 Zeit konnte man noch jeden Code nachvollziehen und hatte vor Spagetti keine Angst.

ausblenden 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:
24:
25:
26:
27:
28:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
s: String;
label Anfang, Ende, Start, Weiter, iCountLoeschen, AllesLoeschen, Anzeigen,
Zaehlen;
begin
Goto Anfang;
Start:
if Memo1.Lines.Count > 0 then Goto AllesLoeschen;
Weiter:
if i <> 0 then Goto iCountLoeschen;
Zaehlen:
for i := i to (i + 1) * 10 do s := s + IntToStr(i);
goto Anzeigen;
Anfang:
if Memo1.Lines.Text <> '' then Goto Start;
iCountLoeschen:
i := 0;
goto Zaehlen;
Anzeigen:
ShowMessage(s);
goto Ende;
AllesLoeschen:
{Memo1.Clear;}
Goto Weiter;
Ende:
end;


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt

_________________
Popov
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 02.07.09 21:07 
Naja, bis man den Code verstanden hat, dauerts aber 20 mal so lange wie wenn er ordentlich geschrieben wäre. :lol:

Nachvollziehen kann man jeden Code, die Frage ist immer nur wie schnell. Arbeitszeit usw.
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Do 02.07.09 22:38 
Mittlerweile weiss man doch das Henny etwas schreibfaul ist bei der Problembeschreibung wie auch bei Beantwortungen dazu.
Wie schon des öfteren gesagt Grundlagen sind alles - Crashkurs - den Link erspare ich mir, schon zwanzig mal angefügt. :wink:
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Fr 03.07.09 00:26 
Hallo,

was ich mir da oft erlaube, ohne zu behaupten, das sei ordentlicher Stil:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
{anstatt wie im Lehrbuch}
if FileExists (..) then
  begin
  if FileIsOpen (..) then
    begin
    if Assigned (..) then
      begin
      end;
    end;
  end;

{schreibe ich lieber}
if not FileExists (..) then exit;
if not FileIsOpen (..) then exit;
if not Assigned (..) then exit;


Ich finde (nur ich persönlich! Angriffe zwecklos!) der Anfang einer Prozedur ist so absolut übersichtlich und ich spare mir die begin-end-Orgien.

Es gibt aber Richtlinien, die das verbieten: z.B. dass es für eine Prozedur nur einen Eintritts- und einen Austrittspunkt geben darf. Für umfangreiche Projekte und streng strukturierte Grossfirmen hat das seine Berechtigung.

Gruss Reinhard