[우아한테크코스 백엔드 4기] 레벨1 - "로또" 피드백 필기 정리

헌치·2022년 3월 4일
1

우아한테크코스

목록 보기
11/30
post-thumbnail

로또 피드백

TDD 과정

1) 하드코딩

  • 기본 기능 테스트코드 구현, 하드코딩
import java.util.List;

public class LottoGameTest {
    @Test
    void rank1() {
        LottoGame.start(
                List.of(1, 2, 3, 4, 5, 6),
                List.of(1, 2, 3, 4, 5, 6),
                7
        );
        assertThat(rank).isEqualTo(1);
    }

    //...rank2, rank3...
}


public class LottoGame {
    public static int start(final List<Integer> userLotto,
                            final List<Integer> winningLotto,
                            final int bonusNumber) {
        //Test에 맞게 구현
        int matchCount = 0;
        for (final Integer lotto : userLotto) {
            if (winningLotto.contains(lotto)) {
                matchCount++;
            }
        }

        if (matchCount == 6) {
            return 1;
        }

        if (matchCount == 5 && userLotto.contains(bonusNumber)) {
            return 2;
        }

        if (matchCount == 5) {
            return 3;
        }
        //...꼴등까지...불편
    }
}
  • 통과 못할 조건이 포함된 추가 테스트 구현
import java.util.List;

public class LottoGameTest {
    @Test
    void duplicated() {
        LottoGame.start(
                List.of(1, 1, 1, 1, 1, 1),
                List.of(1, 2, 3, 4, 5, 6),
                7
        );
        assertThat(rank).isEqualTo(1);//???
    }

    @Test
    void over() {
        LottoGame.start(
                List.of(1, 2, 3, 4, 5, 100),//???
                List.of(1, 2, 3, 4, 5, 6),
                7
        );
        assertThat(rank).isEqualTo(2);
    }
}

해당 테스트를 통과하려면?
객체 lottoNumber를 새로 만들어줘야 겠다~!

2) 리팩토링

LottoNumber 테스트 및 구현

  • 0보다 작거나 45보다 큰 값 예외처리

LottoGame 속 인자, 메소드 등에 Integer 대신 LottoNumber로 래핑된 객체 주기

  • 이때 꼭!! 점진적인 리팩터링
    • 메서드 복사 후 내용 수정
    • 이후 원 메서드를 대체해 적용

Rank 구현

  • enum으로 구현
  • 내부에 matchCount, isbonus 변수 생성

3) Tip

명명법

  • 클래스명과 중복 피하기
    • LottoNumber 내부값은 lottoNumber 대신 value로 명명
  • 래핑 전 변수명과 이후 변수명 구분
    • 래핑되지 않은 변수 앞에는 raw를 붙인다
  • 인자 값은 메서드 내 역할에 맞게 명명
    • bonusNumber 대신 number로 명명

가변인자(...)

새로운 메소드/형

  • collect(Collectors.toSet())
    • set 바로 만들 수 있음
  • Rank에서 BiPredicate 사용

4) 고민

  • 인수를 래핑해서 줄까, 날것으로 줄까?
  • 날것으로 주면 클라이언트가 편하지만, 클래스 내부에서 래핑을 해야함

참고자료

profile
🌱 함께 자라는 중입니다 🚀 rerub0831@gmail.com

0개의 댓글