-
Notifications
You must be signed in to change notification settings - Fork 1.1k
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
base: woonys
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
woony님 4단계 빠르게 작성해서 제출해주셨네요 👍
어느덧 마지막 미션인데 꾸준하게 계속 진행해주셨네요 조금만 더 화이팅입니다. 🙌
몇 가지 피드백 남겨드렸는데 확인 후 다시 리뷰요청 부탁드립니다!
src/main/java/LottoController.java
Outdated
public void getLottoResults() { | ||
List<List<Integer>> results = lottoGame.getLottoResults().lottoNumbersToInt(); | ||
public void lottoResults() { | ||
List<List<Integer>> results = lottoGame.getLottoResultsToInt(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
일급 컬렉션을 써보면 어떨까요?
src/main/java/LottoMain.java
Outdated
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(); |
There was a problem hiding this comment.
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로 바꾸는건 어떨까요
src/main/java/domain/GameCount.java
Outdated
private int manualCount; | ||
private int automaticCount; |
There was a problem hiding this comment.
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(); |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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() { |
There was a problem hiding this comment.
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(); |
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IntFunction을 활용해도 좋을 것 같아요.
// @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 | ||
// | ||
// } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사용하지 않는 주석(코드)은 제거해주세요!
안녕하세요, 로또 수동 미션 리뷰 요청드립니다.
저번에 리뷰 주신 내용 최대한 반영해 작업 완료했습니다.