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

[2단계 - 자동차 경주 리팩터링] 허브(방대의) 미션 제출합니다. #538

Merged
merged 24 commits into from
Feb 13, 2023

Conversation

greeng00se
Copy link
Member

안녕하세요 😄

2단계는 혼자 리팩터링 하는 미션이지만, 1단계 미션에서 남겨주신 리뷰를 통해 페어와 함께 많은 이야기를 나누었습니다.
리뷰 남겨주신 내용이 정말 많은 도움이 되었던 것 같습니다.

리뷰를 기반으로 결정한 내용

제어할 수 없는 부분

  • 나머지 부분에 대한 테스트를 더욱 꼼꼼하게 작성하는 거로 마무리했습니다.
  • 기존에 작성했던 RepeatableTest의 경우 제 마음의 안정을 위해 남겨두었습니다!!

위임 메서드 테스트

  • 이전의 테스트 코드가 결과를 검증하도록 해두었기 때문에 특별한 변화는 주지 않았습니다.

Count 클래스 테스트를 위한 getter

  • 리뷰 남겨주신 대로 decrease 후 게임을 진행하지 못하게 하는 방법도 의미가 있다는 것에 동의를 하고, 따라서 getter를 제거하고 isPlayable로 테스트를 작성했습니다.

검증과 변환의 분리

  • 말씀해 주신 레이싱카 크기의 어플리케이션에서는 이런 부분까지 나눈다면 클래스가 지나치게 많다는 생각입니다. 이 부분에 대해서 전적으로 동의합니다.
  • 이번 미션에서 클래스를 최대한 분리해 보는 방향으로 코드를 작성하고 싶어서 Parse 하는 부분도 따로 클래스로 분리를 해보았습니다.
    이유는 다음과 같습니다.
    1. validator에서 변환이 이루어지는 경우 하나의 메서드에서 두 가지 동작을 하는 것처럼 느껴졌습니다.
    2. 따라서 InputView로 변환을 하는 부분을 옮겨보았는데, 변환을 하는 부분 자체를 검증하고 싶었습니다. (split 하는 로직 등..)
  • 따라서 InputParser라는 클래스로 분리하였고, 사실 조금 과하다는 생각이 들긴 하지만 테스트를 통해 마음의 안정감을 얻었습니다!

2단계 리팩터링

2단계 요구사항 + 기존의 코드를 리팩터링 하는 시간을 가졌습니다.
페어와 협업을 한다고 가정을 하고, 요구사항을 정리하고 조금 더 상세한 내용을 코드에 담도록 고민했습니다.

기존에 추가하지 못했던 기능 추가

  • 중복 이름을 받는 경우 예외를 던지는 코드를 추가하였습니다.
  • 시도 횟수를 100이하의 정수값을 입력받도록 제한을 추가하였습니다.

IntelliJ 테스트 실행 결과 메시지 개선

  • ParameterizeTest의 name을 이용하여 테스트 결과를 조금 더 한눈에 볼 수 있도록 개선하였습니다.

예외 메시지

  • 예외 메시지가 조금 더 자세한 내용을 보여주도록 리팩터링 했습니다.

차 위치 비교 부분 변경

  • 기존에 getPosition을 이용하여 비교를 했던 부분을 Comparable을 구현하도록 변경했습니다.

추가로 부족한 부분, 개선을 하면 좋겠다고 생각하시는 부분에 대해 리뷰 남겨주시면 바로 반영하겠습니다!
감사합니다!

- 추가로 예외 메시지를 던지는 조건을 메서드로 분리하여 읽기 쉽게 변경
- 객체보단 기능을 중심으로 작성
Copy link

@knae11 knae11 left a comment

Choose a reason for hiding this comment

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

안녕하세요 :) 허브!

미션 하면서 해보고 싶은 내용 다 해보세요~~ㅋㅋㅋㅋㅋ 납득 가능하게 이유까지 남겨주어서 좋네요!

이번 미션에서 클래스를 최대한 분리해 보는 방향으로 코드를 작성하고 싶어서 Parse 하는 부분도 따로 클래스로 분리를 해보았습니다.
이유는 다음과 같습니다.

2단계 미션을 하면서 신경쓴 부분들을 PR 내용에 남겨주어서 알아차리가 너무 좋았답니다 :)

force push 한 기록들이 있던데요! 혼자 사용하는 브랜치는 force push 해도 상관 없지만 공유하는 브랜치에서 사용하면 커밋내용이 꼬일 수 있어서 하면 지양해야 한다는거 아시죠? (혹시나 해서 코멘트 남겨요! 사실..저도 혼자 사용하는데서는 force push...사용한답니다...ㅎㅎㅎ)

2단계 코멘트 남겨보았습니다! 이상한 부분이 있거나 애매한 부분들이 있다면 알려주세요 >_< 새롭게 시작하는 월요일도 화이팅!

- [x] 자동차는 값을 입력받고 이동한다.
- 4 이상이면 전진한다.
- 3 이하의 값이면 멈춘다.
## 개요
Copy link

Choose a reason for hiding this comment

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

업데이트 되는 문서 좋아요! 👍

