Autor Beitrag
Starido
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 13:27 
Moinmoin Community habe hier eine kleine Frage, bin noch Anfänger.

Mein eigenes kleines Programm hat die 10.000 Zeilen überboten und nun leidet die Übersicht,
ich habe mich nun entschlossen den Quelltext der einzelnen Button.Clicks in kleinere private proceduren zu packen um noch ein wenig die Übersicht zu behalten.

Beim einen Button zum Beispiel habe ich nun aus 2.000 Zeilen 5 gemacht, sprich die 5 einzelnen proceduren.
Die Frage beeinflusst das i-wie die Flüssigkeit des Programms sollte ich es weiter so machen sprich weiter viele private prozeduren zu erstellen, oder hat es sonst i-welche Risiken?

Es handelt sich beim Programm um ein/e Spiel/Funktion mit sehr vielen repeat/until,if then Funktionen


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private
    { Private-Deklarationen }
    procedure Menuwechsel;
    procedure Motorenreperatur;
    procedure Wetterwechsel;
    procedure Startreifen;
    procedure KITanken; 
....

procedure THomeF1Manager.AktionClick(Sender: TObject);
begin
Menuwechsel;
Motorenwechsel;
Wetterwechsel;
Startreifen;
KITanken;
end;



mfg Fabian (Starido)

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 24.04.10 13:43 
Hallo und :welcome: in der Entwickler-Ecke

Was du da vorhast, ist höchstwahrscheinlich eine sehr gute Idee. :zustimm:

Es gibt sogar Leute, die die Ansicht vertreten, dass eine Funktion oder Prozedur nie länger als eine Bildschirmseite sein sollte. Wenn doch, sollte man den Code in Teilfunktionen aufsplitten. Ganz so eng sehe ich das nicht, aber eine Procedure mit 2000 Zeilen ist dann doch etwas zu lang für meinen Geschmack. Und wenn die Aufteilung problemlos möglich ist, dann sollte man das auch tun.

Bei einem Funktionsaufruf gibt es zwar afaik einen kleinen Overhead, der aber in fast allen Fällen zu vernachlässigen ist.

_________________
We are, we were and will not be.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Sa 24.04.10 15:06 
Ansonsten gibt es dafür aber auch in Delphi das Schlüsselwort inline:

ausblenden Delphi-Quelltext
1:
function Irgendwas: Integer; inline;					


bei der Deklaration sollte jegliche Performance-Probleme beheben.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 24.04.10 15:13 
Ja, aber das sollte man hier wohl kaum anwenden. ;-)

_________________
We are, we were and will not be.
Starido Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 15:39 
Danke für die schnelle Antwort ergibt sich mir nurnoch ein Problem, dadurch das mein Programm immer größer wurde dauert es nun an die 30 Minuten bis die Schleife einmal durchläuft, gibt es da Tricks wie man das verkürzen könnte auf 10 Minuten wenigstens?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 24.04.10 15:44 
Das kommt ganz darauf an, was da passiert. Für viele Probleme gibt es schnelle und langsame Algorithmen. Und auch beim Code selbst kann man oft was drehen. Wenn du z.B. viele Application.ProcessMessages in deinem Schleifencode hast, ist das sehr oft eine starke Bremse, oder ungeschickt implementiertes Leeren von großen "TStringList" , oder ...

_________________
We are, we were and will not be.
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Sa 24.04.10 15:44 
Wir können dir da ohne Code nicht helfen. :roll: Aber ich denke bei der erdrückenden Menge Code würde eine Prozedur reichen.

_________________
Die Lösung ist nicht siebzehn.
Starido Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 15:54 
Also es sind c.a 200 if then bedingungen in jeder repeat until schleife die von 1.000.000 bis 0 (Integer)(Extended) geht drin davon hatte ich erst 3 jetzt 2 drin

Das klingt selbst für mich schon sehr bremsend.
der quelltext wäre hier zu posten viel zu lang.
Das Problem ich bekomme es im moment nicht kürzer da sich die anweisung zwar jeweils 20 mal wiederholen und nur die variablen sich ändern, wovon auch c.a. 100 in den jeweiligen schleifen drin sind.
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: Sa 24.04.10 15:59 
Mindestens einen Ausschnitt brauchen wir schon.

Aber nach deiner Beschreibung denke ich einmal:
- Arrays
- Keine direkte Arbeit mit der VCL

