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

[자동차 경주] 이지은 미션 제출합니다. #92

Open
wants to merge 37 commits into
base: main
Choose a base branch
from

Conversation

jieeeunnn
Copy link

💡 프리코스 2주차 과제

자동차 경주 구현

📍 구현 내용

구현 방식

MVC (모델 - 뷰 - 컨트롤러) 패턴을 사용하여 구현

Model

  1. Car
    • 역할 : 자동차의 상태와 동작을 정의
    • 주요 메서드
      • move() : 자동차가 전진할 때 호출되는 메서드로 거리를 증가시킴
  2. Game
    • 역할 : 자동차 경주 게임의 상태를 관리
    • 주요 메서드
      • playRound() : 각 자동차가 이동하는 게임 라운드를 실행
      • getCars() : 현재 게임에 참여하고 있는 자동차 리스트를 반환
      • getWinners() : 현재까지의 라운드에서 가장 멀리 이동한 자동차를 찾아 그 이름을 리스트로 반환
      • isMoveForward() : Ramdon값을 사용하여 자동차의 이동 여부를 결정

View

  1. InputView
    • 역할 : 사용자로부터 입력을 받고, 해당 입력의 유효성을 검증
    • 주요 메서드
      • inputCarNames() : 사용자에게 자동차 이름을 입력받음
      • inputRounds() : 사용자에게 시도할 라운드 수를 입력받음
      • 유효성 검사 함수들 설명은 생략하였습니다
  2. ResultView
    • 역할 : 자동차 경주 게임의 결과를 출력
    • 주요 메서드
      • printRoundResult() : 각 자동차의 이름과 이동 거리를 출력
      • printWinners() : 최종 우승자 목록을 출력

Controller

  1. RacingGameController
    • 역할 : 자동차 경주 게임의 주요 로직을 관리하며 View와 Model 간의 상호작용을 조정
    • 주요 메서드
      • startGame() : 게임을 시작하는 메서드

자동차 이름 길이 유효성 검사와 중복 검사를
하나의 함수로 묶어서 호출하도록 구현
타 클래스에서 입력받은 자동차 이름들을 사용하기 위해
inputCarNames 함수에서 names를 리턴
정수로 변환하는 parseRounds 함수를 통해 변환하도록 구현
횟수가 1 이상, Int 최댓값 이하인지 유효성 검사 진행
랜덤값이 4 이상일 경우 car의 move 함수를 호출하여 거리 증가
거리를 가장 많이 이동한 자동차 이름 리스트를 리턴
라운드 별 '자동차 이름 : -- (이동 거리)' 출력
RacingGameController의 startGame() 함수를 호출해
자동차 경주 게임 시작
Copy link

@nonani nonani left a 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 범위를 벗어나는 경우
Copy link

Choose a reason for hiding this comment

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

integer 범위를 벗어나는 경우는 생각 못했네요!!


## 자동차 경주

📍구현할 기능 목록
Copy link

Choose a reason for hiding this comment

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

어딘가에서 전해들은 팁인데 체크리스트로 요구사항을 명세하고 해당 기능을 구현한 후의 커밋에 readme의 체크리스트를 [x]로 수정하여 제출하는 방식을 권장한다고 했었던 것 같아요.
저도 이 내용을 저번 주차 이후에 듣고 적용해보았더니 요구사항을 실수로 놓치거나 하는 일이 안 생겨서 좋더라구요.
괜찮다는 방식이란 생각이 드시면 지은님께서도 한번 이 방식을 적용해보시면 좋을 것 같아요!!

Copy link
Author

Choose a reason for hiding this comment

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

이슈나 PR에서만 체크리스트 방식을 생각했었는데 그런 방식도 있겠군요! 공유 감사합니다 :)

