2019-04-09 [java-study] 레이싱게임1단계 스터디
09 Apr 2019 | java TDD기능 요구사항
-
주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
-
실행 규칙은 n대의 자동차가 전진 또는 멈춤 여부를 판단하는 것을 한번의 횟수로 판단한다.
-
사용자는 몇 대의 자동차로 몇 번 이동을 할 것인지를 입력할 수 있어야 한다.
-
전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다.
-
자동차의 상태를 화면에 출력한다. 어느 시점에 출력할 것인지에 대한 제약은 없다.
구현중 공부 내용
StringBuilder 사용 이유
String
: 기존의 문자열에 문자를 추가한다면 새로운 객체를 만들어 지정하고 기존의 문자열 객체는 쓰레기가 된다.StringBuilder
: 기존의 문자열 객체의 크기를 증가시켜 값을 더한다. // 동기화 기능 제공 XStringBuffer
: 기존의 문자열 객체의 크기를 증가시켜 값을 더한다. // 동기화 기능 제공 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