Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Step4] 로또 수동 미션 리뷰 요청드립니다. #3252

Open
wants to merge 43 commits into
base: woonys
Choose a base branch
from

Conversation

woonys
Copy link

@woonys woonys commented May 22, 2023

안녕하세요, 로또 수동 미션 리뷰 요청드립니다.
저번에 리뷰 주신 내용 최대한 반영해 작업 완료했습니다.

  • 컨트롤러(LottoController) -> 서비스(LottoGame)로 로직 이관
  • WinningPrizes & WinningPrizeMatcher merge

woony-kim and others added 30 commits May 9, 2023 01:50
Copy link

@catsbi catsbi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

woony님 4단계 빠르게 작성해서 제출해주셨네요 👍
어느덧 마지막 미션인데 꾸준하게 계속 진행해주셨네요 조금만 더 화이팅입니다. 🙌
몇 가지 피드백 남겨드렸는데 확인 후 다시 리뷰요청 부탁드립니다!

public void getLottoResults() {
List<List<Integer>> results = lottoGame.getLottoResults().lottoNumbersToInt();
public void lottoResults() {
List<List<Integer>> results = lottoGame.getLottoResultsToInt();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일급 컬렉션을 써보면 어떨까요?

Comment on lines 11 to 18
int manualCount = LottoInputView.getManualCount();
List<Set<Integer>> manualNumbers = LottoInputView.getManualLottos(manualCount);
LottoController lottoController = new LottoController();
lottoController.playLottoGames(money);
lottoController.getLottoResults();
lottoController.getWinningStatistics();
lottoController.getReturnOnInvestment();
ManualRequest manualRequest = new ManualRequest(manualCount, manualNumbers);
lottoController.playLottoGames(manualRequest, money);
lottoController.lottoResults();
lottoController.winningStatistics();
lottoController.returnOnInvestment();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 값 대입, 메서드 호출과 같이 개념적 유사성이 다른 코드들간에는 개행으로 가독성을 높혀줄 수 있습니다.
  • 컨트롤러에게 세부 기능들을 호출하고 있습니다. 이건 비즈니스로직 오케스트레이션으로 보여요. 그냥 적절한 Request 객체를 전달하고 최종 결과만 반환받아서 출력계층에게 전달하면 될 것 같아요.
  • 현재 구조를 보면 LottoMain이 컨트롤러의 역할을 하고 있고, LottoController가 Service Layer의 역할을 하고 있습니다. 그럼 차라리 Controller에서 View Layer를 분리해 LottoMain으로 옮기시고 LottoController의 이름을 LottoService로 바꾸는건 어떨까요

Comment on lines 4 to 5
private int manualCount;
private int automaticCount;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

내부적으로 값이 변경되지 않는다면 final 키워드를 통해 불변성 확보를 할 수 있을 것 같네요.

lottoResults.add(LottoNumGenerator.generateResult());
public void generateLottoResultsFromMoney(ManualRequest manualRequest, int money) {
int manualCount = manualRequest.getManualCount();
List<Set<Integer>> manualNumbers = manualRequest.getManualNumbers();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이런 참조타입도 일급 컬렉션을 이용해서 내부 인덱스 제어를 책임 분리할 수 있을 것 같아요.

public void generateLottoResultsFromMoney(ManualRequest manualRequest, int money) {
int manualCount = manualRequest.getManualCount();
List<Set<Integer>> manualNumbers = manualRequest.getManualNumbers();
this.money = new Money(money, manualCount);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Money객체인데 count정보까지 담아버리면 일급 객체로써의 효용이 떨어지고 객체 시그니처가 불분명해질 것 같네요 🤔

}
}

private void generateManualResults(int manualCount, List<Set<Integer>> manualNumbers) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자동생성과 수동생성을 메서드로 구분하고 있는데 LottoGenerator -> LottoAutoGenerator, LottoManualGenerator 등으로 전략패턴을 사용할수도 있을 것 같네요

return winningAnalyzer.calculateWinningStatistics();
}

public float getReturnOnInvestment() {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 메서드도 ProfitCalculator -> DefaultProfiltCalculator등으로 분리해서 이율 계산도 추상화하면 유지보수성이 높아질 것 같아요


public int calculateCount(WinningNumbers winningNumbers) {
int count = 0;
return lottoResult.stream().mapToInt(num -> num.addCountIfContain(count, winningNumbers)).sum();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

람다식에서 count라는 외부 값에 영향을 주고 있어요. 🤔

람다식은 외부값에 대한 영향을 주지 않아야 하기에 순수 함수로 설계되야합니다. 로직내에서 직접 count같은 지역변수를 변경하려고하면 effective final variable을 수정하려한다고 컴파일 에러가 발생할 것인데, 메서드를 다시 호출해서 그 문제를 피했지만, 그렇다고 문제가 되지 않는건 아닙니다.

filter와 count등을 이용해서구현할수도 있을 것 같네요

private int rank;
private final int prizeMoney;
private int prizeMoney;
private Function<Integer, Integer> countSupplier;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IntFunction을 활용해도 좋을 것 같아요.

Comment on lines +43 to +59
// @Test
// public void 로또_번호를_수동으로_입력할_때_중복된_번호를_입력하면_예외를_던진다() {
// //given
// int money = 1000;
// List<Integer> manualLottoNumber = Arrays.asList(2, 2, 6, 7, 10, 12);
// int manualCount = 1;
// LottoGame lottoGenerator = new LottoGame();
// List<List<Integer>> manualNumbers = new ArrayList<>();
// manualNumbers.add(manualLottoNumber);
// ManualRequest manualRequest = new ManualRequest(manualCount, manualNumbers);
//
// //when
//
//
// //then
//
// }
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사용하지 않는 주석(코드)은 제거해주세요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants