개요


기존 1단계에서 MVC 패턴으로 구조화하는 작업을 진행한다.
데이터를 전달할 때는 DTO를 이용한다. 


프로젝트 구조

 

객체


InputDTO
입력과 파싱에 대한 필드를 저장한다. 

 

OutputDTO
출력과 관련된 필드 및 메소드가 작성되어 있다. 

 

CarMoveBehavior
전략 패턴을 사용한다. 여기에는 몇 가지 이유가 존재하는데
테스트 코드 작성 시 랜덤 넘버를 받기 때문에 테스트 코드 작성 시 어려움을 갖는다. 
코드의 유지보수가 좋아진다. 

 

Cars
Cars 객체의 목적은 Car 객체를 Wrapping 하기 때문에 일급컬렉션으로서 역할이 충분하다고 생각한다. 
그 외 기능은 필요하지 않다.

 

FixNumberBehavior
무조건 갈 수 있다. 

 

RandomNumberBehavior
랜덤 넘버 제너레이트 후에 4이상인 경우 전진할 수 있다. 

 

Victory
가장 멀리 간 자동차 즉, 우승자를 찾는다. 

 

Car
Car 클래스에 불필요한 필드, 메소드가 포함되지 않는다. 
아쉬운것은 moveForward 메소드가 Car 클래스에 포함하지 않아도 된다. 

 

StringUtils
문자열을 지정한 매직 리터럴(,)을 기반으로 쪼개는 기능을 포함한다. 

 

Validation
다시 보니까 parsing과 validation 부분을 나눠야겠다고 생각했다. [해결]
매직 넘버를 지정하지 않았다. 

 

InputValidationException
커스텀 예외 처리를 만든다. 

 

RacingGameErrorInfo
매직 리터럴을 구현한다. 
불필요한 객체를 막는다. 

 

RacingGameInfo
매직 리터럴을 구현한다.
불필요한 객체를 막는다.

 

RacingCarUserConsole
입력에 필요한 필드, 메소드를 책임진다. 

 

RacingCarUserResult
출력에 필요한 필드, 메소드를 책임진다. 

 

Application
실행을 담당한다. 
여기서 Controller가 필요할까? main이 그 역할을 수행할 수  있다. [해결]

 

ApplicationTest
테스트 코드를 작성한다. 


코드 리뷰


아직 반영을 못했다. ^__^

결과

여전히 Stream이 익숙하지 않다.
TDD도 적용하지 못했다. 
확실히 전보다 클래스의 역할과 책임이 잘 분리되었다.

 

'IT' 카테고리의 다른 글

Spring Bean  (0) 2023.02.04
카프카 스터디를 시작하며  (0) 2022.12.03
넥스트스텝 - 레이싱 카 1단계  (0) 2022.01.29
넥스트스텝 - 계산기 리뷰  (2) 2022.01.29
git cherry-pick으로 rebase 완성하기  (0) 2022.01.28