Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2단계 - 사다리 게임 실행] 도이(유도영) 미션 제출합니다. #217

Merged
merged 61 commits into from
Feb 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
5186a11
docs: 실행 결과 조회 기능 추가로 인한 미션 명세 갱신
yoondgu Feb 20, 2023
37ed75c
feat: 사다리 방향 구현
yoondgu Feb 20, 2023
2abfe92
feat(미니미션): 미니미션 리스트 이해하기 구현
yoondgu Feb 22, 2023
459a872
feat: 사다리 방향 라인에 적용
yoondgu Feb 22, 2023
d57e9ae
feat: 사다리 종착지 구현
yoondgu Feb 22, 2023
c348852
feat: 사다리 종착지 구현
yoondgu Feb 22, 2023
74e8830
feat: 사다리 라인에서 이동할 방향 확인 기능 구현
yoondgu Feb 22, 2023
c2a821d
feat: 사다리 방향에서 다음 위치값 반환하는 기능 구현
yoondgu Feb 22, 2023
fb3e983
refactor: 사다리 라인들 클래스 분리, 랜덤값 외부 주입 가능하게 수정
yoondgu Feb 22, 2023
efb93f5
fix: 방향에 따른 다음 위치값 반환 오기능 수정
yoondgu Feb 22, 2023
4cfecaa
feat: 출발지에 따른 종착지 위치 계산 구현
yoondgu Feb 22, 2023
ae1cece
feat: 출발지에 따른 종착지 위치의 결과 구하는 기능 구현
yoondgu Feb 22, 2023
dd68d8e
feat: 참여자 이름을 전달받아 해당 참여자에 대한 결과를 반환하는 기능
yoondgu Feb 22, 2023
491ee7c
feat: 모든 참여자에 대한 결과를 반환하는 기능
yoondgu Feb 22, 2023
b6e49a9
feat: 사다리 종착지 결과를 입력받는 기능
yoondgu Feb 22, 2023
cce9c80
feat: 결과를 보고 싶은 참여자 이름을 입력받는 기능 구현
yoondgu Feb 22, 2023
13a1f32
feat: 사다리 게임 결과에 종착지 별 결과 출력 추가
yoondgu Feb 22, 2023
1666957
feat: 종착지 결과를 출력하는 기능 구현
yoondgu Feb 22, 2023
96a75e1
fix: 참여자 인덱스 검색 기능 버그 수정
yoondgu Feb 22, 2023
2a167ff
feat: 사다리 결과 조회 반복 및 종료 기능 구현
yoondgu Feb 23, 2023
221eb3d
docs: 2단계 다이어그램 업데이트
yoondgu Feb 23, 2023
771bba8
chore: 패키지 구조 전면 정리
yoondgu Feb 23, 2023
fb54217
refactor: 불변객체 대신 방어적 복사 적용에 따른 메서드명 수정
yoondgu Feb 23, 2023
ee05280
refactor: 상수명 단어 오기 수정
yoondgu Feb 23, 2023
336ddf9
refactor: 인덱스 검증 로직 유틸 클래스로 분리, 검증 관련 메서드 인덴트 수정
yoondgu Feb 23, 2023
4d21df0
fix: 예외메시지 포맷 유틸 클래스에 메시지 누적되지 않게 수정
yoondgu Feb 23, 2023
42c19de
refactor: 게임 결과 클래스 분리, 게임 실행 로직 메서드 분리
yoondgu Feb 23, 2023
064146d
fix: 게임 결과 출력 예시와 같게 변경
yoondgu Feb 23, 2023
360f10e
refactor: 검증 메서드 인덴트 수정 추가, 클래스명 단순화
yoondgu Feb 23, 2023
d53686b
refactor: 사다리 결과 원시값 포장
yoondgu Feb 23, 2023
dedac35
refactor: 입력받은 원시값 포장 책임 각 클래스에 분리
yoondgu Feb 23, 2023
df16899
docs: 기능 목록 순서 수정, 예외 발생 항목 정리
yoondgu Feb 23, 2023
7059e07
refactor: 인덱스 검증 유틸 클래스 패키지 이동, 테스트 작성
yoondgu Feb 23, 2023
08928ab
feat: 참여자 이름 검증 로직 추가
yoondgu Feb 23, 2023
f7598b3
feat: 참여자 이름 간 중복 검증 로직 추가
yoondgu Feb 23, 2023
2995f54
test: 사다리 미생성 시 결과 확인 예외 테스트 추가
yoondgu Feb 23, 2023
981c56b
refactor: 사다리 라인 생성 로직 메서드 분리
yoondgu Feb 23, 2023
fd588cc
refactor: 사다리 방향 메서드명 구체적으로 수정
yoondgu Feb 23, 2023
e1540b1
refactor: 사다리 라인에서 직접 다음 라인의 위치를 구하도록 수정
yoondgu Feb 23, 2023
a2f3b3f
refactor: 사다리 출력 문자열 생성 로직 클래스 분리
yoondgu Feb 23, 2023
6b3388b
style: 테스트 클래스 언더바 제거 어노테이션 통일
yoondgu Feb 23, 2023
5d0e39f
test(미니미션): 테스트 메서드에 콘솔 출력 제거
yoondgu Feb 23, 2023
08cebae
style: 테스트 코드 빈줄 및 어노테이션 오기 수정
yoondgu Feb 23, 2023
393edda
style: 빈줄 수정 및 주석 삭제
yoondgu Feb 23, 2023
0a6ab05
refactor: 테스트 코드 기대값 생성 로직 단순화
yoondgu Feb 24, 2023
e6d51cf
refactor: 부적절한 파라미터명 변경
yoondgu Feb 24, 2023
625588c
docs: 2단계 리뷰 반영 리팩터링 목록 작성
yoondgu Feb 26, 2023
7f7f712
refactor: 모호한 네이밍 수정 및 패키지 이동
yoondgu Feb 26, 2023
a8a681c
refactor: 결과 검색 키워드 클래스명 변경, 패키지 이동
yoondgu Feb 26, 2023
c86edf4
refactor: 결과 검색 키워드 검색 및 대소문자 관련 개선
yoondgu Feb 26, 2023
ad2ba08
feat: 참여자의 이름이 all, q인 경우 검증 로직 추가
yoondgu Feb 26, 2023
a1ccea3
refactor: 도메인 로직 전체에서 참여자 이름, 결과 아이템 원시값 포장 사용하도록 수정
yoondgu Feb 26, 2023
b44d896
test: 사다리 게임 예외 테스트 추가
yoondgu Feb 26, 2023
501bae1
refactor: 뷰 사다리 결과 포맷 생성 로직에서 도메인 관련 코드 제거
yoondgu Feb 26, 2023
a984495
refactor: 참여자 인덱스 조회 로직 코드 단순화
yoondgu Feb 26, 2023
0365452
refactor: index 검증 로직 부정확한 예외 메시지 수정
yoondgu Feb 26, 2023
b7a99bd
refactor: index 검증에 대한 커스텀 예외 적용
yoondgu Feb 26, 2023
37cdd56
feat: 게임 결과 조회 기능에 참여자 이름 검증 로직 추가
yoondgu Feb 26, 2023
77db916
refactor: final 키워드 적용
yoondgu Feb 26, 2023
e1c0250
refactor: 테스트 코드 빈 줄 정리
yoondgu Feb 26, 2023
916e866
docs: 문서 오타 수정
yoondgu Feb 26, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 151 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,61 +15,176 @@
- 사다리
- (높이)개의 가로 라인
- 높이는 1 이상이다.
- (폭)개의 디딤대 좌표값들
- (폭)개의 방향
- 폭은 1 이상이다.
- 폭은 (참여자 수 - 1)이다.
- 각 좌표에는 디딤대가 존재하거나, 존재하지 않는다.
- 폭은 (참여자 수)이다.
- 각 방향은 왼쪽, 오른쪽의 디딤대 좌표값을 가진다.
- 종착지
- (참여자 수) 만큼의 개수를 가진다.

