2단계 - 자동차 경주(1) 코드 리뷰 요청 드립니다.#279
2단계 - 자동차 경주(1) 코드 리뷰 요청 드립니다.#279young891221 merged 10 commits intonext-step:sogoagainfrom sogoagain:feat/racing
Conversation
변경 내역: - 다항연산에 사용되는 자료구조를 Stack에서 Deque, Queue로 변경 - 자료구조 변경에 따른 CollectionUtils 클래스 미사용으로 삭제 - 사칙 연산을 한 식에서 모두 사용하는 테스트 케이스 추가
변경 내역: - Polynomial 객체 생성 과정에서 3번의 loop를 호출하던 로직을 1번의 loop으로 단축 - Polynomial 계산 로직 일부 수정 - CollectionUtilsTest 클래스 미사용으로 삭제 - PolynomialParser 클래스 삭제 - PolynomialParsingUtils 추가
자동차 경주(1) 기능 목록(대분류): - 자동차의 기능 1. 이동/정지: 게임 규칙에 따라 이동 혹은 정지 할 수 있다. - 게임 규칙 기능 2. 0과 9사이에서 발생시킨 랜덤값이 4보다 커야 자동차가 이동할 수 있다. - 사용자 인터페이스 기능 3. 경주에 참가할 자동차 댓수 입력: 표준 입력 4. 자동차의 이동 시도 횟수 입력: 표준 입력 5. 자동차 경주 상황 출력: 표준 출력
DrivingRule 제공 기능: - isMovable: 규칙에 따라 이동 가능 여부를 판별한다.
Car 제공 기능: - move: 규칙에 따라 이동할 수 있다. DrivingRule 작성 이유: - Car의 이동 기능을 테스트 하기 위해 Random 조건으로 이동하는 것뿐만 아니라 무조건 이동할 수 있는 규칙을 적용 하기 위하여 인터페이스 추출
InputView 제공 기능: - inputNumberOfCars: 자동차 대수 입력 - inputNumberOfTries: 시도 횟수 입력
OutputView 제공 기능: - printCarPosition: 자동차 출력 - printResultMessage: 결과 문구 출력 - printRoundSeparator: 라운드 구분자 출력
RacingGame 제공 기능: - run: 레이싱 게임 진행
Cars 제공 기능: - move: 여러대의 Car들을 움직인 뒤 각 차들의 위치를 반환한다.
young891221
left a comment
There was a problem hiding this comment.
문자열 계산기에서 피드백 드렸던 내용을 잘 반영하셨네요! 👍
특히 2단계에서 랜덤 함수 테스트 & 일급 객체 생성은 인상깊었습니다.
몇 가지 피드백이 있지만 다음 단계에서 바로 적용해도 될거 같기에 머지하도록 하겠습니다.
| public List<Integer> move() { | ||
| List<Integer> positions = new ArrayList<>(); | ||
|
|
||
| for (Car car : |
There was a problem hiding this comment.
PR에서만 개행이 들어간 것일까요??ㅎㅎ
컨벤션 일치 부탁드립니다~!
| } | ||
|
|
||
| public static void printCarPositions(List<Integer> positions) { | ||
| for (int position : |
| this.drivingRule = drivingRule; | ||
| } | ||
|
|
||
| public static Car createCar() { |
There was a problem hiding this comment.
2번 질문에 대해서 저는 이 부분을 개선하면 좋을듯 합니다.
DrivingRule을 인터페이스로 잘 구현하셨습니다ㅎㅎ
여기에 추가적으로 createCar()를 만들때 파라미터로 해당 인터페이스의 숫자를 직접 컨트롤 할 수 있는 구현체를 구현해 테스트해 볼 수 있을것 같습니다.
또는, 말씀해 주신 Mock처리도 좋은 방법입니다.
|
|
||
| import java.util.Scanner; | ||
|
|
||
| public class InputView { |
There was a problem hiding this comment.
2번에서 질문주신 뷰에 대한 테스트는 실질적으로 수행하기 어렵습니다.
그리고 무엇보다 테스트의 의미력이 떨어집니다.
| public class RacingCarMain { | ||
| public static void main(String[] args) { | ||
| RacingGame racingGame = new RacingGame(); | ||
| racingGame.run(); |
There was a problem hiding this comment.
깔끔하네요. 만약, Integration 테스트까지 포함하고자 한다면 최대한 input/output이 항상 존재하도록 코딩하는 습관이 좋습니다.
'racingGame.run();'의 경우에도 void로 반환된다면 RacingGame에 대한 테스트가 힘들지 않을까 생각되네요.
|
|
||
| class CarsTest { | ||
| @Test | ||
| void Cars는_여러대의_Car를_다루는_일급_컬렉션이다() { |
There was a problem hiding this comment.
일급 객체를 만드시다니 훌륭합니다!
다른 객체들도 모두 일급 객체로 만드시도록 도전해 보시는것도 추천드립니다ㅎㅎ
안녕하세요. :)
2단계 - 자동차 경주(1) 코드 리뷰 요청 드립니다.
model 패키지에 속한 클래스들에 대해서는 테스트 코드를 작성하였습니다.
그러나, controller와 view 패키지에 속한 클래스들에 대해서는 테스트 코드를 작성하지 못했습니다.
UI 코드가 섞이니 테스트 코드 작성이 어려웠습니다. 혹시 이럴 경우에는 어떻게 테스트 코드를 작성하면 좋을까요?
랜덤으로 움직이는 자동차에 대한 테스트 코드 작성도 어려웠습니다. 그래서 랜덤으로 자동차의 움직임을 판별하는 코드를 외부 인터페이스로 뺀 뒤 Mock 객체를 이용해 테스트를 작성했습니다. 혹시 더 좋은 방법이 있을까요?
추가적으로 피드백 있으시면 편하게 말씀주세요!
감사합니다. :)