Open
Conversation
게임의 핵심 로직과 인터페이스 제약 사항을 구체화하고 구현 순서를 정비 [적용 사항] 1. 핵심 로직 상세 정의 - 정답 생성, 숫자 비교(스트라이크/볼/낫싱), 승리 조건 명시 2. 인터페이스 제약 사항 추가 - 입력값 범위(1~9, 3자리, 중복 없음) 및 예외 처리(IllegalArgumentException) 기준 확립 3. 커밋 계획 세분화 - 도메인, 뷰, 컨트롤러 계층으로 분리하여 TDD 흐름에 맞게 작업 순서 조정 [적용 이유] 개발 요구 사항을 명확히 하고 체계적인 구현 가이드를 제공하기 위함이다. Resolves: next-step#2
junit 학습 테스트 실행 및 적용 [적용 사항] junit 테스트 파일 추가 - @beforeeach 어노테이션 실습 - assertThat 조건 학습 [적용 이유] 단위 테스트 적용을 위한 연습
난수 생성 도메인 로직 구성 [적용 사항] - INumberGenerator 인터페이스 기반 IntNumberGenerator 구현체 작성 - 1~9 사이의 서로 다른 임의의 수 3개를 생성하는 로직 구현 - `Date` 시드를 활용한 난수 생성 테스트 코드(`NumberGeneratorTest`) 작성 [적용 이유] - 핵심 로직인 정답 숫자 생성을 위함 - 일관된 테스트 환경을 구축
[적용 사항] - IScoreCalculator 인터페이스 기반 StrikeCalculator, BallCalculator 구현 - 스트라이크(같은 수, 같은 자리) 판별 로직 구현 - 볼(같은 수, 다른 자리) 판별 로직 구현 - BallCalculator가 StrikeCalculator를 의존하도록 구성하여, 볼 계산 시 스트라이크 수를 제외 - @ParameterizedTest를 활용하여 다양한 케이스에 대한 테스트 코드(ScoreCalculatorTest) 작성 [적용 이유] - 사용자가 입력한 숫자와 컴퓨터의 숫자를 비교하여 힌트를 제공하는 핵심 로직을 구현, 연산이 아닌 계산식으로 표현하여 의존성 분리를 위함 - 단위 테스트를 통해 볼, 스트라이크 판별 로직의 정확성을 검증하고 안정성을 확보하기 위함
[적용 사항] * Coordinator 패턴을 도입, 게임의 전체 흐름을 관리 MainCoordinator를 구현 * PlayViewControllerDelegate와 HomeViewControllerDelegate 구현, 각 뷰 컨트롤러에서 발생하는 이벤트(게임 종료, 재시작)를 MainCoordinator가 받아 처리 * 게임 시작 및 재시작 시 PlayViewController를, 게임이 끝나면 HomeViewController를 표시하도록 화면 전환 로직을 구현했습니다. * DIContainer를 활용하여 PlayViewController 생성 시 의존성인 integerNumberGenerator를 주입하도록 구조를 개선했습니다. [적용 이유] * 뷰 컨트롤러(View Controller) 간의 직접적인 의존 관계를 제거 및 화면 흐름 제어 및 책임을 Coordinator로 위임을 통한 객체 역할 분리하기 * 화면 전환 로직을 한 곳에서 중앙 관리함으로써 코드의 유지보수성을 높이고, 향후 새로운 화면이 추가되거나 흐름이 변경될 때 유연하게 대처할 수 있는 구도 * Coordinator가 뷰 컨트롤러의 생성과 소멸을 관리
[적용 사항] - 도메인 객체 생성: 엔티티를 도입하여 스트라이크/볼 카운트 및 게임 결과를 객체로 표현했습니다. - 스트라이크 존 계산 로직 구현: 인터페이스와 구현체를 추가하여 사용자 입력과 컴퓨터 숫자를 비교하고 스트라이크, 볼, 낫싱, 게임 종료 등의 결과 로직 분리 - 메인 플레이 로직 통합: 에 를 주입받아 게임의 메인 플레이 로직을 구현했습니다. 사용자 입력 처리, 스트라이크 존 계산, 결과 출력, 게임 종료 조건 등을 포함합니다. - 의존성 주입 컨테이너 업데이트 - 테스트 코드 추가: 스트라이크 존 계산 로직의 정확성을 검증 [적용 이유] - 핵심 게임 로직 분리 및 모듈화: 스트라이크 존 계산이라는 핵심 로직을 별도의 모듈()로 분리하여 코드의 응집도를 높이고 유지보수성을 향상시켰습니다. - 객체 지향적 설계 강화: 와 를 통해 게임의 상태와 결과를 명확한 객체로 관리하여 코드의 가독성과 확장성을 높였습니다. - 의존성 관리 개선: 를 활용하여 객체 간의 의존성을 명확히 하고, 가 직접 의존성을 생성하지 않고 주입받도록 하여 테스트 용이성을 확보했습니다. - 테스트 용이성 확보: 각 도메인 로직을 독립적인 단위로 테스트할 수 있도록 하여, 기능 변경 시 발생할 수 있는 잠재적 버그를 줄이고 코드의 안정성을 확보했습니다.
[적용 사항] - 유저 플레이 모드 엔티티 추가: 정확히 재생 중인지, 끝낼 것인지 나타내는 모드 열거형을 엔티티로 추가합니다. - DIContainer > generatedNumber 값 추가: 몇 개의 숫자를 기반으로 게임을 할 지 결정합니다. - HomeView, PlayView와 ViewController 분리 [적용 이유] - 1(시작), 2(종료)와 같은 매직 넘버를 사용하는 대신, UserPlayMode.Start, UserPlayMode.Finish와 같이 의미가 명확한 열거형(Enum)을 사용했습니다. 이를 통해 코드의 가독성이 향상되고, 컴파일 시점에 타입을 검증할 수 있어 잘못된 값이 입력될 가능성을 원천적으로 차단합니다. - '화면에 보여주는 책임(View)'과 '데이터를 해석하고 흐름을 제어하는 책임(ViewController)'을 분리, 향후 UI를 콘솔에서 GUI로 변경 대응을 위함
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
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.
No description provided.