2010-03-10 5 views
2

J'apprends Java, et je sais que l'une des grandes plaintes concernant les programmeurs débutants est que nous faisons des méthodes très longues et complexes qui devraient être divisées en plusieurs. Eh bien, voici celui que j'ai écrit et est un exemple parfait. :-RÉ.refactorisation de cette fonction en Java

public void buildBall(){ 

     /* sets the x and y value for the center of the canvas */ 
     double i = ((getWidth()/2)); 
     double j = ((getHeight()/2)); 

     /* randomizes the start speed of the ball */ 
     vy = 3.0; 
     vx = rgen.nextDouble(1.0, 3.0); 
     if (rgen.nextBoolean(.05)) vx = -vx;  

     /* creates the ball */ 
     GOval ball = new GOval(i,j,(2 *BALL_RADIUS),(2 * BALL_RADIUS));  
     ball.setFilled(true); 
     ball.setFillColor(Color.RED); 
     add(ball); 


     /* animates the ball */ 
     while(true){ 
      i = (i + (vx* 2)); 
      j = (j + (vy* 2)); 
      if (i > APPLICATION_WIDTH-(2 * BALL_RADIUS)){ 
       vx = -vx;  
      } 

      if (j > APPLICATION_HEIGHT-(2 * BALL_RADIUS)){ 
       vy = -vy; 
      } 

      if (i < 0){ 
       vx = -vx; 
      } 

      if (j < 0){ 
       vy = -vy; 
      } 

      ball.move(vx + vx, vy + vy); 
      pause(10); 

      /* checks the edges of the ball to see if it hits an object */ 
      colider = getElementAt(i, j); 

      if (colider == null){ 
       colider = getElementAt(i + (2*BALL_RADIUS), j); 
       } 
      if (colider == null){ 
       colider = getElementAt(i + (2*BALL_RADIUS), j + (2*BALL_RADIUS)); 
       } 
      if (colider == null){ 
       colider = getElementAt(i, j + (2*BALL_RADIUS)); 
       } 

      /* If the ball hits an object it reverses direction */ 
      if (colider != null){ 
       vy = -vy; 


      /* removes bricks when hit but not the paddle */ 
       if (j < (getHeight() -(PADDLE_Y_OFFSET + PADDLE_HEIGHT))){ 
       remove(colider); 
       } 

      } 

     } 

Vous pouvez voir à partir du titre de la méthode que j'ai commencé avec de bonnes intentions de "construire la balle".

Il y a quelques questions que je courais contre:

Le problème est que je devais passer la balle, donc j'ai créé en boucle. Je ne vois pas d'autre moyen de le faire que de le garder "vrai", ce qui signifie que tout autre code que je crée en dessous de cette boucle ne se produira pas. Je n'ai pas fait la boucle while une fonction différente parce que j'utilisais ces variables i and j. Donc, je ne vois pas comment je peux refactoriser au-delà de cette boucle.

Ma question principale est:

Comment pourrais-je transmettre les valeurs de i and j à une nouvelle méthode: « animateBall » et comment pourrais-je utiliser ball.move(vx + vx, vy + vy); dans cette nouvelle méthode si la balle a été déclarée dans la méthode buildBall ?

Je comprends ce qui est probablement une chose simple d'une meilleure compréhension et la portée des variables arguments qui passe, mais je ne suis pas encore tout à fait ...

+0

Umm ... le mot est écrit "collisionneur" et non "colider". Et il y a beaucoup de problèmes de style avec votre code. –

+1

umm-merci pour votre aide? – Joel

+0

Pouvez-vous être un peu plus précis que ce que vous essayez de faire avec l'objet «boule»? Dites, par exemple, si vous avez un objet de balle, comment voulez-vous qu'il bahave, comme les méthodes devraient avoir un objet balle? De cette façon, il serait plus facile de fournir une solution. – Zaki

Répondre

3

Cette peut être refactorisé en trois méthodes a> construire la boule: créer l'objet balle et définir l'emplacement initial: buildBall() b> animer toute la boucle while à l'exception de la partie du collisionneur animer (Ball ball, vx, vy) c> obtenir le collisionneur getCollider()

Puisque la balle est un objet et que vous définissez déjà i, j comme champs, ils seront passés. Java passe tous les paramètres par valeur. Les objets vivent sur le tas; les références d'objet sont transmises par valeur en tant que paramètres de méthode.

Modifier, a ajouté le code pseudo

class Animator{ 
    void animateBall(){ 
    Ball ball = buildBall(); //Ball will have i,j,radius etc set by this method 
    int vx = randomNumber(); 
    int vy = randomNumber(); 
    moveIt(vx,vy, ball); 
    } 
    void moveIt(int vx, int vy, Ball ball){ 
     while(true){ 
      //move the ball, change i,j fields of ball 
      //check for collission etc 
      Collider collider = getCollider(ball); 
      //change direction based on collider etc. 
     } 
    } 
    Collider getCollider(Ball ball){ 
    //collision code here 
    } 
} 
+0

Droit-j'ai l'idée. Mon problème est 1) comment puis-je passer l'argument de build ball pour animer la balle, et 2) comment cela atteint le collisionneur si la fonction précédente est une boucle while qui ne va jamais faux? – Joel

+0

@Joel, ajouté un pseudo code, espérons que cela aide – saugata

+0

Cela aide beaucoup. Merci de prendre le temps! – Joel

1

Ceci est un peu moins redondant

 colider = getElementAt(i, j); 

      /* If the ball hits an object it reverses direction */ 

     if (colider != null && j < (getHeight() -(PADDLE_Y_OFFSET + PADDLE_HEIGHT))) 
     { 
      vy = -vy; 

     /* removes bricks when hit but not the paddle */ 
      remove(colider); 
     } 


      else 
      { 
       colider = getElementAt(i + (2*BALL_RADIUS), j); 
       colider = getElementAt(i + (2*BALL_RADIUS), j + (2*BALL_RADIUS)); 
       colider = getElementAt(i, j + (2*BALL_RADIUS));  
      } 
+0

sympa, merci! – Joel