_________________
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.
Starido Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 16:03 
Dies der größte Teil, der 20 mal in der einen Schleife steht jeweils nur die Zahl hinter den Variablen geändert

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
x:=1000000;
repeat
x:=x-1;
...

if ZU3 = X then begin
   if Aktion.Caption = 'Rennen!' then begin
   if Z3 = 1 then begin
   EgMemo.Lines.Add('Motorschaden');
   Renninfo.Lines.Add(''+(F3)+' hat einen Motorschaden');
   DNF3:=1;
   M3:=5000;
   end;
   if DNF3 = 0 then begin
   if ZF3 > 5 then begin
   ReMemo.Lines.Add(''+(F3)+'');
   Tankstops.Lines.Add(''+floattostr(TA3)+'');
   if XY = 0 then begin
   XY:=XY+1;
   ZX:=ZU3;
   EgMemo.Lines.Add(''+floattostr(ZU3)+'');
   end
   else begin
   ZE3:=ZX-ZU3;
   ZE3:=ZE3/1000;
   EgMemo.Lines.Add('+'+floattostr(ZE3)+'');
   end;
   if RV2=0 then begin
   Reifen.Lines.Add('B');
   end;
   if RV2=1 then begin
   Reifen.Lines.Add('M');
   end;
   end;
   if ZF3 = 0 then begin
   Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' bleibt im Kiesbett stecken, das Rennen ist für ihn beendet');
   DNF3:=1;
   ZF3:=100;
   end;
   if ZF3 = 1 then begin
   Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' kollidiert, sein Frontflügel ist ab');
   ZU3:=ZU3-25000;
   TA3:=TA3+1;
   ZF3:=100;
   end;
   if ZF3 = 2 then begin
   Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' hat sich gedreht');
   ZU3:=ZU3-5000;
   ZF3:=100;
   end;
   if ZF3 = 3 then begin
   Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' berührt seinen Vordermann, beide rutschen von der Strecke');
   ZU3:=ZU3-2500;
   ZF3:=100;
   end;
   if ZF3 > 3 then begin
   if ZF3 < 6 then begin
   Renninfo.Lines.Add('Runde '+floattostr(RU)+' - '+(F3)+' war kurz neben der Strecke');
   ZU3:=ZU3-1000;
   ZF3:=100;
   end;
   end;
   if Y=1 then begin
    P3:=P3+PR1;
    GS3:=GS3+1;
    end;
    if Y=2 then begin
    P3:=P3+PR2;
    if ZU3 > 10 then begin
    if TeamS = 1 then begin
    DominS:=DominS+1;
    end;
    end;
    end;
    if Y=3 then begin
    P3:=P3+PR3;
    end;
    if Y=4 then begin
    P3:=P3+PR4;
    end;
    if Y=5 then begin
    P3:=P3+PR5;
    end;
    if Y=6 then begin
    P3:=P3+PR6;
    end;
    if Y=7 then begin
    P3:=P3+PR7;
    end;
    if Y=8 then begin
    P3:=P3+PR8;
    end;
    if Y=9 then begin
    P3:=P3+PR9;
    end;
    if Y=10 then begin
    P3:=P3+PR10;
    end;
    if Aktion.Visible = False then begin
    if Y < 11 then begin
    STR3:=STR3+11-Y;
    end;
    end;
    Y:=Y+1;
   end;
   end;
   end;
...

until x=0


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 24.04.10 16:03 
Da stellt sich dann die Frage: Muss das 1.000.000 bis 0 wirklich sein? Was willst du damit erreichen? Was soll dein Code machen? Dann kann man evtl. darüber nachdenken, wie man das mit anderen Mitteln erreicht.

Primitives Beispiel: Zahlen sortieren. Man kann alle Permutationen durchprobieren, bis die Zahlen sortiert sind (ich nenne das Verfahren einfach mal "optimiertes Bogosort" :mrgreen:). Daran rechnet dein Programm dann meinetwegen zwei Stunden. Nimmst du Bubblesort, dauert das noch 5 Minuten. Und wenn du Quicksort nimmst, sind die Zahlen in Nullkommanix sortiert (meistens jedenfalls).

_________________
We are, we were and will not be.
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Sa 24.04.10 16:03 
Wie sind denn deine if-Abfragen aufgebaut?

Edit: okay, ich schaus mir grad an

