전체 보기
🍀

11일차_객체지향을 미션 설계에 적용하기(with [책] 객체 지향의 사실과 오해)

작성일자
2023/10/29
태그
DIARY_DEVELOP
프로젝트
PreCourse
책 종류
1 more property

이번 주차 미션 정리

기능 요구 사항
주어진 횟수동안 n대의 자동차는 전진 또는 멈출 수 있음
사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 함
사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시키고 앱 종료해야 함
전진하는 조건은 0~9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우임
각 자동차에 이름 부여할 수 있음
전진하는 자동차 출력할 때 자동차 이름을 같이 출력함
자동차 이름은 쉼표를 기준으로 구분하며 이름은 5자 이하만 가능함
게임 완료한 후 우승자 알려줌
우승자가 여러 명일 경우 쉼표를 이용하여 구분함
프로그래밍 요구 사항
indent depth는 최대 2까지만 허용함 (while문 안에 if문 들어있음 2임)
3항 연산자 금지함
함수가 한 가지 일만 하도록 최대한 작게 만들어야 함
Junit5와 AssertJ를 이용해 본인의 기능 목록이 정상 동작함을 테스트 코드로 확인해야 함 (test/java/study 참고)
Randoms.pickNumberInRange(0,9)와 Console.readLine() 활용해야 함
과제 진행 요구 사항
기능 구현 전에 기능 목록 만들고, 기능 목록 단위로 커밋하기
과제 목표
함수 분리하고, 함수별로 테스트 작성하는 것에 익숙해지기
소감문엔 이번주차 목표를 중심으로 학습하면서 느낀 점 적기. 이때 학습한 “과정”을 잘 드러내기
예외 처리
자동차 이름 : 쉼표 사이의 무엇이든 가능
이동 횟수 : 정수

[책] 객체 지향의 사실과 오해를 읽고 설계해보기

책 속 예시

이야기 : 하트 왕의 파이를 도둑 맞은 사건에 대해 모자장수가 증언함
재판장엔 하트 왕, 하얀 토끼, 모자 장수가 있었음
하트 왕이 “첫 번째 목격자를 불러라” 라고 명령함
하얀 토끼가 “목격자인 모자 장수 나와라”라고 외침
모자 장수가 증언대에 섬
하트 왕이 “증언하라”라고 명령함
모자 장수가 증언을 함
협력 : 요청과 응답
누군가가 왕에게 재판을 요청함으로써 재판이 시작됨
왕이 하얀 토끼에게 증인을 부를 것을 요청함
왕의 요청을 받은 토끼는 모자 장수에게 증인석으로 입장할 것을 요청함
모자 장수는 증인석에 입장함으로써 토끼의 요청에 응답함
모자 장수의 입장은 왕이 토끼에게 요청했던 증인 호출에 대한 응답이기도 함
왕이 모자 장수에게 증언할 것을 요청함
모자 장수는 증언함으로써 왕의 요청에 응답함
책임 : 하는 것과 아는 것
하는 것 : 하얀 토끼에게 목격자 불러오도록 요청, 모자 장수에게 증언하라 요청
하얀 토끼
하는 것 : 모자 장수가 증인석에 입장하도록 요청
아는 것 : 목격자가 모자 장수라는 사실
모자 장수
하는 것 : 스스로 증인석에 입장(생성)
아는 것 : 증언할 내용(자신이 알고 있는 사실을 증언해야 할 책임)
역할 : 책임의 집합 (재사용성)
왕 → 판사
모자 장수 → 증인

미션에 적용

