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단계 - 사다리(생성) #2238

Open
wants to merge 12 commits into
base: owljoa
Choose a base branch
from
Open

2단계 - 사다리(생성) #2238

wants to merge 12 commits into from

Conversation

owljoa
Copy link

@owljoa owljoa commented Oct 29, 2024

안녕하세요~!
2단계 - 사다리(생성) 리뷰 요청드립니다.

감사합니다! 🙇

Copy link
Member

@testrace testrace left a comment

Choose a reason for hiding this comment

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

안녕하세요 동인님 😃
2단계 구현 잘해주셨네요 👍
몇 가지 코멘트 남겨두었는데 확인해 주시고 다시 리뷰 요청해 주세요.

import java.util.Random;

public class HorizontalLine {
private final List<Boolean> hasLineOrNotList;
Copy link
Member

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 +12
private HorizontalLine(List<Boolean> hasLineOrNotList) {
this.hasLineOrNotList = hasLineOrNotList;
}
Copy link
Member

Choose a reason for hiding this comment

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

가로라인은 겹칠 수 없다는 제약을 지키기 위해 할당하기 전에 검증하면 어떨까요?

Comment on lines +14 to +16
public HorizontalLine(int userCount) {
this(generateLines(userCount));
}
Copy link
Member

Choose a reason for hiding this comment

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

관례적으로 부 생성자는 주 생성자보다 상위에 위치합니다.
로직이 필요하다면 생성자가 아닌 정적 팩토리 메서드를 활용하면 어떨까요?

}

private static List<Boolean> generateLines(int userCount) {
Random random = new Random();
Copy link
Member

Choose a reason for hiding this comment

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

이전 단계에서도 경험하셨겠지만 random은 테스트하기 어려운 구조로 만들게 됩니다.
랜덤에 직접 의존하지 않는 구조로 변경해 보시면 좋을 것 같아요.

Comment on lines +9 to +10
if (name == null || name.length() > MAX_NAME_LENGTH) {
throw new IllegalArgumentException("참여자의 이름은 최대 5글자입니다");
Copy link
Member

Choose a reason for hiding this comment

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

null인 경우는 메시지가 달라야 하지 않을까요?
빈 값인 경우에 대한 예외처리도 추가하면 좋을 것 같아요.

Comment on lines +30 to +37
private static int getInputInteger() {
try {
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
} catch (Exception e) {
return 0;
}
}
Copy link
Member

Choose a reason for hiding this comment

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

임의의 값으로 리턴하기 보다 재입력을 받아 정상 동작하도록 유도하면 어떨까요?

Comment on lines +27 to +31
for (int i = 0; i < horizontalLine.size(); i++) {
Boolean hasLineOnIndex = horizontalLine.hasLineOnIndex(i);
printHorizontalLineOrBlank(hasLineOnIndex);
System.out.print("|");
}
Copy link
Member

Choose a reason for hiding this comment

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

size(), hasLineOnIndex() 는 출력에 필요한 메서드라고 생각되는데요.
스트림, 람다 미션이니 index로 접근하기 보다 불변 컬렉션을 리턴해서 스트림을 최대한 활용해 보시면 좋을 것 같아요.

Comment on lines +8 to +20
void 생성된_가로선은_연속되지_않아야_한다() {
// given
int userCount = 4;

// when
HorizontalLine horizontalLine = new HorizontalLine(userCount);

// then
for (int i = 0; i < horizontalLine.size() - 1; i++) {
boolean currentGeneratedLine = horizontalLine.hasLineOnIndex(i);
boolean nextGeneratedLine = horizontalLine.hasLineOnIndex(i + 1);
Assertions.assertThat(currentGeneratedLine).isNotEqualTo(nextGeneratedLine);
}
Copy link
Member

Choose a reason for hiding this comment

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

모든 값을 꺼내어서 결과를 검증하다보니 테스트 코드가 복잡해질 수 밖에 없을 것 같아요.
'연속된 가로선을 가질 수 없다'는 책임을 생성 시점에 검증하면 어떨까요?
new HorizontalLine(List.of(true, true)); // exception throw
혹은 위 책임을 수행할 별도의 객체를 도출해 보셔도 좋을 것 같아요.

Comment on lines +13 to +17
// when
Ladder ladder = new Ladder(userCount, ladderMaxHeight);

// then
Assertions.assertThat(ladder.size()).isEqualTo(ladderMaxHeight);
Copy link
Member

Choose a reason for hiding this comment

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

size 검증만으로 정상 사다리라고 보기 어렵지 않을까요.
userCount는 어떤 역할을 하는지 테스트 코드를 아무리 봐도 알 수가 없는데요.
사다리를 생성한 다음 예상되는 사다리 객체를 하드코딩해서 객체끼리 비교하면 어떨까요?
생성 전략을 외부에서 주입한다면 원하는 형태의 사다리를 만들 수 있으니 객체간의 비교도 가능할 것 같아요.

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