우아한테크캠프 회고-프리코스02

김병호·2021년 6월 28일

첫번째 야구미션이 끝내고 두번째 프리코스 미션은 자동차 경주 게임이었다.

프리코스 요구사항에는 어플리케이션 요구사항 반영, 객체지향체조, Java Stream을 안쓰기가 있다.
막상 Java Stream을 안쓰니 개발하면서 불편했다. 한줄로 끝날 수 있을 것같은 코드를 for loop을 쓰고 거기에서 객체지향체조를 지키려고 하니 고생을 했다.

https://github.com/etff/java-racingcar-precourse/tree/etff

이번 미션을 하면서 좋았던점은 1급 컬렉션의 유용성이었다.

/**
 * 자동차 목록.
 */
public class Cars {
    private List<Car> cars = new ArrayList<>();

    public Cars(List<Car> cars) {
        this.cars = cars;
    }

    public Cars(Names names) {
        generateCars(names);
    }

    private void generateCars(Names names) {
        for (Name name : names.getNames()) {
            cars.add(new Car(name));
        }
    }

    public Cars move() {
        List<Car> carsRecords = new ArrayList<>();
        for (Car car : cars) {
            Car movedCar = car.move();
            carsRecords.add(movedCar);
        }
        return new Cars(carsRecords);
    }

    public List<Car> getCars() {
        return new ArrayList<>(cars);
    }
}

List 포장하는게 중요할까? 라는 고민을 할 수 있지만, 컬렉션을 포장하면서
객체가 여러 개일때 해야하는 책임들을 1급 컬렉션으로 보낼 수 있었다.
그렇게해서 코드가 읽기 쉬워지고 복잡성을 줄이는 효과를 거둘 수 있었다.

두번째 인상이 깊었던 것은 랜덤한 값 테스트하기이다. 요구사항중에 랜덤하게 생성된 숫자를 기반으로 자동차가 이동을 하는데 이 랜덤값을 어떻게 테스트할 것인가?

처음에 이부분을 고민했을때 랜덤하게 n번해서 테스트 성공하면 랜덤함을 보장할 수 있지 않을까 생각했다.

    @RepeatedTest(50)
    void create() {
        NumberGenerator numberGenerator = new NumberGenerator();

        int number = numberGenerator.generate();
        System.out.println(number);

        assertThat(number >= 0).isTrue();
        assertThat(number <= 9).isTrue();
    }

하지만 테스트를 작성하는 방법을 보면서
테스트 의도에 확률이 담겨 있으므로 신뢰할 수 없는 테스트라는 것을 깨닫게 되었다.

해당 블로그에 나온 것처럼 인터페이스를 사용하고 이동 전략을 테스트가 가능한 방법으로
개발했다면 좀 더 유연한 테스트가 되었을 것같다.

참고: 테스트하기 쉬운 코드로 개발하기

이번 미션에서는 작은 단위로 개발과 테스트를 만들고 개발을 했다.
하지만 결과를 바탕으로 내부구현을 해보는 방법도 도전해보면 새로운 insight를 얻을 수 있지 않았을까 생각이 든다.

2주동안 프리코스를 진행하며 다양하게 객체 설계를 해보았다. 다양한 도전을 하면서 깨닫게 되는 것들이 있었다. 최종합격은 지원서와 지원자의 프리코스 내역을 바탕으로 이루어진다고 한다.

미션을 바탕으로 여러가지 도전했던 프리코스 2주였다.

profile
노력하는 개발자입니다!

0개의 댓글