Skip to content

Conversation

@ssilverrain
Copy link

No description provided.

Application 진입점(main)과 RacingController 실행 흐름을 구성했다. domain, controller, view, util 패키지와 필요한 기본 클래스를 추가해 계층별 구조를 갖추고 이후 기능 확장 기반을 마련함.
RacingController에서 InputView.readInput을 호출해 입력 흐름을 연결함. 콘솔에서 자동차 이름을 입력받아 쉼표로 분리하고, 각 이름의 앞뒤 공백을 제거해 목록 형태로 반환하도록 구현함.
자동차 이름이 5자를 초과하거나 빈 문자열, 공백만 포함된 경우 예외를 발생시키도록 검증을 적용함. 기존 Validator에서 로직을 분리해 각 이름 입력 시 유효성을 확인함.
콘솔에서 시도 횟수를 입력받아 정수로 변환하는 기능을 추가했다. InputView에 readAttemptCount 메서드를 구현했으며, 기존 readInput 메서드는 역할을 명확히 하기 위해 readCarNames로 이름을 변경했다.
시도 횟수가 1 이하일 경우 예외를 발생시키고, 정수가 아닌 입력에 대해 NumberFormatException을 IllegalArgumentException으로 변환하도록 처리했다. Validator 클래스에 validateAttemptCount 메서드를 추가해 입력값 검증 책임을 분리했다.
자동차의 이름과 위치를 관리하는 필드를 추가하고, 난수 값이 4 이상일 때 전진하는 move 메서드를 구현했다. 필요한 정보를 제공하기 위해 getName과 getPosition 메서드를 포함함.
프로젝트 전반에서 일관된 랜덤 정수 생성을 위해
범위 기반 랜덤 유틸리티 클래스를 추가함.
final 클래스와 private 생성자를 적용해 인스턴스화를 방지함.
자동차 객체를 관리하는 일급 컬렉션 Cars 클래스를 추가함.
List.copyOf()로 외부 리스트를 불변 복사하여 내부 상태를 보호함.
moveAll() 메서드로 모든 자동차를 일괄 이동시키고,
RandomNumberGenerator를 활용해 랜덤 값 생성 책임을 분리함.
InputView에서 입력받은 자동차 이름 배열을 Car 객체 리스트로 변환하고,
이를 기반으로 Cars 객체를 생성하여 경주 준비 단계의 초기화를 완료함.
readCarNames()의 반환 타입을 String[]에서 List<String>으로 변경함.
데이터 변환 과정을 단순하게 정리하고 코드 흐름을 간결하게 만듦.
InputView를 final 필드로 변경하여 참조의 재할당을 방지하고,
결과 출력을 위한 OutputView 필드를 새로 추가함.
OutputView에서 각 자동차의 현재 위치를 "이름 : ---" 형식으로 출력하도록 구현함.
출력 형식 및 동작 검증을 위해 임시로 Cars.moveAll() 호출 로직을 추가함.
입력받은 시도 횟수(attemptCount)만큼 자동차 이동과 결과 출력을 반복 실행하도록 구현함.
경주가 여러 라운드에 걸쳐 진행되도록 하여 실제 게임 흐름을 완성함.
모든 자동차 중 가장 멀리 이동한 자동차를 찾아 우승자로 선정하는 로직을 Cars에 추가함.
최대 position 값을 기준으로 동점자도 함께 반환하도록 구현해 공동 우승 처리를 지원함.
경주 종료 후 Cars.getWinners()로 계산된 우승자 목록을
OutputView에서 "최종 우승자 : pobi, jun" 형식으로 출력하도록 구현함.
복수 우승자도 쉼표로 구분해 표시하며, 경주의 결과 흐름을 완성함.
OutputView에서 직접 문자열을 조합하던 로직을 Car.status()로 위임함.
View는 출력만 담당하고, Car는 자신의 상태를 스스로 표현하도록 구조 개선.
들여쓰기 depth를 줄이고 응집도를 높임.
입력 데이터의 유효성과 게임 진행 흐름이 요구사항에 따라 동작함을 보장하기 위함
- 정상 입력 시 실행 결과 및 우승자 출력 테스트 추가함
- 이름 길이 초과 입력에 대한 예외 테스트 추가함
- 공백 포함 입력에 대한 예외 테스트 추가함
- 빈 이름 입력에 대한 예외 테스트 추가함
- 중복 이름 입력에 대한 예외 테스트 추가함
- 음수 및 숫자가 아닌 입력에 대한 예외 테스트 추가함
- 공동 우승자 출력 형식 테스트 추가함
Cars.getWinners() 내부의 최대 이동거리 계산과 우승자 필터링 로직을
findMaxPosition(), findCarsWithPosition()으로 분리함.
메서드의 단일 책임을 명확히 하고 코드의 의도를 쉽게 파악할 수 있도록 리팩토링함.
구분자만 입력되어 유효한 자동차 이름이 하나도 없는 경우를 검출하도록 보완함
- split 이후 유효 이름 개수 확인하여 0개일 때 IllegalArgumentException 발생시키도록 처리함
- 잘못된 입력을 조기에 차단하여 이후 로직 진행을 방지함
검증 로직이 도메인 규칙에 해당하므로 domain 패키지로 위치를 조정함
Car 객체 생성 시 자체적으로 이름의 유효성을 검증하도록 변경함. 또한 이름 길이 제한과 이동 기준값을 상수로 분리해 가독성과 유지보수성을 개선함.
자동차 목록 생성 시 이름 중복 여부를 확인하고, 비어있는 목록이 전달될 경우 예외를 발생시키도록 검증 로직을 추가함.
자동차 이름이 없거나 공백만 입력된 경우 예외를 발생시키도록 입력 형식을 검증함
AttemptCount 값을 별도 객체로 분리해 시도 횟수 검증을 도메인 내부에서 처리하도록 변경함
AttemptCount 값 객체를 사용해 시도 횟수 검증을 도메인으로 위임하고, Controller는 입력과 실행 흐름 제어에만 집중하도록 역할을 정리함
검증 로직이 도메인 객체로 이동해 Validator 클래스가 더 이상 필요하지 않아 삭제함
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.

1 participant