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

이가연 레이싱카 미션 1단계, 2단계 제출합니다 #59

Open
wants to merge 6 commits into
base: gy102912
Choose a base branch
from

Conversation

GY102912
Copy link

@GY102912 GY102912 commented Oct 1, 2024

질문사항

  1. 테스트 클래스에서 @BeforeAll 함수 내에서 전역변수를 초기화하는 것과 전역변수 선언과 동시에 초기화하는 것에 차이가 있을까요?
  2. assertj의 usingRecursiveComparison를 사용하는 것이 for문을 사용하는 것과 비교하여 코드를 간결하게 하는 것 외에 다른 장점들이 있는 지 궁금합니다.

- 랜덤으로 레이싱카를 전진 혹은 정지 시키는 기능 구현
- 레이싱카의 이름을 받는 생성저와 getter, setter 기능 구현
- 레이싱카 전진 및 정지 확인
- 레이싱카 유효하지 않은 이름 에러 발생 확인
- 주어진 횟수 round만큼 각 레이싱카를 무작위로 움직여 총 이동거리를 구하는 start 메소드 구현
- 주어진 레이싱 경기 후 총 이동 거리를 바탕으로 승자를 가리는 ranking 메소드 구현
- 각 메소드에 대한 테스트 코드 작성
Copy link

@hong-sile hong-sile left a comment

Choose a reason for hiding this comment

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

가연님 가장 먼저 작성해주셨군요.
수고하셨습니다!!

몇몇부분에 대한 코멘트 남겼는데, 한번 확인 부탁드립니다.
정답보단 질문을 던졌는데, 고민해보시고 다음 스터디때까지 나름의 답을 내리고 오셨으면 좋을 것 같아요.

@Getter
public class RacingContest {
private static final Random random = new Random();
private final RacingCar[] RACING_CARS;

Choose a reason for hiding this comment

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

어떤건 array를 쓰고 어떤건 List를 썼군요 가연님만의 기준이 있으신가요?

Copy link
Author

Choose a reason for hiding this comment

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

전체 갯수를 이미 알고 있는 경우에는 array를 사용하고 레이싱 경기 우승자와 같이 미리 전체 갯수를 모를 땐 list를 사용했습니다. array, list 중에 무엇이 적절한 지 선택하기 위한 더 나은 기준이 있을까요?

}

public int[] start(){
int[] distances = new int[RACING_CARS.length];

Choose a reason for hiding this comment

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

distance를 메서드 내부의 변수로 관리하셨군요.

만약 RacingCar 내부에 필드로 갖게된다면 어떨까요?

Copy link
Author

Choose a reason for hiding this comment

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

생각하지 못했었는데 RacingCar 클래스의 필드로 사용하는 것이 테스트할 때 더 편할 것 같습니다!


for (int r = 0; r < rounds; r++) {
for (int c = 0; c < RACING_CARS.length; c++) {
distances[c] += RACING_CARS[c].moveByRandom(random.nextInt(10));

Choose a reason for hiding this comment

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

한줄에 너무 많은게 담겨 있는 거 같아요.

c번째 car가 움직이는 것을 랜덤값으로 뽑아서 움직인다.

하나의 줄에 여러개의 메서드가 포함되는 것은 가독성을 떨어뜨릴 수 있을 것 같아요. 어떻게 풀어볼 수 있을까요?


public ArrayList<String> ranking(int[] distances){
int maxDist = Arrays.stream(distances).max().getAsInt(); // winner decision
ArrayList<String> winners = new ArrayList<>();

Choose a reason for hiding this comment

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

ArrayList와 List는 어떤 차이가 있을까요?


@Test
@DisplayName("경기 결과 모든 차의 주행거리가 0 이상이고 주어진 횟수 round 이하인지 확인")
public void testStart() {

Choose a reason for hiding this comment

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

start의 기능에 대한 테스트가 조금 모자라게 느껴지는 것 같아요.

조금 더 명확하고 효과적인 테스트는 어떻게 작성할 수 있을까요??

}

public void setName(String name) {
if (name == null || name.trim().isEmpty()) {

Choose a reason for hiding this comment

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

setName이란 메서드가 RacingCar 내부 외에서 호출되는 일이 있나요?

@Getter
public class RacingContest {
private static final Random random = new Random();
private final RacingCar[] RACING_CARS;

Choose a reason for hiding this comment

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

어떤 변수는 소문자 어떤건 대문자 이건 가연님만의 기준이 있을까요?

@hong-sile
Copy link

  1. 테스트 클래스에서 @BeforeAll 함수 내에서 전역변수를 초기화하는 것과 전역변수 선언과 동시에 초기화하는 것에 차이가 있을까요?

개인적으로 현재 가연님 방식으로 사용한다면 차이가 없다고 생각합니다.
@BeforeAll을 사용하는 케이스는 조금 더 복잡한 케이스가 있을 것 같네요.

  1. assertj의 usingRecursiveComparison를 사용하는 것이 for문을 사용하는 것과 비교하여 코드를 간결하게 하는 것 외에 다른 장점들이 있는 지 궁금합니다.

일단 for문을 사용 안하고 비교한다는 것부터 큰 장점입니다. assert문을 여러개 써보면 되게 관리하기가 어려운 면이 있거든요.
(한 번 바꿔보시면 어떤 문제가 있는지 느껴보실 수 있을 것 같아요.)
그리고 지금은 단순히 String 비교지만 객체를 비교하게 된다면 usingRecursiveComparsion 이 조금 더 편하게 쓸 수 있답니다.

ArrayList<String> expected = new ArrayList<>(Arrays.asList(winners));

//then
assertThat(actual).usingRecursiveComparison().isEqualTo(expected);

Choose a reason for hiding this comment

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

요렇게 쓰는 것은 순서에 영향을 받을 위험이 있습니다. 어떻게 해결할 수 있을까요??

(만약, winners가 new String[]{names[2], names[1]}) 인 경우 테스트 미통과 처리


//when
ArrayList<String> actual = contest.ranking(distances);
ArrayList<String> expected = new ArrayList<>(Arrays.asList(winners));

Choose a reason for hiding this comment

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

이런식으로 두번 초기화할 필요는 없을 것 같아요.
Array와 List를 초기화하는 방법에 대해 학습해보면 좋을 것 같습니다.

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