우아한테크코스 3주차 회고🎱
인트로
우아한테트코스 6기 프리코스 3주차 로또 미션 회고입니다 🎱
2주차 코드리뷰
- 가독성이 높은 메서드명 짓기
- 한 함수는 한 가지 기능만 담당
- 불필요한 로직 제거
- 정렬 + 탐색 을 탐색으로만 찾는다
- 불필요한 최대값 찾기
코드리뷰를 하다보니 유독 잘 코드가 잘 읽히는 사람이 있었다. 메서드명에서 함수가 하는 역할을 바로 알 수 있고 조합된 단어조차 매우 마음에 들었다. 그리고 그걸 일부 차용해 사용하다보니 가독성이 높아진것이 느껴졌다.
함수가 한가지 기능만 담당을 해야지 메서드명에서 함수의 내용을 다 담을 수 있는거 같다. 그리고 요구사항중 라인수 15줄을 넘어가지 말라는 이야기가 있었다. 메서드가 15줄을 넘어가면 하나의 기능을 담당하는지 의심을 해야할 것 같다.
2주차 미션을 진행할 당시 가장 멀리 간 차를 구하는 설계를 차를 내림차순으로 정렬시킨뒤 첫번째 index를 가져왔다. 추후 코드리뷰를 통해 알았는데 탐색을 사용하면 그냥 가장 멀리간 차를 찾을 수 있었다. 따라서 성능 비용을 따져가며 필요한 설계만 해나가는게 좋은거 같다.
회고
으 어렵다 근데 재미있다.
이번에 재미있는 프로그래밍 요구 사항이 많았던거 같다 그런 요구사항들을 위주로 회고를 적어보도록 하겠다.
Lotto 클래스
“제공된 Lotto
클래스를 활용하여 구현해야 한다.”
위와 같은 요구사항이 있었고 어떻게 활용을 해야할지 생각을 했다. 일단 로또가 필요한 곳이 뭐가 있을까란 생각을 했고 2가지로 추려졌다.
- Lottos: 랜덤으로 생성된 로또들의 집합
- WinningLotto 입력받은 우승 로또 번호
Lottos에서는 맴버 변수로 List
Enum
을 적용한다.
이전에는 Enum을 상수를 대신해서 처리하는 역할을 하였다. 하지만 이번에는 다른 방식으로 두가지를 적용해 보았다.
- 로또번호 일치 로직(LottoResultRule)
- regex검증(RegexPattern)
로또검증을 class도 뺄 수 있었지만 결국에는 domain에 종속을 시키지 않으려면 static 메서드로 util 역할을 하게 선언을 했어야 했다. 이부분을 Enum을 활용하여 처리를 하였다. LottoResultRule을 생성을 해 로또번호와 보너스 번호를 집어넣으면 로또 등수를 반환하는 함수를 작성하였다.
regex검증을 Enum으로 선언한 이유는 1주차 코드리뷰에 있었다. Pattern.match에서 많은 성능 비용이 발생한다고 하였다. 그래서 2주차 코드에서는 private static final로 상수로 처리해서 사용을 하였다. 하지만 enum을 사용하면 메서드에 static이 붙으므로 검증 로직을 확실하게 분리 할 수 있고 역할과 책임을 확실하게 나눌 수 있는 방법이라고 생각을 했다.
EnumMap
을 활용하다.
Enum class인 LottoResultRule을 활용하기 위해 LottoResultRule을 EnumMap으로 선언해 일급컬랙션으로 감싼 WinningStatistic 클래스를 만들었다. 성능이 좋다라는 장점이 있지만 순서를 기존의 Map과는 다른게 순서를 기억한다라는 장점을 활용하기 위해서 사용을 하였다. 로또들의 각 등수별 숫자를 EnumMap으로 저장한 후 그 값을 추후에 순서대로 불러와 출력하는 역할을 하는데 활용을 하였다.
사용자가 잘못된 값을 입력할 경우 에러를 발생시키고 다시 입력받는다.
InputView를 Controller에 주입시켜 입력값을 받는 부분을 while(true)와 try-catch로 감싸 예외를 던지면 해당 exception을 감지해 오류를 출력하고 다시 받도록 하였다. 하지만 controller로직에 inputView 메서드마다 while, try-catch가 붙으니 Controller의 코드가 가독성이 떨어졌다. 그러던 중 Supplier<T>
라는 interface를 알게되었고 메서드의 매개변수를 Supplier
test code 작성
수익률을 반환할때 1등 금액을 반환을 하니 double형의 값이 과학적 표기법으로 반환이 되었다. 이 내용을 test code를 작성하다 반환값이 아상하게 표기되는 것을 보고 알게 되었다. %d
로 받았던 로직을 %.1f
를 변경을 하여 올바른 반환값을 받도록 수정을 하였다.
마무리
요구사항에 대해서 고민을 하는게 매력적으로 느껴지는 한 주였습니다. 왜 요구사항이 점점 늘어나는지 알 수 있었고 그 요구사항을 충족하기 위해서 생각하는 시간이 즐거웠습니다. 코드 리뷰를 통해서 생각하지 못했던 부분을 피드백 받을 수 있었고 이와 같이 목표하는 방향이 비슷하고 열정이 넘치는 사람들과 함께 공부하는 즐거움을 계속해서 느끼고 싶습니다. 이제 마지막 한 주가 남았습니다. 모두 화이팅 하시고 노력하시고 몰입하신만큼 좋은 결과가 나오길 바라겠습니다.
Leave a comment