📍오늘 한 일
- 로또 게임 Step2 구현과 PR (Step2 소스코드, Step2 PR)
- 로또 게임 Step3 1/3 구현
- 글 작성 (IntelliJ + Gradle + Junit5 환경에서 테스트 실행 시 @DisplayName 이 테스트 결과에 나오지 않는 경우, 해결 방법 🛠)
- 티스토리 스킨 추가 (highlight.js + 폰트 적용)
✅ 생각과 코드 리뷰
✅ enum 사용
로또 당첨 순위(Rank) 표현하기 위해 enum을 사용했다. 이유는 다음과 같다.
1. Rank(순위) 관련 데이터를 한 번에 묶기 위해서
하나의 데이터, 순위만 가지고 있는 것이 아닌 당첨 금액도 함께 가지고 있고 싶었다.
2. 순위 결정 로직이 enum 안에
Rank.of(당첨 개수, 보너스 당첨 번호 여부)로 넘겨주면 enum 스스로 계산하여 해당하는 Rank를 리턴할 수 있었다. 상태와 행동을 한 번에 묶을 수 있었다.
3. toString 오버라이딩
오버 라이딩을 통해 해당 enum의 정보를 외부에 쉽게 표현할 수 있었다.
public enum Rank {
FIRST(6, 2_000_000_000L),
SECOND(5, 30_000_000L),
THIRD(5, 1_500_000L),
FOURTH(4, 50_000L),
FIFTH(3, 5_000L),
FAILED(-1, 0L);
public static Rank of(int matchCount, boolean matchBonus) {
switch (matchCount) {
case 6:
return FIRST;
case 5:
return matchBonus ? SECOND : THIRD;
}
}
@Override
public String toString() {
if (this == SECOND) {
return String.format("%d개 일치, 보너스 볼 일치(%d원)", countOfMatch, reward);
}
return String.format("%d개 일치, (%d원)", countOfMatch, reward);
}
}
위 코드의 문제가 있다면 FAILED에 아무 생각 없이 당첨 개수가 -1로 작성했다. 0으로 바꿔야겠다.
✅ for vs stream 가독성 싸움
생각 : 성능이 중요하다면 for문을 사용, 가독성은 stream vs for 중 더 좋은 걸로 선택
처음 stream으로 작성했지만 entry.getKey().getReward() * entry.getValue()에 가독성이 좋지 못한 거 같아 for문으로 변경해보았다.
막상 바꾸니 stream이 더 좋아 보이는..
public class LottoGameResults {
private long getTotalReward() {
return rankCounts.entrySet().stream()
.mapToLong(entry -> entry.getKey().getReward() * entry.getValue())
.sum();
}
private long getTotalRewards() {
long totalRewards = 0;
for (Map.Entry<Rank, Integer> entry : rankCounts.entrySet()) {
long reward = entry.getKey().getReward();
int count = entry.getValue();
long totalReward = reward * count;
totalRewards += totalReward;
}
return totalRewards;
}
}
호눅스에게도 질문을 드려보니 이전의 stream이 좋다는 의견을 받았다.
'📝 회고 > ✅ 22년 회고' 카테고리의 다른 글
[주간 회고] 22.02. 4주차 🔢 (0) | 2022.02.28 |
---|---|
[일일 회고] 22.02.24 - 랜덤 테스트 / 스프링 시작 / 김영한님의 Q&A (0) | 2022.02.24 |
[일일 회고] 22.02.21~22 페어 프로그래밍(아이엠 그라운드 자기소개하기도 좋지만 그라운드 룰(Ground Rule)!) & 일급 컬렉션 🤝 🥇 (2) | 2022.02.22 |
[주간 회고] 22.02. 3주차 ✅ 🥘 (2) | 2022.02.20 |
[일일 회고] 22.02.16~17 - DCI 패턴의 테스트 코드 적용하기!, 개발에 정답은 없다. 그래서 ~? (4) | 2022.02.17 |
댓글