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

3단계 자동차 경주 #5351

Open
wants to merge 9 commits into
base: hj-rich
Choose a base branch
from
Open

3단계 자동차 경주 #5351

wants to merge 9 commits into from

Conversation

HJ-Rich
Copy link

@HJ-Rich HJ-Rich commented Mar 10, 2024

민수님 안녕하세요~
3단계 자동차 경주 완료하여 리뷰 요청드립니다.

애플리케이션에 해당하는 RacingGame 클래스가
두 가지 클래스를 인터페이스로 의존하도록 구현해봤습니다.

하나는 입출력을 담당하는 Client 역할이고요,
다른 하나는 자동차의 전진 여부를 만들어낼 전략 역할입니다.
각각 현재는 콘솔 입출력 구현체와 60%로 전진하는 전략 구현체가 주입되고 있습니다.

이번 미션도 잘부탁드립니다.
감사합니다 😄

Copy link

@mskangg mskangg left a comment

Choose a reason for hiding this comment

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

3단계도 잘 구현해주셨네요~!
핵심기능과 입/출력을 구분하여 잘 나눠서 개발해주셨네요!
전략패턴까지 잘해주셨습니다! 👏
그리고 꼼꼼한 테스트까지.. 💯

다만, tdd 방식으로 개발하진 않았던것 같아요!
public 한 메서드 중 테스트코드가 없는것들이 있네요..!
이부분이랑 코멘트 남긴부분들 같이 확인 부탁드립니다~! 🙇

Comment on lines +156 to +162
## 요구사항 분리

- [x] `자동차 대수는 몇 대 인가요?` -> 양의 정수 하나를 입력 받음
- [x] `시도할 회수는 몇 회 인가요?` -> 양의 정수 하나를 입력 받음
- [x] 개행 및 `실행 결과` 출력
- [x] 0-9사이 Random 값이 4이상인 경우 전진하는 메서드 구현
- [x] 입력 받은 시도 횟수 만큼 개행으로 구분하며 각 자동차의 경과를 출력
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 +10 to +16
public static void main(String[] args) {
final RacingCarClient racingCarClient = new ConsoleRacingCarClient();
final CarMoveGenerator randomCarMoveGenerator = new SixtyPercentAdvanceGenerator();

final RacingCarGame racingCarGame = new RacingCarGame(racingCarClient, randomCarMoveGenerator);
racingCarGame.play();
}
Copy link

Choose a reason for hiding this comment

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

view 를 잘 분리해서 구현해주셨네요 👍

Comment on lines +25 to +33
public void play() {
final RacingCarRequest racingCarInput = racingCarClient.getRacingCarInput();
final Cars cars = createCars(racingCarInput);

final NumberOfTrials numberOfTrials = racingCarInput.getNumberOfTrials();

racingCarClient.showResultHeader();
playRounds(numberOfTrials, cars);
}
Copy link

Choose a reason for hiding this comment

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

자동차 경주의 핵심기능인 play 에 대한 테스트가 없네요..! 🤔
전략패턴으로 랜덤을 분리하였고, 입출력을 담당하는 view를 분리하였으니 테스트는 쉽게 가능할것 같아요!

}
}

public int getPosition() {
Copy link

Choose a reason for hiding this comment

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

객체지향 생활 체조 원칙
규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.

게터를 사용하셨군요!!
코드를 살펴보니 테스트나 출력을 위해 사용하셨더라구요.
이런경우 트레이드오프영역으로 보고 저도 사용하곤 합니다 ㅎㅎ
다만, 메서드 이름을 좀 다르게 작성합니다.

getPositionForPrint() 와 같이 변경해서 사용합니다 :)

지금은 현재 위치를 리턴하는거니 currentPosition() 도 괜찮아 보이네요


private void playRounds(final NumberOfTrials numberOfTrials, final Cars cars) {
for (int i = 0; i < numberOfTrials.getValue(); i++) {
cars.tryAdvance(this.carMoveGenerator);
Copy link

Choose a reason for hiding this comment

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

전략패턴을 통해 잘 구현해주셨네요 👏

지금은 RacingGame 전체가 하나의 전략으로 동작하게 구현하셨는데, 각각의 Car가 다른 전략을 구현해서 사용할수도 있을것 같아요!

요구사항중 어떤차량은 30% 확률로 전진하고, 어떤 차량은 90% 확률로 전진한다면 이런 구조가 더 알맞을 수도 있을것 같아요!

그리고 외부에서 전진하는 차량만 만들어서 RacingGame 에 전달한다면, Play에 대한 테스트도 수월할지도 모르곘어요 🤔

Comment on lines +21 to +23
public List<Car> getCars() {
return cars;
}
Copy link

Choose a reason for hiding this comment

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

일급컬렉션으로 작성해주셨네요!
이럴경우 잘아시곘지만, 수정할수없는 list를 리턴하거나, 방어적복사를 통해 컬렉션을 분리해서 사용하는 방법이 있을것 같아요

Comment on lines +7 to +8
private final NumberOfCars numberOfCars;
private final NumberOfTrials numberOfTrials;
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