Я изучаю 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?
Я понимаю, что это, вероятно, простая вещь для лучшего понимания области переменных и передачи аргументов, но я еще не совсем там ...