생각보다 힘들었던 3 주차 문제..
3 주차에선 최대한 MVC 패턴을 이용하여 뷰와 로직을 분리 + 가독성 있는 코드를 작성하기 위해 노력했다.
어떻게 로직을 분리하는 지에 대한 깊은 고민이 있었다. 그 방향성으로 생긴 게 바로 service 계층, Model에 로직을 모두 두는 것이 아닌 service에 일부분을 분리함으로써 객체가 담당하는 역할을 줄였다.
도메인과 화면 로직의 분리를 향하여
여러 Model의 데이터가 필요한 경우나 굳이 Model에 있을 필요가 없는 로직들은 서비스 계층으로 분리하여 모델의 코드 수를 줄였다.
Lotto 관련 객체를 생성 및 파싱 하는 것은 LottoProvideService, LottoResultService는 로또 결과를 계산하는 관련 로직을 담아두었다.
public class LottoProvideService {
LottoNumberGenerator lottoNumberGenerator = new LottoNumberGenerator();
public LottoBundle buyLottoBundle(Cash cash) {
List<Lotto> lottoBundle = new ArrayList<>();
int lottoCount = cash.getPurchasableLottoCount();
for (int i = 0; i < lottoCount; i++) {
lottoBundle.add(new Lotto(lottoNumberGenerator.generateLottoNumbers()));
}
return new LottoBundle(lottoBundle);
}
public Lotto publishWinningLotto(String winningLottoNumbers) {
if (winningLottoNumbers == null) {
throw new IllegalArgumentException("로또 번호 입력값이 null입니다. 1 ~ 45 사이의 중복되지 않은 자연수 6개여야 합니다.");
}
List<Integer> winningNumbers = Arrays.stream(winningLottoNumbers.split(","))
.map(this::parseNumber)
.toList();
return new Lotto(winningNumbers);
}
private Integer parseNumber(String numberStr) {
try {
return Integer.parseInt(numberStr);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("입력된 값이 숫자가 아닙니다. 1 ~ 45 사이의 중복되지 않은 자연수 6개여야 합니다.");
}
}
}
LottoProvideService의 코드인데 로또를 구매한다거나, 당첨 로또를 생성하는데 중점을 두었다.
이미 3주차가 아닌 4주 차가 끝난 지금의 시점에서 보면, parseNumber()와 같은 메서드는 따로 utill에 Validator를 두고 검증로직을 사용하는 것이 더 좋은 방법이었던 것 같다.
또한, 에러 메시지 관련으로도 view로 분리했으면 더 좋을 것이라고 본다.
(최대한 분리하고자 했는데 이렇게 놓치는 게 많다..)
코드는 또 다른 문서라고 했다. 가독성이 좋은 코드를 향하여
개발 동아리에서 프로젝트 활동하다보면 남의 코드를 볼 때가 많다. 그럴 때마다 변수명, 메서드 명을 대충 짓는 사람들이 많은데 일일이 카톡으로 물어볼 수도 없고 난감한 경우가 있다.
그런 모습들을 보면서 난 이렇게 안해야지 마음먹어도 개발 일정이 턱 밑까지 쫓아오면 신경 못 쓰는 게 과거의 나였다.
우테코 프리코스를 진행하면서 공통 피드백 중에 변수, 메소드 명을 제대로 작성하라는 말이 있었다.
그걸 고려하여 최대한 반영하고자 했다.
그렇게 시작된 문제 로또의 복수형은 무엇인가?
의외로 여기에 묶여서 꽤 시간을 소비했었다.
3주차 문제에선 사용자가 여러 개의 로또를 구매하는 경우의 수가 존재했는데, 이로 인해 로또의 복수형의 필요해졌다.
근데 로또의 복수형이 뭘까..?
단순하게 생각해서 Lottos라고 생각해서 구글에 검색을 했었다.
뭔가 어감이 이상하다곤 생각했는데 아니다 다를까 결과가 이상하다.
그렇게 여기 저기 찾아다니다가 생각난 단어 Bundle.
안드로이드에선 Bundle에 여러 데이터들을 넘어서 화면(액티비티)에서 다른 화면으로 보내는 경우가 존재한다.
그것이 문득 생각났다.
그래서 LottoBundle이 만들어졌다.
참고
[로또] 윤성원 미션 제출합니다. by Zepelown · Pull Request #410 · woowacourse-precourse/java-lotto-7