1. Ich würde keine Schleife von 10000000 bis 0 durchzählen, sondern mir ein privates Feld FRaceStopped definieren und dann mit while not FRaceStopped arbeiten. Sobald der User das Rennen beenden will, setzt du FRaceStopped auf true.

2. Was bedeuten deine Variablen? Benutze am beste etwas längere Namen, die dafür aussagekräftiger sind (oder Kommentare)

3. Kann man PR3..PR10 nicht durch ein Array ausdrücken?

4. Und hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if Y=3 then begin 
P3:=P3+PR3; 
end
if Y=4 then begin 
P3:=P3+PR4; 
[...]
end;


kannst du auch mit case arbeiten!

5. Benutze doch für jeden Wagen ein eigenes Objekt. Dann kannst du mit einem array of car arbeiten.

Beispiel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type TParts = set of (pFrontflügel, pMotor...); // weiß jetzt nicht wie das alles auf Englisch heißt
class TCar = class
  private
    FSpeed : Word;
    FDead : Boolean;
    FParts : TParts;
    [...]
end;

_________________
Die Lösung ist nicht siebzehn.


Zuletzt bearbeitet von Mitmischer 1703 am Sa 24.04.10 16:15, insgesamt 3-mal bearbeitet
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 24.04.10 16:11 
Kleine Offtopic-Frage: Sieht der gesamte Code so aus? Mehrere 100 oder gar 1000 Zeilen in der Art?

Respekt, dass du da noch durchsteigst. :shock:

Was mir so auf Anhieb auffällt: Schau dir mal case...of an. Damit kannst du dir schonmal eine ganze Reihe Ifs sparen. Generell würde ich aber sagen: Schmeiß dein Konzept über den Haufen und versuche, das mal etwas zu sortieren. Stichwort Objekt-orientiertes Programmieren. Dürfte hier angebracht sein. ;-)

_________________
We are, we were and will not be.
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: Sa 24.04.10 16:15 
Also anhand deiness Beispiels würde ich schon einmal stark zur Nutzung von Arrays tendieren. Statt also 20 Variablen ZU1 bis ZU20 zu haben, hast Du eine Variable ZU und kannst auf die 20 Werte dann mit ZU[i] zugreifen, wobei i dein Index auf das Array ist.

Gleiches geht z.B. auch für die Variablen P[i], PR[i], ... Im Falle von PR können dann die Abfragen sogar entfallen, da du einfach P[i] := P[i] + PR[Y]; machen kannst.

Bzgl. des Memo's ggf. ein Tipp: Das Updaten der VCL kann sehr lange dauern. Daher sollte man Änderungen an VCL-Komponenten dieser immer ankündigen, so dass diese insgesamt neugezeichnet werden. Bei einem Memo geht das mit TMemo.Lines.BeginUpdate; und TMemo.Lines.EndUpdate; I.d.R. bringt das schon mal einiges an Performance, wenn regelmäßige Änderungen stattfinden UND man durch diese Anweisungen Änderungen wirklich bündelt..

_________________
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.
Starido Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 16:16 
Die Variablen sind abkürzungen, PR=Punkte zu Reglement,F=Fahrer,Z=Zeit,ZE=ZEitgesammt,ZU=ZeitUnterschied,B=Benzin

schaue mir jetzt erstmal das case of und die anderen dinge an,
ja mein ganzes Programm ist so aufgebaut, ich wette von den 10.000 Zeilen sind nur 500-1.000 wirklich nötig aber da ich noch neuling bin und die meißten befehle nicht kenne habe ich bisher andere lösungswege gesucht die meißt sehr lang sind.

Also Ich will die Werte sortieren, hab mir alle möglichkeiten ma angesehen, hat meißt nicht geklappt, bin dann auf diese möglichkeit umgestiegen, die werte gehen in den 6 stelligen bereich deswegen von 1.000.000 bis 0.
der Fahrer der den höchsten wert hat durchläuft als erstes, darstellung umrechnung der zeit in rückstand, ermittlung benzin,motorenzustand etc.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 24.04.10 16:22 
user profile iconStarido hat folgendes geschrieben Zum zitierten Posting springen:

Also Ich will die Werte sortieren, hab mir alle möglichkeiten ma angesehen, hat meißt nicht geklappt, bin dann auf diese möglichkeit umgestiegen, die werte gehen in den 6 stelligen bereich deswegen von 1.000.000 bis 0.
der Fahrer der den höchsten wert hat durchläuft als erstes, darstellung umrechnung der zeit in rückstand, ermittlung benzin,motorenzustand etc.


