рефакторинг этой функции в Java - PullRequest
2 голосов
/ 10 марта 2010

Я изучаю Java, и я знаю, что одна из самых больших претензий к начинающим программистам заключается в том, что мы делаем очень длинные и сложные методы, которые нужно разбить на несколько. Ну вот один из тех, что я написал, и это прекрасный пример. :. -D

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);
                }

            }

        }

Вы можете увидеть из названия метода, который я начал с благими намерениями "построить мяч".

Есть несколько проблем, с которыми я столкнулся:

Проблема в том, что тогда мне нужно было переместить мяч, поэтому я создал цикл while. Я не вижу другого способа сделать это, кроме как сохранить его «true», так что никакого другого кода, который я создаю ниже этого цикла, не произойдет. Я не сделал цикл while другой функцией, потому что я использовал эти переменные i and j.

Так что я не вижу, как я могу рефакторинг за пределами этого цикла.

Итак, мой главный вопрос:

Как бы я передал значения i and j новому методу: "animateBall" и как бы я использовал ball.move(vx + vx, vy + vy); в этом новом методе, если ball был объявлен в методе buildBall?

Я понимаю, что это, вероятно, простая вещь для лучшего понимания области переменных и передачи аргументов, но я еще не совсем там ...

Ответы [ 2 ]

3 голосов
/ 10 марта 2010

Это может быть переработано в три метода a> build ball: создать объект ball и установить начальное местоположение: buildBall () b> анимация всего цикла while, кроме анимации части коллайдера (Ball ball, vx, vy) c> получить коллайдер getCollider ()

Поскольку ball - это объект, а вы уже устанавливаете i, j в качестве его полей, они будут пропущены. Java передает все параметры по значению. Объекты живут в куче; ссылки на объекты передаются по значению в качестве параметров метода.

Редактировать, добавлен псевдокод

    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
    }
}
1 голос
/ 10 марта 2010

Это немного менее избыточно

       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));      
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...