-
Notifications
You must be signed in to change notification settings - Fork 444
[자동차 경주 게임] 송인봉 미션 제출합니다. #490
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
Closed
Closed
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
* docs: README 기능 구현 목록 - 완료 사항 기록 * feat: 책임 전가를 위해 NameLength enum 클래스 생성 * feat: 책임 전가를 위해 Delimiter enum 클래스 생성 * feat: 문자열 파싱 및 유효성 검사 로직 메소드 구현 * feat: Reader 인터페이스 및 구현체 생성 * feat: 자동차이름입력예외 클래스 생성 * test: CarNameInputTest 테스트코드 작성 * feat: RacingCarException 상속 클래스 생성
* docs: README 기능 구현 목록 - 완료 사항 기록 * feat: 책임 전가를 위해 CountRange enum 클래스 생성 * feat: 문자열 정수변환 및 유효성 검사 로직 메소드 구현 * feat: 이동횟수입력예외 클래스 생성 * test: ExecutionCountInputText 테스트코드 작성
* docs: README 기능 구현 목록 - 완료 사항 기록 * feat: 책임 전가를 위해 RunnableCondition enum 클래스 생성 * feat: GameManger 이름 등록, 라운드 실행 및 결과반환 메소드 구현 * feat: NumberPicker 인터페이스 및 구현체 생성 * test: GameManagerTest 라운드실행 테스트코드 작성 * feat: Car 클래스 toString 구현 및 Delimiter 메소드 추가 * test: CarToStringTest 테스트코드 작성
* docs: README 기능 구현 목록 - 완료 사항 기록 * feat: 우승자결정 로직 메소드 구현 * test: GameManagerTest 테스트코드 추가
* refactor: GameManager 클래스 리팩토링 * test: GameManagerTest 테스트코드 수정 * feat: GameTotalResultDto 클래스 생성 * feat: GameRoundResultDto 클래스 생성
* docs: README 기능 구현 목록 -완료 사항 기록 * feat: 책임 전가를 위해 Delimiter#joinWIthComma 메소드 추가 * feat: 게임라운드 결과 및 우승자 출력 로직 메소드 구현 * feat: OutputMessage 출력 메시지 상수화
* docs: README 기능 구현 목록 - 완료 사항 기록 * feat: Delimiter UNDER_BAR -> BAR 수정 (문자 지정 실수 확인) * feat: 예외발생시 입력 재요청 및 예외메시지 출력 로직 추가 * feat: 안내 메시지 출력 로직 추가 * feat: OutputMessage 안내 메시지 추가
* feat: Application 의존성 주입 * feat: GameController 클래스 구현 * style: GameManager -> GameService 클래스명 변경
* test: 입력기능 테스트코드 재작성 * feat: 사용자입력 및 메시지출력 로직을 분리
# feat: ErrorMessage 수정 * feat: CountRange#getMinimum 구현 * feat: NameLength#getMaximum 구현
* docs: README 리팩토링 목록 - 완료 사항 기록 * chore: domain 패키지의 dto 클래스를 controller/dto 패키지로 이동 * chore: resource/rule 패키지의 enum 클래스를 utils 패키지로 이동
* docs: README 리팩토링 목록 - 완료 사항 기록 * feat: NumberRange enum 클래스 생성
* docs: README 리팩토링 목록 - 완료 사항 기록 * feat: 기존 Application 에서 이뤄지던 객체 생성을 AppConfig 로 이동.
* docs: README 리팩토링 목록 - 완료 사항 기록 * feat: 기존의 InputView 클래스로부터 InputViewValidator 클래스 추출 * feat: 기존의 OutputMessage 클래스로부터 InputMessage 클래스 추출 * chore: view/input 패키지를 view/reader 패키지로 이름 변경
* feat: Delimiter#joinWithComma 에서 콜론(:)을 콤마(,)로 변경
- 과제 진행 요구사항에 따라 초기의 README 파일은 유지하고 - docs/README.md 파일에 기능 구현 목록 작성
* style: InputViewValidator#validateNames 유효성 검사 로직 순서 변경 - 공백입력 예외처리를 중복입력 예외처리보다 우선시하도록 변경 * feat: 입력 문자열 우측에 띄어쓰기( )를 붙이는 로직 구현 - Delimiter#appendSpaceBehind 메소드 생성 - InputView#apendSpaceBeforeSplit 메소드 생성 - InputView#parsingNames 메소드 수정
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
프로그래밍은 끊임없이 고민하는 것이 매력 포인트라고 생각합니다.
이번 2주차에서는 아래의 두 가지에 대해 고민하며 과제를 진행했습니다.
Git 히스토리 관리
1주차와 달리 2주차 과제에서는 squash를 통해 Git 히스토리를 관리했습니다. 지난 과제를 돌이켜보면 기능 구현에 따라 테스트코드 작성, 메소드 구현, 리팩토링 등을 하나씩 커밋했습니다. 커밋의 단위가 작은 만큼 각 시점의 변경 사항을 확인하기는 좋았지만 각 커밋이 어떤 기능 구현과 연관되어 있는지 확인하기 어려웠습니다. 그래서 이번에는 기존의 커밋 방식을 유지하되 기능 구현이 끝나면 관련 커밋들을 squash 하는 방식을 택했습니다. 그 결과 기능 단위의 커밋을 직관적으로 확인할 수 있었으며 기능 구현과 관련된 내용은 커밋 메시지를 통해 파악할 수 있었습니다.
추상 팩토리 패턴
1주차 과제 당시 스트라이크/볼 판별 로직에 대한 테스트코드를 작성했습니다. 항상 동일한 결과를 반환해야하는 테스트코드 특성상 랜덤값의 존재는 골칫거리였습니다. 랜덤값에 따라 매번 다른 비교값을 대입할 수 없는지라, Referee 클래스에 setter 메소드를 생성하여 랜덤값을 특정값으로 강제 삽입하는 방법을 택했습니다. 하지만 사용하지 않는 setter 메소드를 테스트코드를 위해 생성해놓는 것은 명백히 좋지 않은 행위였습니다. 비록 1주차 과제 기간 동안 대체 방법을 생각해내지 못했지만, 이번 2주차 과제에서는 추상 팩토리 패턴을 통해 이 문제를 해결했습니다. GameService와 NumberPicker의 관계에 추상 팩토리 패턴을 적용함으로써, 테스트코드에서 CustomNumberPicker 클래스를 통해 전진 조건에 사용되는 랜덤값을 특정 지을 수 있었습니다. 그리고 이와 같은 방식으로 InputView 테스트코드에서도 CustomReader 클래스를 통해 사용자 입력값을 직접 삽입할 수 있었습니다. 이 방식을 채택하자 기존의 클래스를 변경할 필요없이, DI를 통해 원하는 행위를 유도할 수 있었습니다.