Heißt das, ich habe mit dem Sortieren einen Treffer gelandet :shock:? Weil du 20 Werte im Bereich von 0 bis 1.000.000 nicht sortieren kannst, testest du alle 1 Million Wertemöglichkeiten durch um dann bei einem "Treffer" eine bestimmte Aktion durchzuführen?

Wow. Das ist Worst-Case-Programmierung in Reinstform. :eyecrazy:

_________________
We are, we were and will not be.
Starido Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 16:28 
Genau so ist es.
Ich war sehr ungeduldig beim verstehen von Array,Case of, das ichs mir kompliziert gemacht habe da ich i-was machen wollte.
Wie gesagt ich schau mir das jetzt erstma an, das ergebniss zeige ich dann, bei Fragen melde ich mich.

PS:Passiert mir nicht zum ersten mal, Habe auch meine alte Speicherfunktion, jede einzelne Variable einzelnd in ne .txt datei gepackt da ichs anders net verstanden hatte, nur bei mittlerweile knapp 500 variablen ist mir das zu anstrengend, mehr dazu später.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 24.04.10 16:38 
Mal 6 Vorschläge:

:arrow: Kommentare! Ich bin zwar nicht der Meinung, dass eine Funktion mehr Kommentarzeilen haben sollte als Quellcode, aber so ne grobe Beschreibung was da passiert wäre nicht verkehrt. Und wenn es nur ein Wort ist. Besonders bei proceduren, die lange aber nicht verschachtelt sind, kann man prima einzelne Blöcke mit Kommentaren bilden.

z.B.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//Fahrer einsteigen
[...]

//Anschnallen
[...]

//Auto starten
[...]


Hilft ungemein.

:arrow: Einrücken. Mitunder auch mal 3-4 Tabs. Damit trenne ich die einzelnen verschachtelten while Ausdrücke mehr von einander ab. In deinem Beispielcode z.B. die Befehle in der If-Anweisung einrücken. Und die If-Anweisung evtl auch nochmal
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if ZU3 = X then begin
    if Aktion.Caption = 'Rennen!' then begin
        if Z3 = 1 then begin
            EgMemo.Lines.Add('Motorschaden');
            Renninfo.Lines.Add(''+(F3)+' hat einen Motorschaden');
            DNF3:=1;
            M3:=5000;
        end;
...


:arrow: Andere Units machen. Nenn die Unit z.B. Auto, lagere dort proceduren aus. Du kannst dann (ohne Klasse für den Anfang) schreiben Auto.Auftanken(500); usw. Hilft auch ungemein die dummen (sry) Variablennamen zu ersetzen.

:arrow: Um Variablen zu "packen" kannst du auch ein Record verwenden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type TAuto=record
   Tank: integer;
   Geschwindigkeit: TPoint;
   Position: TPoint;
end;

var Auto: TAuto;
[...]
 Auto.Tank:=Auto.Tank+500;


:arrow: Variablennamen: Wenn du viele verschiedene Variablen auf einmal verwendest, dann kürze sie nach möglichkeit nicht so ab ^^ Zur Not hat bei mir ne Variable mal 20 Zeichen, hauptsache ich weiß, was sie bedeutet.

:arrow: Profiversion: Das programm in einzelne Klassen auslagern. Aber Achtung! Das kostet ne Menge Zeit. Ich hab früher in deinem Stil nen Siedler II Clone in 2Wochen geschrieben. Später hab ich dann den Code durch bessere Mittel um 50% gekürzt. Problem war, es waren diverse Bugs drin, die ich niemals wieder gefunden hab. Lag auch daran, dass ich Funktionen MacheDiesUndDasA und MacheDiesUndDasB hatte, und man aus verschiedenen Situationen ne andre Aufrufen musste :mrgreen: Das ist böse. Aber heute, schön sauber mit Klassen, brauch ich deutlich länger für alles. Dafür hab ich seltenst Bugs, die ich nicht schnell lokalisieren kann.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Starido Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 24.04.10 17:17 
Bevor ich jetzt hier alles falsch mache, habe mich an den arrays versucht und dies ist dabei herausgekommen bei einer funktion die zuvor über 200 Zeilen ging

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:
29:
30:
procedure TFormel1Manager.Zeitenberechnungen;
begin

 for i:=1 to 21 do begin
  if Reifenvertrag[i] = 0 then begin
  RT[i]:=S2*60;
  end;
   if Reifenvertrag[i] = 1 then begin
   RT[i]:=S1*60;
   end;

    Motor[i]:=Motor[i]-S1*2-random(8);
    Benzinmenge[i]:=Benzinmenge[i]-3;
    Zeiten[i]:=Fahrerstaerken[i]+Teamstaerken[i];
    RundeGetroffen[i]:=random(12)+11;
    Zeiten[i]:=Zeiten[i]*RundeGetroffen[i]-Fronteinstellung[i]-Heckeinstellung[i];
    Zeiten[i]:=Zeiten[i]-Reifenkompalibität[i]-Benzinmenge[i]-Wettereinfluss[i];
    Zufallsereigniss[i]:=random(500);

     if Aktion.Caption = 'Rennen!' then begin
     Zeitunterschied[i]:=Zeitunterschied[i]+Zeiten[i];
     end;

      if Motor[i] < 1 then begin
      Zeit[i]:=1;
      end;

 end;                                                                           //Gefahrene Runde

