-
Notifications
You must be signed in to change notification settings - Fork 708
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
Step3 #1853
base: hoyeoon
Are you sure you want to change the base?
Step3 #1853
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요
몇가지 코멘트 남겨두었으니 참고 부탁드립니다.
public List<ExecuteResult> value() { | ||
return executeResults; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
지금과 같은 복잡도와 혼자 작업하는 상황에서라면 상관없겠지만.
이렇게 List
의 참조가 외부에 노출되게 되면 외부에서 의도하지 않게 값을 추가하거나 삭제할 수 있게 됩니다.
Collections.unmodifiableList
와 같은걸로 감싸서 반환하는 것을 고려해보셔도 좋겠네요.
@@ -0,0 +1,23 @@ | |||
package nextstep.ladder.domain; | |||
|
|||
public class InputOutput { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
InputOutput
의 이름만 보면 어떤 의도를 가진 클래스인지 알기 어려워보여요.
사다리 게임의 결과가 담겨있다는 의미를 나타낼 수 있는 클래스명으로 변경해보시면 어떨까요?
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
public class ExecuteResults { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
일급 컬렉션이나 클래스 분리, 제약 등을 깔끔하게 잘 정의해주셨네요 👍
public String[][] result() { | ||
List<Line> lines = this.lines.value(); | ||
|
||
int width = verticalLineCount * 2 - 1; | ||
int height = this.lines.value().size(); | ||
|
||
String[][] ladder = new String[height][width]; | ||
|
||
IntStream.range(BEGIN_INDEX, height) | ||
.forEach(i -> IntStream.range(BEGIN_INDEX, width) | ||
.forEach(j -> { | ||
if (isVerticalLine(j)) { | ||
ladder[i][j] = "v"; | ||
return; | ||
} | ||
if (isHorizontalLine(lines, i, j)) { | ||
ladder[i][j] = "h"; | ||
} | ||
})); | ||
return ladder; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Collection에 여러 편의 메서드들이 존재하는데 다시 이차원 배열을 활용하는게 좋은 선택일지 고민이 필요할 것 같아요.
vertical인지 horizontal인지는 메서드로 검증할 수 있으므로 v, h가 기록된 String[][]
타입의 이차원 배열을 만들 필요가 있을까요?
.reduce(currentIdx, (idx, i) -> { | ||
String[] row = ladder[i]; | ||
if (isMovableToLeft(idx, row)) { | ||
return idx - 2; | ||
} | ||
if (isMovableToRight(idx, row, columnLength)) { | ||
return idx + 2; | ||
} | ||
return idx; | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기 로직이 복잡한데 메서드로 추출해보는건 어떨까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
전체적으로 클래스도, 책임도 잘 나누어 주셨는데 이 부분의 복잡도가 높은 것 같습니다.
메서드 추출 혹은 리팩토링으로 조금 더 로직을 가독성 좋게 만들어보시면 좋겠습니다.
(v1, v2) -> v1, LinkedHashMap::new))); | ||
} | ||
|
||
int findOutputIdx(int startIdx) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기에 접근 제한자가 빠진 이유가 있을까요~?
makeResult에서만 활용하는거라면 private 메서드로 만들어주시면 좋겠습니다.
People people = ladder.people(); | ||
Lines lines = ladder.lines(); | ||
private static String generateLine(String result) { | ||
if (isVerticalLine(result)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
뷰 쪽의 isVerticalLine
로직을 도메인, 핵심 비즈니스 로직에서 활용하고 있는 형태인데요.
의존이 도메인 -> 뷰를 향하고 있기 때문에 좋은 형태로 보이지 않습니다. 개선해보시면 어떨까요?
리뷰 잘 부탁드립니다 ^^