# Run- Methode zu überladen



## MaZeFrJoTh (6. Jul 2011)

Hallo Leute, ich hab mal wieder eine Frage:
Ich habe meine Run- Methode von Zeit zu Zeit erweitert und das Ergebniss ist eine sehr überladen und sehr schlecht programmierte Run- Methode. Wie könnte man die unten stehende Methode ändern, ohne das man auf Funktionen verzichten muss?


```
public void run(){ 
            while(Fenster.isVisible()){ 
                if(gestartet == true){
                    for(int n = 1; n <= 44 && gestartet == true; n++){
                        for(int i = 1; i <= 250 && gestartet == true; i++){
                            BewegeObjekte();
                            if(koords[Zufall[n]].y <= 800){
                                koords[Zufall[n]].y = koords[Zufall[n]].y + 3;
                                repaint();
                            }
                            if(koords[Zufall[n]].y >= 705 && koords[Zufall[n]].y <= 720){
                                if(koords[Zufall[n]].x >= o - 5 && koords[Zufall[n]].x <= o + 125){
                                    PunkteErhöhen();
                                    koords[Zufall[n]].y = 1000;
                                }
                            }
                            try{
                                Thread.sleep(4);                                
                            }
                            catch(InterruptedException e){}
                        }
                        if(30 - timer.Zeit() <= 0){
                            repaint();
                            StoppeSpiel();
                        }
                    }                    
                }
                repaint();
            }
```

Ich weiß ihr werdet in Ohmacht fallen wenn ihr meinen Code liest aber trotzdem wäre ich euch dankbar wenn ihr mir helft.


----------



## SlaterB (6. Jul 2011)

Zeile 17-20 können sofort durch eine Hilfsmethode Helper.sleep(4); ersetzt werden,
das try/catch hilft niemand, verstecke es in der Methode,

sleep() unter 30 ms sehe ich persönlich übrigens kritisch, so genau geht das nicht,

--------

koords[Zufall[n]] musst du nix 10x schreiben,
lege eine Variable k an
k = koords[Zufall[n]];
und dann immer nur k schreiben

-----

dann könntes du noch auftrennen


```
run() {
while (true) 
  if gestart
     run2();
  repaint();
}


run2() {
   ..
}
```
und hast so zwei Verschachtelungsebenen aufgeräumt,

an sich sind 30 Zeilen Code aber noch von der harmlosen Sorte, andere verziehen bei 300 keine Miene


----------



## twseitex (6. Jul 2011)

Hi,
nach meiner Erfahrung sind Rekursionen im Thread freundlicher als Schleifen.
Für Rekursionsroutinen möglichst keine lokalen Variablen verwenden, so dass
weniger aufzuräumen ist. Funktionen bei zeitkritischem Verhalten nicht
per Call sondern im Code hinterlegen.
Java räumt leider auf, wann es will.
Wer malt, muss Ressourcen unbedingt einsparen, da Swing und Co.
(ausser AWT) nicht echtzeitfähig sind.

Cu.


----------



## MaZeFrJoTh (7. Jul 2011)

twseitex hat gesagt.:


> Hi,
> nach meiner Erfahrung sind Rekursionen im Thread freundlicher als Schleifen.
> Für Rekursionsroutinen möglichst keine lokalen Variablen verwenden, so dass
> weniger aufzuräumen ist. Funktionen bei zeitkritischem Verhalten nicht
> ...



Das hört sich schon mal gut an, aber was heißt das konkret. Was muss ich an meinem aktuellen Code ändern?

Danke schon im Voraus.


----------



## SlaterB (8. Jul 2011)

zur Rekursion:
für mich klingt das statt while-true-Schleife am Ende einer Methode dieselbe Methode oder eben run() neu aufrufen,
empfehlen kann ich das nicht, das müllt den Speicher zu und nach ein paar Tausend Schritten gibts ne Exception,
mit Schleifendurchläufen mehrmals pro Sekunde ist das auch bald erreicht, unter einer Stunde


----------

