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

[자동차 경주 게임] 박진훈 리뷰 부탁드립니다! #522

Open
wants to merge 16 commits into
base: main
Choose a base branch
from

Conversation

jinhoon227
Copy link

No description provided.

Copy link

@khj1 khj1 left a comment

Choose a reason for hiding this comment

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

안녕하세요! 좋은 코드 잘 보고 갑니다!
특히 커스텀 예외를 사용하신 것이 인상적이었어요! :)
항상 화이팅입니다 진훈님!!!

Comment on lines +8 to +9
private static final int MOVABLE_MIN_NUMBER = 4;
private final String name;
Copy link

Choose a reason for hiding this comment

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

컨벤션에 따라서 상수와 인스턴스 변수를 새 줄로 구분해주시는 게 좋을 것 같습니다!!

Copy link
Author

Choose a reason for hiding this comment

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

감사합니다! 놓치고있던 부분이네요..

Comment on lines +15 to +17
private Cars(List<Car> cars) {
this.cars = Collections.unmodifiableList(cars);
}
Copy link

Choose a reason for hiding this comment

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

불변 객체를 만들 때 생성자 단계에서는 방어적 복사를 고려해주시면 더 좋을 것 같아요!!

Copy link
Author

Choose a reason for hiding this comment

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

오... 좋은글 감사합니다. 방어적복사는 처음 접해보는 개념이네요!

Comment on lines +5 to +7
public class Winner {

private final List<String> winner;
Copy link

Choose a reason for hiding this comment

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

리스트의 네이밍은 복수형이 더 적절하다고 생각합니다!
Winner 클래스 자체도 승리자들의 이름을 담고있는 일급 컬렉션이기 때문에 Winners 라는 네이밍을 더 추천드립니다!

Comment on lines +45 to +47
private String convertMoveMark(int position) {
return Stream.generate(() -> MOVE_MARK).limit(position).collect(Collectors.joining());
}
Copy link

Choose a reason for hiding this comment

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

String에서 제공하는 repeat() 메서드를 활용해보시는 것도 추천드립니다!

Copy link
Author

Choose a reason for hiding this comment

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

이런,, 스트림을 너무 남발했네요.. repeat() 라는 좋은 함수가 있는데 말이죠 ㅠ


public void move(CarMoveNumberGenerator carMoveNumberGenerator) {
for (Car car : cars) {
car.move(carMoveNumberGenerator);
Copy link

Choose a reason for hiding this comment

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

CarMoveNumberGeneratorCar 객체까지 넘겨주지 않아도 될 것 같습니다!
그러면 car.move() 메서드를 테스트하기도 훨씬 간편해질 것 같아요!

@@ -0,0 +1,22 @@
package racingcar.domain;

public class RacingCarGame {
Copy link

Choose a reason for hiding this comment

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

RacingCarGame 클래스의 메서드들이 대부분 Cars 클래스의 메서드를 호출하는 용도로만 사용되는 것 같아요!
RacingCarGame 클래스가 정말 필요한지, 아니면 어떤 식으로 RacingCarGame 만의 새로운 책임을 부여할 수 있을 지
생각해보시면 좋을 것 같아요!!

Copy link
Author

Choose a reason for hiding this comment

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

원래 RacingCarGame 에서 시도횟수를 가지고있어서 Cars 를 시도횟수만큼 움직이는 로직이있었는데 controller 쪽으로 해당 로직을 옮기는바람에 쓸모없는 클래스가 되었네요.. 좋은 지적 감사합니다..!


private static final int MIN_TRY = 1;
private static final int MAX_TRY = 100000;
private int tryCount;
Copy link

Choose a reason for hiding this comment

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

값 객체의 내부 상태를 final 로 선언하는 방법도 있더라구요! 참고해보시면 좋을 것 같습니다!

Copy link
Author

Choose a reason for hiding this comment

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

불변으로 해도 값을 변경하는 방법이 있었군요..
DDD 에서 나오는 개념이라 MVC 에는 어떻게 적용할지는 고민을 해봐야겠네요..
좋은글 감사합니다!

Comment on lines +24 to +27
for (String carName : words) {
cars.add(new Car(carName));
}
return new Cars(cars);
Copy link

Choose a reason for hiding this comment

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

스트림으로 로직을 바꾸시면 빈 리스트를 선언하지 않고 더 깔끔하게 구현할 수 있을 것 같아요!

@@ -0,0 +1,10 @@
package racingcar.exception;

public class CarNameLengthException extends IllegalArgumentException{
Copy link

Choose a reason for hiding this comment

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

특별히 커스텀 예외를 사용하신 이유가 있을까요?? 궁금합니다!

Copy link
Author

Choose a reason for hiding this comment

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

커스텀예외

커스텀 예외들은 장단점이 있습니다! 그래서 정답은 없지만 제가 사용한 이유는
첫째로클래스 이름으로 어떤 예외인지 바로 알 수 있고
둘째로 보통 도메인 코드를 볼때 중요한것은 그 도메인 역할과 관련된 로직이지, 예외처리를 어떻게 하는지가 중요한게 아니기때문에 예외를 따로빼내어 좀 더 보기 편한게 만들기 위함입니다!
셋째로 대부분 Spring MVC 프로젝트에서는 커스텀 예외를 사용하기에 연습차원에서 커스텀 예외를 사용하고 있습니다.

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