outputView.printPosition(cars);
racingGame.play();
List<Car> cars = racingGame.findCurrentCarPositions();
outputView.printCurrentCarPositions(cars);
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 +7 to +8
private final Name name;
private final Position position;
Copy link

Choose a reason for hiding this comment

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

오~ 불변객체로~!

@@ -4,7 +4,8 @@ public class Name {

private static final int NAME_LOWER_BOUND = 1;
private static final int NAME_UPPER_BOUND = 5;
private static final String INVALID_NAME_LENGTH_MESSAGE = "차의 이름은 1자 이상 ~ 5자 이하여야 합니다.";
private static final String INVALID_NAME_LENGTH_MESSAGE =
"차의 이름은 " + NAME_LOWER_BOUND + "자 이상, " + NAME_UPPER_BOUND + "자 이하여야 합니다. 입력된 차 이름 : ";
Copy link

Choose a reason for hiding this comment

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

에러메서지가 좀 더 친절해졌군요 :)

if (name.length() < NAME_LOWER_BOUND || NAME_UPPER_BOUND < name.length()) {
throw new IllegalArgumentException(INVALID_NAME_LENGTH_MESSAGE);
private void validate(final String name) {
if (isInvalidNameLength(name)) {
Copy link

Choose a reason for hiding this comment

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

따로 조건문을 빼주니 validate에서 어떤 내용을 확인해주는지 보기 좋네요~

List<String> carNames = List.of("car1", "car2", "car3");

Cars cars = Cars.from(carNames);
@DisplayName("findWinners 메서드는 차량이 존재하지 않는 경우 예외를 던진다.")
Copy link

Choose a reason for hiding this comment

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

findWinners의 역할은 우승자를 찾는것 아닌가요?

Copy link
Member Author

Choose a reason for hiding this comment

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

앗! 말씀하신대로 우승자가 존재하지 않는 경우 예외를 던진다. 라는 DisplayName이 더 적절해보입니다! 또한 그에 따른 예외 메시지를 변경하여 적용해보겠습니다!

@@ -7,11 +7,11 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

@DisplayName("Car 클래스")
Copy link

Choose a reason for hiding this comment

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

클래스나 메서드 이런 내용은 DisplayName에 들어가지 않아도 좋을 듯 싶어요 :)

public class CarTest {

@ParameterizedTest
@ParameterizedTest(name = "move 메서드는 값을 입력받고 4이상인 경우 전진한다. 초기 위치: 0 입력값: {0} 동작 후 위치: {1}")
Copy link

Choose a reason for hiding this comment

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

👍


@DisplayName("Cars 클래스")
Copy link

Choose a reason for hiding this comment

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

Car와는 다른 Cars 만의 역할에 대해 테스트를 작성해봐도 좋을 듯 하네요

Copy link
Member Author

@greeng00se greeng00se Feb 12, 2023

Choose a reason for hiding this comment

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

앗! 말씀하신대로 모든 차들을 반환하는 테스트를 작성하지 않은 것 같습니다!!
또한 등록된 차들의 경주를 진행한다고 생각하여 move 대신 race로 메서드명을 변경했습니다.

@@ -2,7 +2,7 @@

import java.util.Objects;

public class Position {
public class Position implements Comparable<Position> {
Copy link

Choose a reason for hiding this comment

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

Position 클래스의 경우 기본적으로 컴파일러가 생성해주는 생성자를 사용하고 있는데요. 접근 제어자를 활용하여 생성의 범위를 좁히는 건 어떨까요~?

Copy link
Member Author

Choose a reason for hiding this comment

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

이 부분에 대해서 package-private 생성자를 사용하는게 맞을까요? 일단 도전해보겠습니다!

@greeng00se
Copy link
Member Author

greeng00se commented Feb 12, 2023

주말에도 리뷰 남겨주셔서 감사합니다.
리팩터링을 진행하면서 놓친 부분을 세심하게 리뷰 남겨주셔서 정말 감사합니다!!

리뷰 해주신 부분 개인적으로 생각하여 코드에 반영을 해보았습니다.
혹시나 제가 생각한 부분이 리뷰 남겨주신 의도와 다른 경우 알려주시면 정말 감사하겠습니다!!

force push한 걸 들켜버렸군요.. 😢
처음에는 커밋을 추가하여 이전에 잘못된 커밋 메시지를 변경해보려 했지만, 기록이 남아 force push를 해버렸습니다..ㅜㅜ
이 부분에 대해서 더 좋은 방법이 있을까요?

Copy link

@knae11 knae11 left a comment

Choose a reason for hiding this comment

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

허브, 리뷰 내용 반영한 부분 확인했습니다. 👍
레이싱카 미션 너무 잘 수행해주셨네요! 앞으로도 화이팅입니다~~~~~~
Merge 할게요!

force push 이유가 커밋메세지 때문이었군요. 이미 remote에 push 했다면 force push 말고는 커밋메세지를 변경할 수 있는 방법은 저도 모르겠네요ㅠㅠ

@knae11 knae11 merged commit 30a1797 into woowacourse:greeng00se Feb 13, 2023
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