### 기능 목록

#### UI 기능

- [x] 사다리 게임에 참여하는 사람의 이름을 입력받을 수 있다.
- [x] 사람 이름을 쉼표를 기준으로 구분한다.
- [x] 사다리의 높이를 입력받을 수 있다.
- [x] 사다리 게임 결과를 출력한다.
- [x] 사람 이름을 같이 출력한다.
- [x] 사다리의 크기에 맞춰 이름 간격을 조절한다.
- 입력 기능
- [x] 쉼표를 기준으로 문자열을 입력받는다.
- [x] `예외` 입력값이 null이면 예외를 던진다.
- [x] 자연수를 입력받는다.
- [x] `예외` 입력값이 정수가 아니거나 0 이하이면 예외를 던진다.
- [x] 사다리 게임에 참여하는 사람의 이름을 입력받는다.
- [x] 사람 이름을 쉼표를 기준으로 구분한다.
- [x] `예외` 사람 이름이 예약어(`all, q, ALL, Q`)와 일치하면 예외를 던진다.
- [x] 사다리의 높이를 입력받는다.
- [x] 사다리 종착지 결과를 입력받는다.
- [x] 종착지 결과를 쉼표를 기준으로 구분한다.
- [x] 결과를 보고 싶은 참여자 이름을 입력받는다.
- [x] `Q/q`를 입력할 때까지 반복해서 입력받는다.