end;
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Sa 24.04.10 17:33 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Mal 6 Vorschläge:

:arrow: Kommentare! Ich bin zwar nicht der Meinung, dass eine Funktion mehr Kommentarzeilen haben sollte als Quellcode, aber so ne grobe Beschreibung was da passiert wäre nicht verkehrt. Und wenn es nur ein Wort ist. Besonders bei proceduren, die lange aber nicht verschachtelt sind, kann man prima einzelne Blöcke mit Kommentaren bilden.

z.B.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//Fahrer einsteigen
[...]

//Anschnallen
[...]

//Auto starten
[...]


Hilft ungemein.


Jap.

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
:arrow: Einrücken. Mitunder auch mal 3-4 Tabs. Damit trenne ich die einzelnen verschachtelten while Ausdrücke mehr von einander ab. In deinem Beispielcode z.B. die Befehle in der If-Anweisung einrücken. Und die If-Anweisung evtl auch nochmal
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if ZU3 = X then begin
    if Aktion.Caption = 'Rennen!' then begin
        if Z3 = 1 then begin
            EgMemo.Lines.Add('Motorschaden');
            Renninfo.Lines.Add(''+(F3)+' hat einen Motorschaden');
            DNF3:=1;
            M3:=5000;
        end;
...


Hmm, also ich rücke nicht mit Tab ein, sondern mit einem Leerzeichen. Finde ich lesbarer, ist wohl Geschmackssache.


user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:

:arrow: Um Variablen zu "packen" kannst du auch ein Record verwenden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type TAuto=record
   Tank: integer;
   Geschwindigkeit: TPoint;
   Position: TPoint;
end;

var Auto: TAuto;
[...]
 Auto.Tank:=Auto.Tank+500;


Öhm... Geschwindigkeit als TPoint? Und ich würde kein Record, sondern eine Klasse benutzen. Damit du Prozeduren (und vor allem Properties z.B. zum Abfangen von negativer Geschwindigkeit) hast, das macht das ganze noch lesbarer und sicherer.

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
:arrow: Variablennamen: Wenn du viele verschiedene Variablen auf einmal verwendest, dann kürze sie nach möglichkeit nicht so ab ^^ Zur Not hat bei mir ne Variable mal 20 Zeichen, hauptsache ich weiß, was sie bedeutet.


Bei meinen Variablennamen fehlen manchmal Vokale^^


user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
:arrow: Profiversion: Das programm in einzelne Klassen auslagern. Aber Achtung! Das kostet ne Menge Zeit. Ich hab früher in deinem Stil nen Siedler II Clone in 2Wochen geschrieben. Später hab ich dann den Code durch bessere Mittel um 50% gekürzt. Problem war, es waren diverse Bugs drin, die ich niemals wieder gefunden hab. Lag auch daran, dass ich Funktionen MacheDiesUndDasA und MacheDiesUndDasB hatte, und man aus verschiedenen Situationen ne andre Aufrufen musste :mrgreen: Das ist böse. Aber heute, schön sauber mit Klassen, brauch ich deutlich länger für alles. Dafür hab ich seltenst Bugs, die ich nicht schnell lokalisieren kann.


Absolut dafür!!! Klassen sind doch das Schöne an Delphi, sonst kannste ja gleich C++ nehmen.

_________________
Die Lösung ist nicht siebzehn.