Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

java-racingcar-precourse

  • 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다.
  • camp.nextstep.edu.missionutils.Console.readLine()
  • camp.nextstep.edu.missionutils.Randoms.pickNumberInRange(0, 9);

기본 원칙

  • 워크플로우: 일반적으로 인터페이스 - 테스트 - 구현 순서로 진행한다.
  • 커밋 표준: feat(인터페이스): implement (구현한 메서드). 이후 상세 정보 추가.
  • 상속 기준: 1. 동일한 역할, 2. 부모 클래스 종속성. 이외에는 조합을 활용.

1. 요구사항 정리

입력부터 출력까지 자료형의 변환으로 논리적 흐름을 표현한다.
필요하다면 임의의 자료형을 새롭게 정의할 수 있다.

String(CSV) + Integer(Iteration) -> List<Car{String, Integer}> Car -> RacingCar implements Comparable<Car>

2. 객체 설계

작업을 진행할 대상을 선택하고, 책임과 역할을 체크리스트로 나열한다.

Car

  1. 이름 (불변; rule 기반 DTO로 주입)
    • 자동차 이름의 입력
    • 자동차 이름의 입력은 쉼표를 기준으로 구분
    • 자동차 이름은 5자 이하 가능
    • 추가로 자동차 이름은 사용자를 식별할 수 있는 id의 역할을 해야한다고 생각한다.
    • 따라서, 자동차 이름은 서로 중복을 허용하지 않는다.
    • 이를 위해, 자동차 이름은 영문 소문자의 조합으로 제한한다.
  2. 이동 거리 (가변)
  3. 외부에서 이름과 이동거리를 참조할 수 있어야 한다. (DTO)

RacingCar

  • 이동 거리를 기준으로 비교 가능하도록 implements Car, Comparable<RacingCar>
    • RacingCarint position 필드를 불변으로 두고 VO처럼 활용한다면 Comparable 인터페이스를 구현해도 된다.
    • 그러나 현재 디자인 컨셉은 가변 상태를 허용하므로, identity/equality 평가의 관점에서 ComparableObject 인터페이스의 계약이 충돌한다.
    • 따라서, 해당 사항은 상태를 표현하는 VO 또는 객체 컨테이너 수준에서 다루는 것이 좋아보인다.
      • 그래서 RacingCar.Status에서 처리함

Strategy

  • 제네릭 T 받아서 이동 거리 결정하는 전략 인터페이스
    • 현재 default 전략을 사용하기 때문에 관리 대상에서 제외
  • 인터페이스 확장 어댑터 팩토리 내장

RaceGame

  • n대의 자동차 (일급 컬렉션)
  • 자동차의 전진과 정지
    • 전진 조건
      1. 0에서 9 사이의 무작위 값을 구하고
      2. 그 값이 4 이상인 경우
    • 자동차 전진 시 콜백을 통한 출력
      • 전진하는 자동차의 출력 시 이름과 거리 출력
      • 출력 형식을 보면 자동차는 입력 순서대로 출력되는 것 같다.
  • 게임 완료 (rule DTO)
    • 우승자를 알려준다
    • 우승자는 한 명 이상일 수 있다.
    • 우승자가 2명 이상일 경우 쉼표를 이용하여 구분한다.

3. 예외 상황

잘못된 입력에는 IllegalArgumentException 발생시키고 종료한다.

  • 이름 입력에 불필요한 쉼표가 존재할 때
  • 자동차 이름에 영소문자 외에 다른 문자가 들어갔을 때
  • 자동차 이름이 비어있을 때
  • 자동차 이름이 중복될 때
  • 반복 횟수가 양의 정수가 아닐 때