오늘 한일

사다리게임 4단계 구현

사다리 3단계는 피드백없이 merge 됐다. 오늘은 3시간 정도 투자해서 4단계를 구현하고 피드백을 요청했다.

4단계는 게임 난이도를 추가하여 난이도에 따라 사다리 높이, 라인 연결 확률을 달리 해야 한다. 기존 구조에서는 사다리 일급 콜렉션이 사다리 생성기를 주입받아 사용하는 방식이라 난이도와 연결하기가 어려웠다.

public LaddersAndPrizes(LaddersGenerator laddersGenerator, int height, Prizes prizes) {
    if (ladders.lineSize() != prizes.size()) {
        throw new IllegalArgumentException();
    }

    this.prizes = prizes;
    this.ladders = laddersGenerator.generate(height, prizes.size());
}

LaddersGenerator 인터페이스는 높이와 길이를 매개변수로 받아 사다리를 생성한다. 게임 난이도를 열거형으로 구현하고 각 난이도의 열거형 상수(enum constant)가 사다리 생성기 역할을 해야한다. 그러나, 각 난이도의 사다리 높이가 고정되어있기 때문에 API가 일치하지 않아 LaddersGenerator를 구현할 수가 없다.

public enum LadderGameLevel implements LaddersGenerator {
    GOOD("상", 20, 70),
    AVERAGE("중", 10, 40),
    POOR("하", 5, 20);

    //.......
    private final int height;

    @Override
    public Ladders generate(int height, int lineSize) {
        // 각 난이도마다 높이가 고정된 상태, height 매개변수가 필요없음
        return null;
    }
}

게다가, 난이도 열거형의 멤버 변수가 3개나 되면서 객체지향 생활 체조 원칙(멤버 변수 2개 이하)을 지킬 수 없게 됐다.

// 경품사다리
public LaddersAndPrizes(Ladders ladders, Prizes prizes) {
    if (ladders.lineSize() != prizes.size()) {
        throw new IllegalArgumentException();
    }

    this.prizes = prizes;
    this.ladders = ladders;
}

// 게임 난이도
public enum LadderGameLevel {
    GOOD("상", new FixingHeightProbabilityBasedLineGenerator(20, 70)),
    AVERAGE("중", new FixingHeightProbabilityBasedLineGenerator(10, 40)),
    POOR("하", new FixingHeightProbabilityBasedLineGenerator(5, 20));

    // ...

    public Ladders createLadders(int lineSize) {
        return laddersGenerator.generate(lineSize);
    }
}

결국, 경품사다리의 생성자에서 사다리 일급 콜렉션을 다이렉트로 주입받는 방식으로 변경했다. 게임 난이도의 멤버 변수가 3개인 문제의 경우 고정 높이 사다리 생성기를 새로 추가해서 포장했다.

백준 DP: 포도주 시식, 가장 긴 증가 부분 수열

두 문제 모두 다른 사람의 설명을 참고해서 풀었다. 뭔가 한 번 더 생각해보면 풀 수 있을 것 같으면서도 결국 답을 찾지 못하고 제자리 걸음이라 1시간 이내에 풀 수가 없었다.

오늘 느낀점

자동차 경주와 로또 게임 과제는 그럭저럭 구현할 수 있는 정도였는데, 사다리 게임부터는 갑자기 난이도가 확 올라간 느낌이다. 그냥 구현하기도 어려운 듯 한데, TDD로 개발하면서 객체지향 생활 체조 원칙도 준수하면서 SOLID 원칙도 조금씩 따져보고 하다보니 더욱 그런 것 같다. 그래도 이 강의를 수강하기 전에 비해 지금의 나는 많이 성장했다고 느낀다.

내일 할일

  • qna 2단계 구현
  • 백준 dp 2문제
  • 소프트웨어 악취를 제거하는 리팩토링: 불필요한 추상화, 미활용 추상화 공부
  • 플러터 1/4/7/14 앱 기능 설계