Comment on lines +12 to +22
fun startGame() {
val rounds = inputView.inputRounds()

repeat(rounds) {
racingGame.playRound()
resultView.printRoundResult(racingGame.getCars())
}

val winners = racingGame.getWinners()
resultView.printWinners(winners)
}
Copy link

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 {
Copy link

Choose a reason for hiding this comment

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

View는 사용자에게 보여지는 화면의 기능만을 해야한다고 생각하기에 Validator와 Parser의 기능의 경우 다른 클래스로 분리하는 것이 좋을 것 같습니다.

Copy link
Author

Choose a reason for hiding this comment

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

다음 주차엔 조금 더 세부적으로 나눠보는 연습을 해야겠네요 ㅎㅎ 피드백 감사합니다 !

Copy link

@wjdrjs00 wjdrjs00 left a comment

Choose a reason for hiding this comment

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

지은님 메소드가 하나의 역할만 하도록 신경쓰면서 구현헤주셔서 읽기 편한 코드였던거 같이요 👍🏻

몇가지 제 생각을 남겨보자면 inputView가 담당하고있는 책임이 너무 크지 않나? 하는 생각이 들었던거같아요..! 개인적으로는 입력은 입력으로만 관리하고 검증에 대한 책임은 다른 각 역할에 따른 책임을 가지는 객체가 가지도록 하는것도 하나의 방법이지 않을까..? 생각해봅니다!!(정답은 아니에요!)

그리고 지금 지은님 파일에서는 테스트에 대한 부분이 안보이는데,, 혹시 실수로 놓치신부분이지 조심스럽게 질문해봅니다!

Comment on lines +25 to +27
val maxDistance = cars.maxOf { it.distance }

return cars.filter { it.distance == maxDistance }.map { it.name }

Choose a reason for hiding this comment

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

바로 리턴해서 코드가 간결하게 표현하는 점도 좋지만, 이렇게 변수를 선언 후 값을 할당해서 리턴하는 방법을 통하면 좀 더 명확해지고, 디버깅시 이점이 있다고 합니다~!😀 아마도 취향차이이지 않으까 싶기도 하네요~

Suggested change
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

Copy link
Author

Choose a reason for hiding this comment

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

간결한 코드들은 바로 리턴해주는 습관이 있었는데 값을 할당하면 이런 장점들이 있군요 ㅎㅎ 이런 부분도 더 신경을 써봐야겠네요
감사합니다 !

@jieeeunnn
Copy link
Author

지은님 메소드가 하나의 역할만 하도록 신경쓰면서 구현헤주셔서 읽기 편한 코드였던거 같이요 👍🏻

몇가지 제 생각을 남겨보자면 inputView가 담당하고있는 책임이 너무 크지 않나? 하는 생각이 들었던거같아요..! 개인적으로는 입력은 입력으로만 관리하고 검증에 대한 책임은 다른 각 역할에 따른 책임을 가지는 객체가 가지도록 하는것도 하나의 방법이지 않을까..? 생각해봅니다!!(정답은 아니에요!)

그리고 지금 지은님 파일에서는 테스트에 대한 부분이 안보이는데,, 혹시 실수로 놓치신부분이지 조심스럽게 질문해봅니다!

저도 구현하면서 InputView가 점점 뚱뚱해지나 싶기도 했는데 다른 분들 코드를 많이 보다보니 검증과 관련된 부분들을 따로 빼는 게 좋겠다는 생각이 드네요 ㅎㅎ 좋은 의견 감사합니다 !

아 테스트 코드는 새로 만드는 게 아니라 기존에 있는 테스트 코드를 통해 확인해보라는 것인 줄 알았는데 혹시 테스트 코드도 따로 작성이 필수였던 걸까요..!?

@wjdrjs00
Copy link

아 테스트 코드는 새로 만드는 게 아니라 기존에 있는 테스트 코드를 통해 확인해보라는 것인 줄 알았는데 혹시 테스트 코드도 따로 작성이 필수였던 걸까요..!?

스크린샷 2024-10-30 15 35 15

이번에 추가된 프로그래밍 요구사항이 이렇게 나와있는데,
저는 작성한 구현 기능 목록에서 적은 기능들에 대한 테스트를 진행하라는 의미로 이해했습니다!!

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.

3 participants