- 출력 기능
- [x] 전달받은 참여자에 해당하는 종착지 결과를 출력한다.
- [x] `all, ALL`을 입력받으면 모든 참여자 별 종착지 결과를 출력한다.
- [x] 사다리 결과를 출력한다.
- [x] 사람 이름을 같이 출력한다.
- [x] 사다리의 크기에 맞춰 이름 간격을 조절한다.
- [x] 사다리 종착지 결과를 같이 출력한다.
- [x] 사다리의 크기에 맞춰 사다리 종착지 결과를 조절한다.

#### 도메인 기능

- 사다리 게임 참여자들
- [x] `예외` 참여자가 2명 미만이면 예외를 던진다.
- [x] `예외` 중복 이름이 존재하면 예외를 던진다.
- 사다리 게임 참여자
- [x] 이름을 가질 수 있다.
- [x] 이름은 최대 5글자이다.
- 사다리 게임 참여자들
- [x] 참여자는 1명 이하일 수 없다.
- [x] `예외` 이름이 5글자를 초과하면 예외를 던진다.
- [x] `예외` 이름이 null 또는 빈문자열이면 예외를 던진다.

- 사다리 게임
- [x] 사다리를 생성한다.
- [x] 참여자가 2명 이상이어야 생성 가능하다.
- [x] 모든 참여자에 대한 결과를 계산한다.
- [x] `예외` 사다리가 생성되지 않은 게임의 결과를 요청하면 예외를 던진다.
- 사다리
- [x] 사다리는 주어진 높이 만큼의 라인을 가진다.
- [x] 사다리의 주어진 높이는 1 이상이어야 한다.
- [x] 사다리는 참여자 수보다 1 작은 폭을 가진다.
- [x] 라인들을 가진다.
- [x] 종착지를 가진다.
- [x] 출발지에 따른 종착지 위치의 결과를 구해서 반환한다.
- [x] `예외` 결과의 개수가 참여자 수와 같지 않으면 예외를 던진다.
- 사다리 라인들
- [x] 주어진 높이만큼의 라인을 가진다.
- [x] 주어진 높이는 1 이상이어야 한다.
- [x] `예외` 높이가 1 미만이면 예외를 던진다.
- [x] 출발지 위치에 따른 종착지의 위치를 구한다.
- [x] 라인의 위치에서 받은 방향에 따라 위치를 옮기거나 옮기지 않는다.
- [x] 모든 가로 라인에서 이를 반복한다.
- 사다리 라인
- [x] 라인은 주어진 폭 만큼의 디딤대 좌표값 개수를 가진다.
- [x] 라인은 주어진 폭 만큼의 방향을 가진다.
- [x] 라인의 주어진 폭은 1 이상이어야 한다.
- [x] 주어진 개수만큼의 디딤대 좌표값을 주어진 생성방식에 따라 생성한다.
- [x] 단 디딤대는 연속될 수 없다.
- [x] `예외` 폭이 1 미만이면 예외를 던진다.
- [x] 주어진 개수만큼의 사다리 방향을 주어진 생성방식에 따라 생성한다.
- [x] `예외` 디딤대가 연속으로 존재하면 예외를 던진다.
- [x] 맨 왼쪽, 맨 오른쪽 디딤대는 무조건 존재하지 않는다.
- [x] 주어진 위치에서 이동할 방향을 반환한다.
- [x] `예외` 주어진 위치가 범위를 넘어서면 예외를 던진다.
- 사다리 방향
- [x] 사다리 방향은 왼쪽, 오른쪽 두 개의 디딤대 좌표값을 가진다.
- [x] 양쪽 디딤대 좌표값의 상태에 따라서 이동할 방향을 반환한다. (왼쪽, 오른쪽, 아래)
- [x] `예외` 양쪽 디딤대가 연속될 경우 예외를 던진다.
- [x] 각 방향은 현재 위치값을 이용해 다음 위치값을 계산해 반환한다.
- [x] 아래 방향이면 (현재 위치)
- [x] 왼쪽 방향이면 (현재 위치 - 1)
- [x] 오른쪽 방향이면 (현재위치 + 1)
- 디딤대 좌표값 랜덤 생성기
- [x] 랜덤하게 존재 유/무를 결정하되, 연속되지 않도록 생성한다.
- 디딤대 좌표값
- [x] 디딤대 좌표값은 각 위치의 디딤대 존재 유/무로 표현된다.
- [x] 같은 라인의 두 좌표값에 모두 디딤대가 존재하면, 연속된 것이다.
- 사다리 종착지
- [x] 전달받은 개수만큼의 결과를 가진다.
- [x] 전달받은 위치에 해당하는 결과를 반환한다.
- [x] `예외` 개수를 넘어서는 위치를 전달받은 경우 예외를 던진다.
- 게임 결과
- [x] 참여자 이름을 전달받아 해당 참여자에 대한 결과를 반환한다.
- [x] 모든 결과를 반환한다.
- [x] `예외` 참여자 이름에 대한 결과가 없을 경우 예외를 던진다.

