-
Notifications
You must be signed in to change notification settings - Fork 119
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
[자동차 경주] 이지은 미션 제출합니다. #92
base: main
Are you sure you want to change the base?
Conversation
자동차 이름 길이 유효성 검사와 중복 검사를 하나의 함수로 묶어서 호출하도록 구현
타 클래스에서 입력받은 자동차 이름들을 사용하기 위해 inputCarNames 함수에서 names를 리턴
정수로 변환하는 parseRounds 함수를 통해 변환하도록 구현
횟수가 1 이상, Int 최댓값 이하인지 유효성 검사 진행
랜덤값이 4 이상일 경우 car의 move 함수를 호출하여 거리 증가
거리를 가장 많이 이동한 자동차 이름 리스트를 리턴
라운드 별 '자동차 이름 : -- (이동 거리)' 출력
RacingGameController의 startGame() 함수를 호출해 자동차 경주 게임 시작
이름 글자수 유효성 검사 시 라이브러리에 있는 MAX_NAME_LENGTH를 호출해 상수로 MAX_NAME_LENGTH 추가
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.
좋은 코드를 보며 MVC 패턴 구현에 있어 다시 한번 생각해볼 수 있는 시간이었습니다. 2주차 수고 많으셨고 남은 주차도 함께 화이팅해보아요!!
1. 음수를 입력한 경우 | ||
2. 0을 입력한 경우 | ||
3. 문자열을 입력한 경우 | ||
4. 입력한 수가 Int 범위를 벗어나는 경우 |
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.
integer 범위를 벗어나는 경우는 생각 못했네요!!
|
||
## 자동차 경주 | ||
|
||
📍구현할 기능 목록 |
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.
어딘가에서 전해들은 팁인데 체크리스트로 요구사항을 명세하고 해당 기능을 구현한 후의 커밋에 readme의 체크리스트를 [x]로 수정하여 제출하는 방식을 권장한다고 했었던 것 같아요.
저도 이 내용을 저번 주차 이후에 듣고 적용해보았더니 요구사항을 실수로 놓치거나 하는 일이 안 생겨서 좋더라구요.
괜찮다는 방식이란 생각이 드시면 지은님께서도 한번 이 방식을 적용해보시면 좋을 것 같아요!!
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.
이슈나 PR에서만 체크리스트 방식을 생각했었는데 그런 방식도 있겠군요! 공유 감사합니다 :)
fun startGame() { | ||
val rounds = inputView.inputRounds() | ||
|
||
repeat(rounds) { | ||
racingGame.playRound() | ||
resultView.printRoundResult(racingGame.getCars()) | ||
} | ||
|
||
val winners = racingGame.getWinners() | ||
resultView.printWinners(winners) | ||
} |
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.
이렇게 보니 컨트롤러의 책임을 최소화하여 뷰와 도메인의 중재자 역할만 하게 하는 것도 전체적인 흐름을 파악하는데에 어려움이 전혀 없네요.
제가 작성한 것보다 훨씬 구조를 파악하기 쉽고 책임 분리가 잘 된 객체지향적인 구현인 것 같습니다.
|
||
import camp.nextstep.edu.missionutils.Console | ||
|
||
class InputView { |
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.
View는 사용자에게 보여지는 화면의 기능만을 해야한다고 생각하기에 Validator와 Parser의 기능의 경우 다른 클래스로 분리하는 것이 좋을 것 같습니다.
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.
지은님 메소드가 하나의 역할만 하도록 신경쓰면서 구현헤주셔서 읽기 편한 코드였던거 같이요 👍🏻
몇가지 제 생각을 남겨보자면 inputView가 담당하고있는 책임이 너무 크지 않나? 하는 생각이 들었던거같아요..! 개인적으로는 입력은 입력으로만 관리하고 검증에 대한 책임은 다른 각 역할에 따른 책임을 가지는 객체가 가지도록 하는것도 하나의 방법이지 않을까..? 생각해봅니다!!(정답은 아니에요!)
그리고 지금 지은님 파일에서는 테스트에 대한 부분이 안보이는데,, 혹시 실수로 놓치신부분이지 조심스럽게 질문해봅니다!
val maxDistance = cars.maxOf { it.distance } | ||
|
||
return cars.filter { it.distance == maxDistance }.map { it.name } |
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.
바로 리턴해서 코드가 간결하게 표현하는 점도 좋지만, 이렇게 변수를 선언 후 값을 할당해서 리턴하는 방법을 통하면 좀 더 명확해지고, 디버깅시 이점이 있다고 합니다~!😀 아마도 취향차이이지 않으까 싶기도 하네요~
val maxDistance = cars.maxOf { it.distance } | |
return cars.filter { it.distance == maxDistance }.map { it.name } | |
val winners = cars.filter { it.distance == maxDistance }.map { it.name } | |
return winners |
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.
간결한 코드들은 바로 리턴해주는 습관이 있었는데 값을 할당하면 이런 장점들이 있군요 ㅎㅎ 이런 부분도 더 신경을 써봐야겠네요
감사합니다 !
저도 구현하면서 InputView가 점점 뚱뚱해지나 싶기도 했는데 다른 분들 코드를 많이 보다보니 검증과 관련된 부분들을 따로 빼는 게 좋겠다는 생각이 드네요 ㅎㅎ 좋은 의견 감사합니다 ! 아 테스트 코드는 새로 만드는 게 아니라 기존에 있는 테스트 코드를 통해 확인해보라는 것인 줄 알았는데 혹시 테스트 코드도 따로 작성이 필수였던 걸까요..!? |
💡 프리코스 2주차 과제
자동차 경주 구현
📍 구현 내용
구현 방식
MVC (모델 - 뷰 - 컨트롤러) 패턴을 사용하여 구현
Model
move()
: 자동차가 전진할 때 호출되는 메서드로 거리를 증가시킴playRound()
: 각 자동차가 이동하는 게임 라운드를 실행getCars()
: 현재 게임에 참여하고 있는 자동차 리스트를 반환getWinners()
: 현재까지의 라운드에서 가장 멀리 이동한 자동차를 찾아 그 이름을 리스트로 반환isMoveForward()
: Ramdon값을 사용하여 자동차의 이동 여부를 결정View
inputCarNames()
: 사용자에게 자동차 이름을 입력받음inputRounds()
: 사용자에게 시도할 라운드 수를 입력받음printRoundResult()
: 각 자동차의 이름과 이동 거리를 출력printWinners()
: 최종 우승자 목록을 출력Controller
startGame()
: 게임을 시작하는 메서드