Develope Story

2019-04-09 [java-study] 레이싱게임1단계 스터디

|

기능 요구사항

  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.

  • 실행 규칙은 n대의 자동차가 전진 또는 멈춤 여부를 판단하는 것을 한번의 횟수로 판단한다.

  • 사용자는 몇 대의 자동차로 몇 번 이동을 할 것인지를 입력할 수 있어야 한다.

  • 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다.

  • 자동차의 상태를 화면에 출력한다. 어느 시점에 출력할 것인지에 대한 제약은 없다.

구현중 공부 내용

StringBuilder 사용 이유

  • String : 기존의 문자열에 문자를 추가한다면 새로운 객체를 만들어 지정하고 기존의 문자열 객체는 쓰레기가 된다.
  • StringBuilder : 기존의 문자열 객체의 크기를 증가시켜 값을 더한다. // 동기화 기능 제공 X
  • StringBuffer : 기존의 문자열 객체의 크기를 증가시켜 값을 더한다. // 동기화 기능 제공 O

연산이 증가하면 성능 Builder > Buffer > String

객체지향 생활체조

리뷰 받은 내용

  • 무조건 메소드 접근 제한자 public 으로 하지마라

  • View, Control, Model 세가지로 분류하여 작업하자

  • 어디서든 사용하는 메소드는 util 클래스를 만들어 사용하자

  • 상수에도 접근제한자를 붙이자

  • 배열 대신 List 자료구조를 활용하자

  • get, set 사용을 자제하자

    • String track = car.showTrack("-"); 을 resultView에서 사용하고
      car에는
          
      public String showTrack(String trackShape) {
             StringBuffer track = new StringBuffer();
             for(int i=0; i<position; i++) {
                    track.append(trackShape);
             }
                 
             return track.toString();
      }
      
  • InputView, ResultView 메소드를 static으로 선언하여 객체를 선언하지 않도록하자
  • 객체에 담긴 내용은 객체를 이해하고 구현하도록하자

소스

model

package model;

public class Car {

    private int position;

    public Car() {
        position = 0;
    }

    public void move() {
        position++;
    }

    public String showTrack(char trackShape) {
        StringBuffer track = new StringBuffer();
        for(int i=0; i<position; i++) {
            track.append(trackShape);
        }
        return track.toString();
    }
}
package model;

import util.*;

import java.util.ArrayList;
import java.util.List;

public class RacingGame {

    private final static int CONDITION_TO_MOVE = 4;
    private final static int RANDOM_NUMBER_RANGE = 10;
    private int numberOfAttempts;
    private List<Car> cars;

    public RacingGame() {
        cars = new ArrayList<>();
    }

    public List<Car> playGame() {
        for (int i = 0; i < numberOfAttempts; i++) {
            moveCars();
        }
        return cars;
    }

    public void readyGame(int numberOfCars, int numberOfAttempts) {
        this.numberOfAttempts = numberOfAttempts;
        for (int i = 0; i < numberOfCars; i++) {
            cars.add(new Car());
        }
    }

    private void moveCars() {
        for (Car car : cars) {
            moveOrStopCar(car);
        }
    }

    private boolean canMove(int number) {
        if (number >= CONDITION_TO_MOVE) {
            return true;
        }
        return false;
    }

    private void moveOrStopCar(Car car) {
        if (canMove(RandomGenerator.getRandomNumber(RANDOM_NUMBER_RANGE))) {
            car.move();
        }
    }
}

util

package util;

import java.util.Random;

public class RandomGenerator {
    public static int getRandomNumber(int range) {
        return new Random().nextInt(range);
    }
}

view

package view;

import java.util.Scanner;

public class InputView {

    public static int InputNumberOfCars() {
        System.out.println("자동차 대수는 몇 대 인가요?");
        return new Scanner(System.in).nextInt();
    }

    public static int InputTime() {
        System.out.println("시도할 횟수는 몇 회 인가요?");
        return new Scanner(System.in).nextInt();
    }
}
package view;

import model.Car;
import java.util.List;

public class ResultView {

    private static final char HYPHEN = '-';

    public static void showRacingCarResult(List<Car> cars) {
        for (Car car : cars) {
            System.out.println(car.showTrack(HYPHEN));
        }
    }
}

TDD

import model.Car;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

public class CarTest {

    Car car;

    @Before
    public void setUp() {
        car = new Car();
    }

    @Test
    public void testShowTrack() {
        assertEquals("", car.showTrack('-'));
    }

    @Test
    public void testShowTrackAfterMove() {
        car.move();
        assertEquals("-", car.showTrack('-'));
    }
}
import model.Car;
import model.RacingGame;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

import static org.junit.Assert.*;

public class RacingGameTest {

    RacingGame racingGame;

    @Before
    public void setUp(){
        racingGame = new RacingGame();
    }

    @Test
    public void test준비하지않고PlayGame(){
        List<Car> tmpCar = racingGame.playGame();
        assertEquals(0,tmpCar.size());
    }

    @Test
    public void test준비하고PlayGame(){
        racingGame.readyGame(3,5);
        List<Car> tmpCar = racingGame.playGame();
        assertEquals(3, tmpCar.size());
    }
}

Comments