삽질
삽질 2
이야기 : 자동차들이 경주를 함
게임장에 자동차들, 자동차 매니저, 진행자, 심판이 있음
진행자가 “자동차들 불러와라”라고 외침
매니저가 “빨간 자동차, 파란 자동차 나와라”라고 외침
빨간 자동차와 파란 자동차가 스타트 라인으로 나옴
아래를 5회 반복함
진행자가 “자동차들 출발!”이라고 명령함
매니저가 “빨간 자동차, 파란 자동차 출발!”이라고 외침
빨간 자동차와 파란 자동차가 이동함
진행자가 “자동차들 현재 위치를 말해라”라고 명령함
심판이 “빨간 자동차 3m, 파란 자동차 1m 지점!”이라고 외침
진행자가 심판한테 “우승자는 누구?”라고 물음
심판이 “우승자는~ 빨간자동차!”라고 답함
협력 : 요청과 응답
누군가가 진행자에게 경주를 요청함으로써 경주가 시작됨
진행자는 자동차들이 스타트 라인에 설 것을 요청함
진행자의 요청을 받은 매니저는 빨간 자동차와 파란 자동차가 스타트 라인에 설 것을 요청함
빨간 자동차와 파란 자동차는 스타트 라인에 섬으로써 매니저와 진행자의 요청에 응답함
아래를 반복함
진행자가 자동차들에게 이동하라 요청함
진행자의 요청을 받은 매니저가 빨간 자동차와 파란 자동차한테 이동하라 요청함
자동차들이 이동함으로써 매니저와 진행자의 요청에 응답함
진행자가 심판한테 자동차들 현재 위치 말하라고 요청함
심판이 자동차들의 현재 위치를 답함으로써 진행자의 요청에 응답함
진행자가 심판한테 우승자를 답할 것을 요청함
심판이 우승자를 답함으로써 진행자의 요청에 응답함
책임 : 하는 것과 아는 것
진행자
하는 것 :
매니저한테 자동차들 불러오도록 요청, 매니저한테 자동차들 이동하도록 요청
심판에게 자동차들 현재 위치 답하도록 요청, 심판에게 우승자 답하도록 요청
심판
하는 것 : 자동차들 현재 위치 판독, 우승자 판독
아는 것 : 매 라운드 결과, 최종 결과
(자동차) 매니저
하는 것 : 자동차가 스타트라인에 입장하도록 요청, 자동차가 이동하도록 요청
아는 것 : 게임에 참여할 자동차들
자동차
하는 것 : 스스로 스타트라인에 입장(생성), 이동
아는 것 : 전진할 수 있는지 없는지 여부
역할 : 책임의 집합 (재사용성)
진행자 → 경주 진행자 (RacingController)
심판 → 경주 결과 (RacingResult)
자동차 매니저 → 자동차 컬렉션 (Cars)
자동차 → 자동차 (Car)

구현 기능 목록

삽질

용어 정의

경주 : 애플리케이션이 시작되어 경주가 시작되고 우승자가 나와 경주가 종료될 때까지를 의미한다.
이동 : 경주의 각 라운드를 의미한다. 매 이동(라운드)마다 자동차들은 전진하거나 안하거나 한다.
전진 : 이동과 달리 실제로 자동차가 움직였는지 안움직였는지 여부를 표현한다.
결과값이 pobi : -- 라면 전진 횟수는 2회라는게 특정되는 반면, 이동 횟수는 알 수 없다.

Model

Car (자동차)

자동차 이름 유효성 검사 기능
5자 초과면 예외 처리
전진 시도 기능
총 전진 거리 계산 기능

Cars (자동차 컬렉션)

자동차들 생성 기능
자동차들 이동 기능

RacingResult (경주 결과)

자동차들 총 전진 거리 수합 기능
우승 자동차 결정 기능

View

InputView

자동차 이름 입력 기능 (String → List<String>으로 변환해 반환)
이동 시도 횟수 입력 기능 (String → int로 변환해 반환)
정수 아니면 예외 처리
0 이하면 예외 처리

OutputView

자동차 전진 거리 출력 기능
우승 자동차 출력 기능

Controller

RacingController

경주 진행 기능
자동차이름으로 자동차 컬렉션 생성 기능
이동 시도 횟수만큼 자동차들 이동 기능
이동마다 결과 확인 기능
경주 결과 확인 기능

Util

RandomDigitGenerator

0~9 사이의 랜덤 숫자 생성 기능

Today in 프리코스

TIL 작성하기
준비
과제 설명 꼼꼼히 읽고 정리하기
몰입
객체지향의 사실과 오해 책 읽기
객체지향적으로 설계하기
기능 목록 작성하기(기능 내지 테스트 단위 중심)
다음 주차에 해보고 싶은 것
[책] 테스트 주도 개발 시작하기를 참고해 설계해보기
Search
1일차_둘러보기, 환경설정하기
2023/10/19
DIARY_DEVELOP
1일차_둘러보기, 환경설정하기
2023/10/19
DIARY_DEVELOP