### 2단계 기능 추가로 인한 설계 변경사항

실행 결과를 조회하는 기능 추가에 따라 클래스 설계를 아래와 같이 변경함.

#### 객체 포함관계 다이어그램
pjy1368 marked this conversation as resolved.
Show resolved Hide resolved

- 1단계

```mermaid
graph LR;

la(Ladder) --> li1(Line);
la --> li2(Line);
la --> li3(Line);

li1 --> s1(StepPoint)
li1 --> s2(StepPoint)
li1 --> s3(StepPoint)

s1 --> b1(EXIST);
s1 --> b2(NONE);
```

- 2단계

```mermaid
graph LR;

la(Ladder) --> ls(LadderLines)
la --> de(Destination);

de --> rs1(Result);
de --> rs2(Result);

ls --> li1(Line);
ls --> li2(Line);
ls --> li3(Line);

li1 --> d1(Direction)
li1 --> d2(Direction)
li1 --> d3(Direction)

d1 --> s1(Left StepPoint)
d1 --> s2(Right StepPoint)

s1 --> b1(EXIST/NONE);
s2 --> b2(EXIST/NONE);

ps(Players) --> p1(Player) --> n1(Name);
ps(Players) --> p2(Player)--> n2(Name);

LadderGame --> la;
LadderGame --> ps;
LadderGame -.-> gr(GameResult);

gc(LadderGameController) --> LadderGame
gc --> InputView;
gc --> OutputView;
gc --> gr;

```

#### 2단계 리뷰 반영 리팩터링 목록

### 1단계 리뷰 반영 리팩터링 목록

- [x] 구체적이고 적합한 변수, 클래스 네이밍
- [x] 클래스 설계가 도메인을 잘 표현하는지 검토
- [x] 불필요한 참조타입 변수 선언을 원시타입으로 변경
- [x] 사다리 디딤대 좌표값을 Enum 클래스로 정의
- [x] 뷰 입력값 검증 로직 유틸 클래스로 분리
- [x] 출력 로직에 하드 코딩 제거
- [x] 실행 결과 출력 기능 개선 (이름 길이에 따라 폭 조절, 이름 간 구분 처리)
- [x] 사다리 높이, 라인 폭 원시값 포장 및 검증 로직 추가
- [x] 테스트 네이밍 가독성 개선
- 특수문자 사용을 고려하여 DisplayName 사용
- 메서드명 변경 시를 고려하여 메서드명은 이름에 사용하지 않음
- should_기대결과_When_테스트상태 형식으로 작성
- [x] 테스트 예외메시지 구체화
- [x] 생성자 내 복잡한 로직 대신 정적 팩터리 메서드 사용하기
- [x] UnmodifiableList 반환 시 원본 참조 끊기
- [x] 모호한 네이밍 수정 (Result -> Item)
- [x] index 검증 로직 부정확한 예외 메시지 수정
- [x] index 검증에 대한 커스텀 예외 적용
- [x] 결과 검색 키워드 관련
- [x] 다른 변수명, 메서드명과 통일하여 클래스명 SearchType으로 변경
- [x] 컨트롤러에서만 사용되므로 패키지 이동
- [x] keyword 대소문자 구분 없이 모두 처리 가능하게 만들기
- [x] enum 클래스에서 검색유형에 해당하는 상수 확인하게 만들기
- [x] 참여자의 이름이 all, q인 경우 검증 로직 추가
- [x] 도메인 로직 전체에서 참여자 이름, 결과 아이템 원시값 포장 사용하도록 하기
- [x] 부적절한 스트림 활용 수정하기
- [x] map 생성 시 스트림만으로 처리하거나 일반 foreach 사용하기
- [x] 참여자 인덱스 조회 로직 코드 단순화
- [ ] null 검증 대신 Optional 활용해보기 => ?
- [x] 뷰 사다리 결과 포맷 생성 로직에서 도메인 관련 코드 없애기
- [x] final 키워드 적용
- [x] 테스트 코드 중복코드, 가독성 개선
- [x] 빈 줄 컨벤션 어떻게 할지 정리
20 changes: 0 additions & 20 deletions src/main/java/ladder/controller/LadderGameController.java

This file was deleted.

36 changes: 0 additions & 36 deletions src/main/java/ladder/domain/Ladder.java

This file was deleted.

26 changes: 0 additions & 26 deletions src/main/java/ladder/domain/LadderGame.java

This file was deleted.

26 changes: 0 additions & 26 deletions src/main/java/ladder/domain/LadderHeight.java

This file was deleted.

44 changes: 0 additions & 44 deletions src/main/java/ladder/domain/Line.java

This file was deleted.

27 changes: 0 additions & 27 deletions src/main/java/ladder/domain/Name.java

This file was deleted.

Loading