한짤 요약
Source Code : https://github.com/JangAJang/WoowaCourse_Preview/tree/main/3주차_로또_re
이번엔 3주차 로또게임을 다시 풀어보았다.
사실 저번 리뷰를 봤다면 알 수 있지만, 상당히 마음에 들지 않는 결과가 나왔다.
그런데, 이번 짤은 괜찮잖아? 만족하긴 했다. (물론 고칠게 없다는 것은 아니다.)
코드의 기능목록 작성후 도메인 로직 테스트코드를 전부 끝내고 코드를 작성하기 시작했다.
저번에 아쉬웠던 enum, Exception에 따른 행동방식을 고치려고 노력했다.
사실 저번 주차부터 생성자를 최대한 써먹기 위한 방법을 많이 고려했고, 이에 따른 변화를 개인적으로 느낄 수 있었다.
enum부터 비교를 보자면,
이전 로직
public enum Ranking {
NOTHING(0, 0L),
THREE_MATCH(3, 5_000L),
FOUR_MATCH(4, 50_000L),
FIVE_MATCH(5, 1_500_000L),
FIVE_MATCH_WITH_BONUS(5, 30_000_000L),
SIX_MATCH(6, 2_000_000_000L);
이번 로직
public enum GameResult {
NOTHING(0, 0L, ""),
THREE(3, 5_000L, "3개 일치 (5,000원) - "),
FOUR(4, 50_000L, "4개 일치 (50,000원) - "),
FIVE(5, 1_500_000L, "5개 일치 (1,500,000원) - ") ,
FIVE_WITH_BONUS(5, 30_000_000L, "5개 일치, 보너스 볼 일치 (30,000,000원) - "),
SIX(6, 2_000_000_000L, "6개 일치 (2,000,000,000원) - ");
이런식으로 처리를 했다. 생각해보니, 최종 출력문의 커맨드도 enum에 같이 묶으면 굳이 따로 출력문을 생성할 필요 없었다.
어차피 데이터를 저장할 때 HashMap<Enum, Integer>로 enum타입에 따른 개수를 저장했기 때문에
enum.getComment로직으로 출력문을 빠르게 만들 수 있었다. (참고로 DOG = "개" 몇개할 때 몇 개...)
System.out.println(THREE.getComment() + statistics.get(THREE) + DOG);
진짜 너무 좋고...!
또한 저번에 도메인의 부분에서 너무 지저분한 결과를 가져왔다는 생각이 들었다.
이를 위해 도메인을 갈고 닦는데 노력을 더 쏟아보았다.
일단, Lotto(모든 로또 - 당첨번호, 플레이어 로또), Winning(결과값), BonusNumber 이렇게 3개의 도메인을 만들었다.
이를 기능에 따라 Player(List<Lotto>), WinningLotto(Lotto, BonusNumber), Winning(Winning) 3개로 나누어 썼다.
따로 util을 만들지는 않았다.
생각해보면 도메인에서 결과를 계산해 반환하면 되는걸 따로 util을 만들어서 움직일 필요를 못느꼈다.
public GameResult makeResultOfLotto(Lotto lotto){
int resultCount = countMatches(lotto);
if(resultCount == SIX.getCount()) return SIX;
if(isFive(resultCount)) return makeFromFive(lotto);
if(resultCount == FOUR.getCount()) return FOUR;
if(resultCount == THREE.getCount()) return THREE;
ret
이런식으로 개수를 세고, WinningLotto에서 자신의 로또와 플레이어 로또를 하나 가져와 이를 비교해 맞춘 개수를 넣고
보너스 넘버를 확인해, 보너스 넘버의 유무에 따라 리턴을 다르게 해주었다.
이를 플레이어에서
public HashMap<GameResult, Integer> makeResultByWinningLotto(WinningLotto winningLotto){
HashMap<GameResult, Integer> statistics = initializeStatistics();
for(Lotto lottoEach : playerLotto){
addDataToStatistics(statistics, winningLotto.makeResultOfLotto(lottoEach));
}
return statistics;
}
이 방식으로 불러주었다. 입력변수 인자값으로 써서 그런지 순환참조가 발생할 걱정은 없어 다행이었다.
최대한 도메인의 부분들을 생각하며 어느 도메인에서 일을 하는게 좋은가를 생각했던 것 같다.
WinningLotto가 Player를 가져가 일을 해도 괜찮겠지만, 개인적으로는 데이터가 더 많은 쪽에서 적은쪽을 가져가는게 맞지 않았나 싶었다.
저번보다 enum이라는 녀석을 쓰기 좋은 것 같다. 사실 알고리즘이나 간단한 쇼핑몰 만들기등을 할 때 enum은 쓰지 않거나, 간단하게 Role을 정해주는 용도로만 썼었는데, 이번 기회에 enum에 대한 열린 시야(이게 맞나?)를 가지게 되었다.
편견없이 모든 걸 다 받아들일 수 있도록 하자.
편식하지 말고 모든지 다 잘먹도록 하자
안그러면 호머한테 혼난다.
'장's 개발생각' 카테고리의 다른 글
[개발생각] 우테코 문제 풀어보기 - 자동차 경주 게임 (0) | 2022.12.13 |
---|---|
[개발생각] 리세마라 : 다시해보는 우테코 5기 4주차 (0) | 2022.12.13 |
[개발생각] 리세마라 : 다시해보는 우테코 5기 2주차 (0) | 2022.11.26 |
[개발생각] 우아한테크코스 5기 4주차 다리게임 회고 (0) | 2022.11.23 |
[개발생각] 우아한테크코스 5기 3주차 로또 후기 (0) | 2022.11.18 |