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단계 - 사다리 게임 실행] 히이로(문제웅) 미션 제출합니다. #210

Merged
merged 97 commits into from
Mar 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
9f9aaa1
test: Disabled 어노테이션 제거 및 관련 내용 javadoc 추가
MoonJeWoong Feb 20, 2023
397377b
refactor: Ladder 클래스 내 Line 객체 생성 시 불필요한 객체 생성 수정
MoonJeWoong Feb 20, 2023
2852a6a
test: Name 클래스 간 단순 비교 기능 삭제
MoonJeWoong Feb 20, 2023
4e5f327
refactor: Name 클래스 간 단순 비교 기능 삭제
MoonJeWoong Feb 20, 2023
771c87a
style: OutputView 클래스 가독성 개선
MoonJeWoong Feb 20, 2023
4456d2a
style: LadderTest 클래스 가독성 개선
MoonJeWoong Feb 20, 2023
6521999
refactor: LadderStep Enum 관련 기능 OutputView로 이관 처리
MoonJeWoong Feb 20, 2023
a195e3c
refactor: OutputView에 LadderStep Enum 관련 기능 이관
MoonJeWoong Feb 20, 2023
b2df98b
docs: 2단계 미션 요구사항 기능 명세 추가
MoonJeWoong Feb 20, 2023
680ed76
test: Result 객체 생성 성공 테스트 추가
MoonJeWoong Feb 20, 2023
5e296dd
feat: Result 객체 생성 기능 추가
MoonJeWoong Feb 20, 2023
6e95d95
test: 사다리 게임 결과는 최대 5글자까지 부여하는 기능 테스트 추가
MoonJeWoong Feb 20, 2023
dd2cfa4
feat: 사다리 게임 결과는 최대 5글자까지 부여하는 기능 추가
MoonJeWoong Feb 20, 2023
787d6dd
test: 단순 getter 추가를 위한 javadoc 작성
MoonJeWoong Feb 20, 2023
7f08712
feat: Result 클래스 내 데이터 출력을 위한 getter 추가
MoonJeWoong Feb 20, 2023
2362a64
test: Results 객체 생성 성공 테스트 추가
MoonJeWoong Feb 20, 2023
cf33acb
feat: Results 객체 생성 기능 추가
MoonJeWoong Feb 20, 2023
f7b040f
docs: readme 기능 명세 추가 및 수정
MoonJeWoong Feb 20, 2023
c0d2848
test: 게임 결과 값의 수와 전체 사람 수의 동일 여부 검증 기능 테스트 추가
MoonJeWoong Feb 20, 2023
2e1a575
feat: 게임 결과 값의 수와 전체 사람 수의 동일 여부 검증 기능 추가
MoonJeWoong Feb 20, 2023
aa03839
docs: readme 요구사항 기능 명세 추가
MoonJeWoong Feb 20, 2023
3f8f46e
test: 사다리 게임 결과는 쉼표를 기준으로 입력받는 기능 테스트 추가
MoonJeWoong Feb 20, 2023
8b3fe04
feat: 사다리 게임 결과는 쉼표를 기준으로 입력받는 기능 추가
MoonJeWoong Feb 20, 2023
d343d02
test: Results 일급 컬렉션 요소 값 Result 테스트 항목 추가
MoonJeWoong Feb 20, 2023
4a01626
refactor: Results 일급 컬렉션 요소 값 Result로 변경
MoonJeWoong Feb 20, 2023
2753486
test: 사다리 게임의 개인 결과를 저장하는 기능 테스트 추가
MoonJeWoong Feb 20, 2023
34be038
feat: 사다리 게임의 개인 결과를 저장하는 기능 추가
MoonJeWoong Feb 20, 2023
89289b2
test: 기존 Results 클래스를 팩토리화한 기능 테스트 코드로 수정
MoonJeWoong Feb 20, 2023
8099cfd
refactor: 기존 Results 클래스를 팩토리화
MoonJeWoong Feb 20, 2023
b8a348d
test: 기존 Names 클래스를 팩토리화한 기능 테스트 코드로 수정
MoonJeWoong Feb 20, 2023
34982f2
refactor: 기존 Names 클래스를 팩토리화
MoonJeWoong Feb 20, 2023
5651db3
refactor: Names, Results 클래스 팩토리화로 인한 수정사항 반영
MoonJeWoong Feb 20, 2023
c8ba7a2
fix: 플레이어 이름 출력 형식 불일치 문제 수정
MoonJeWoong Feb 20, 2023
d854d6e
test: LadderHeight 테스트 Disabled 어노테이션 삭제 및 javadoc 추가
MoonJeWoong Feb 21, 2023
49a089b
test: 사람 이름 간 비교 기능 테스트 추가
MoonJeWoong Feb 21, 2023
4806549
feat: 사람 이름 간 비교 기능 추가
MoonJeWoong Feb 21, 2023
0dc007e
test: 테스트 메서드 담당 기능 변경
MoonJeWoong Feb 21, 2023
c252c98
feat: 참여자의 이름정보가 일치하는지 확인할 수 있는 기능 추가
MoonJeWoong Feb 21, 2023
418fcd6
test: 참여자의 이름을 검색하여 해당 참여자의 정보를 반환하는 기능 테스트 추가
MoonJeWoong Feb 21, 2023
06a8af4
feat: 참여자의 이름을 검색하여 해당 참여자의 정보를 반환하는 기능 추가
MoonJeWoong Feb 21, 2023
023b401
test: 존재하지 않는 이름을 검색한 경우 예외 처리 기능 테스트 추가
MoonJeWoong Feb 21, 2023
ede4a91
feat: 존재하지 않는 이름을 검색한 경우 예외 처리하는 기능 추가
MoonJeWoong Feb 21, 2023
de039eb
docs: 사다리 게임 진행을 위한 기능 명세 추가
MoonJeWoong Feb 21, 2023
03e11d0
test: Position 객체 생성 성공 테스트 추가
MoonJeWoong Feb 21, 2023
58db252
feat: Position 객체 생성 기능 추가
MoonJeWoong Feb 21, 2023
3f8c8b5
test: 주어진 위치 값과의 동일 여부를 알 수 있는 기능 테스트 추가
MoonJeWoong Feb 21, 2023
fdaf028
feat: 주어진 위치 값과의 동일 여부를 알 수 있는 기능 추가
MoonJeWoong Feb 21, 2023
36a096b
test: 참여자의 현재 위치와 주어진 위치 값의 동일 여부 확인 기능 테스트 추가
MoonJeWoong Feb 21, 2023
08736c9
feat: 참여자의 현재 위치와 주어진 위치 값의 동일 여부 확인 기능 추가
MoonJeWoong Feb 21, 2023
a6dc347
test: 참여자 간 위치를 변경하는 기능 테스트 추가
MoonJeWoong Feb 21, 2023
6836a49
feat: 참여자 간 위치를 변경하는 기능 추가
MoonJeWoong Feb 21, 2023
bc6f4de
docs: 기존 구현 기능 및 명세 수정
MoonJeWoong Feb 22, 2023
67e9b0c
test: 기존 기능 변경으로 인한 테스트 코드 삭제 및 추가
MoonJeWoong Feb 22, 2023
e11bf9b
feat: 사다리 라인에 따라 참여자 현재 위치를 바꾸는 기능 추가
MoonJeWoong Feb 22, 2023
7c834ec
test: 사다리 타기가 완료된 참여자의 위치에 맞는 결과 저장 기능 테스트 추가
MoonJeWoong Feb 22, 2023
655713b
feat: 사다리 타기가 완료된 참여자의 위치에 맞는 결과 저장 기능 추가
MoonJeWoong Feb 22, 2023
41bf61c
test: 참여자 이름을 검색하여 최종 결과 반환 기능 테스트 추가
MoonJeWoong Feb 22, 2023
03f69f0
test: 존재하지 않는 이름을 검색한 경우 예외 처리 기능 테스트
MoonJeWoong Feb 22, 2023
efd60e8
docs: 참여자 이름 중복 여부 검사 기능 명세 추가
MoonJeWoong Feb 22, 2023
c658104
test: 참여자 이름 중복 여부 검사 기능 테스트 코드 추가
MoonJeWoong Feb 22, 2023
47640f9
feat: 참여자 이름 중복 여부 검사 기능 추가
MoonJeWoong Feb 22, 2023
8a8070c
test: 도메인 객체 상태 값 반환 타입을 Wrapper Type으로 수정
MoonJeWoong Feb 22, 2023
4499a59
refactor: 도메인 객체 속성 값 반환 타입 wrapping 타입으로 변경
MoonJeWoong Feb 22, 2023
5ab617c
feat: view에 wrapping 타입 unwrap 기능 추가
MoonJeWoong Feb 22, 2023
5e459a3
feat: controller에 실행결과 입력 기능 추가
MoonJeWoong Feb 22, 2023
1080d1f
feat: 사다리 게임 실행 결과를 입력 받는 기능
MoonJeWoong Feb 22, 2023
aa4b485
feat: controller에 사다리 게임 실행 결과를 출력하는 기능 추가
MoonJeWoong Feb 22, 2023
6934ba3
feat: 사다리 게임 실행 결과 출력 기능 추가
MoonJeWoong Feb 22, 2023
ee0899f
feat: 컨트롤러에 사다리 게임 진행을 완료하는 기능 추가
MoonJeWoong Feb 22, 2023
7ed9a95
docs: 사다리 게임 결과를 각 참여자에게 저장하는 기능 명세 추가
MoonJeWoong Feb 23, 2023
1555ae8
feat: controller에 사다리 게임 결과를 각 참여자에게 저장하는 기능 추가
MoonJeWoong Feb 23, 2023
241138c
feat: controller에 결과를 보고 싶은 사람을 입력받는 기능 추가
MoonJeWoong Feb 23, 2023
0c862f4
feat: 결과를 보고 싶은 사람을 입력받는 기능 추가
MoonJeWoong Feb 23, 2023
74485f3
feat: controller에 참가자 개인 결과를 출력하는 기능 추가
MoonJeWoong Feb 23, 2023
1bff394
feat: 참가자 개인 결과를 출력하는 기능 추가
MoonJeWoong Feb 23, 2023
f6ebaab
feat: controller에 모든 참가자의 결과를 출력하고 프로그램 종료 기능 추가
MoonJeWoong Feb 23, 2023
2ccad6d
feat: 모든 참가자의 결과를 출력하고 프로그램 종료 기능 추가
MoonJeWoong Feb 23, 2023
7095a6f
fix: 사다리 높이 입력 이후 개행문자 삭제를 위한 버퍼 초기화 기능 추가
MoonJeWoong Feb 23, 2023
cc27996
feat: controller에 사다리 생성 결과 메세지 출력 기능 추가
MoonJeWoong Feb 23, 2023
e524eda
feat: 사다리 생성 결과 메세지 출력 기능 추가
MoonJeWoong Feb 23, 2023
51099a6
test: 테스트 메서드 명에 누락된 Test 추가
MoonJeWoong Feb 23, 2023
b155bb0
style: 프로젝트 패키지 구조 변경 및 코드 스타일 개선
MoonJeWoong Feb 23, 2023
03130e4
refactor: controller에서 참가자 개인의 결과를 반복 출력하는 기능 분리
MoonJeWoong Feb 23, 2023
8a67ae7
test: LadderTest 메서드 공통 부분 BeforeEach로 분리
MoonJeWoong Feb 23, 2023
3f159ad
test: 단순 반복 작업 리팩토링 및 Disabled 메서드 주석화
MoonJeWoong Feb 23, 2023
1c4a766
docs: view 관련 누락된 체크리스트 완료 표시
MoonJeWoong Feb 23, 2023
6f316db
refactor: 기존 factory 클래스의 역할을 view에게 위임
MoonJeWoong Feb 25, 2023
7bfe376
style: 컨벤션에 따른 패키지 명 변경
MoonJeWoong Feb 25, 2023
48ffde4
refactor: vo 객체 내부 getter 메서드 명 수정
MoonJeWoong Feb 25, 2023
ca5cd24
refactor: Position 객체 내부 매서드 명 수정
MoonJeWoong Feb 25, 2023
0968649
refactor: NPE 방어를 위한 Player 내 속성 값 비교 메서드 수정
MoonJeWoong Feb 25, 2023
faa401b
refactor: players 내 속성 값 비교 메서드 수정
MoonJeWoong Feb 25, 2023
4e860fd
test: 기존 factory 클래스 삭제로 인한 테스트 코드 수정
MoonJeWoong Feb 25, 2023
902d698
test: 사용하지 않는 테스트 코드 내용 삭제
MoonJeWoong Feb 25, 2023
a8d0972
mini mission: 리스트 미션 구현 완료
MoonJeWoong Mar 9, 2023
e6a874c
feat: Name 객체간 논리적 동치성 보장을 위한 equals & hashCode 구현
MoonJeWoong Mar 9, 2023
d899bef
refactor: 기존 controller 게임 실행 로직 LadderGame 클래스로 분리
MoonJeWoong Mar 9, 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
47 changes: 35 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,16 @@

## controller
- [x] 사다리 게임에 참여할 사람 이름을 입력받는다.
- [x] 사다리게임 실행 결과를 입력받는다.
- [x] 최대 사다리 높이를 입력받는다.
- [x] 전체 플레이어 이름을 출력한다.
- [x] 사다리 생성 결과를 출력한다.
- [x] 사다리 게임 실행 결과를 출력한다.
- [x] 사다리 게임 진행을 완료한다.
- [x] 사다리 게임 결과를 각 참여자에게 저장한다.
- [x] 결과를 보고 싶은 사람을 입력받는다.
- [x] 참가자 개인의 결과를 출력한다.
- [x] 모든 참가자의 결과를 출력하고 프로그램을 종료한다.

## model
- [x] 사다리 높이에 맞게 라인을 생성한다.
Expand All @@ -32,44 +39,60 @@

- [x] 사다리 게임 전체 참여자 정보를 생성한다.
- [x] 사다리 게임 전체 참여자 명단을 반환한다.
- [x] 사다리 라인에 따라 참여자 현재 위치를 바꾼다.
- [x] 사다리 타기가 완료된 참여자의 위치에 맞는 결과를 저장한다.
- [x] 참여자의 이름을 검색하여 해당 참여자의 최종 결과를 반환한다.
- [x] 존재하지 않는 이름을 검색한 경우 예외 처리한다.


- [x] 사다리 게임 참여자 정보를 저장한다.
- [x] 참여자의 이름 정보를 조회할 수 있다.
- [x] 참여자의 이름 정보가 일치하는지 확인할 수 있다.
- [x] 참여자의 개인 결과를 저장한다.
- [x] 참여자의 현재 위치와 주어진 위치 값의 동일 여부를 알 수 있다.
- [x] 참여자 간 위치를 변경한다.

- [x] 사람 이름은 최대 5글자까지 부여할 수 있다.
- [x] 사람 이름은 문자로만 이루어져야 한다.
- [x] 사람 이름 간 비교가 가능해야 한다.

- [x] 사다리 게임 전체 결과를 관리한다.
- [x] 사다리 게임 결과 값의 수는 전체 사람 수와 동일해야 한다.
- [x] 사다리 게임 결과는 쉼표를 기준으로 입력받는다.

- [x] 사다리 게임 결과는 최대 5글자까지 부여할 수 있다.

- [x] 참여자 이름은 쉼표를 기준으로 입력받는다.
- [x] 참여자 이름 중복 여부를 검사한다.

- [x] 사다리 길이는 1이상의 자연수만 가능하다.

- [x] 사다리 발판 모양을 생성한다.
- [x] 게임 참여자의 위치는 정수로 표현한다.
- [x] 주어진 위치 값과의 동일 여부를 알 수 있다.


## view
### 입력
- [x] 게임 참여자 이름을 입력할 수 있다.
- [x] 최대 사다리 높이를 입력받는다.
- [x] 게임 결과를 입력할 수 있다.


### 출력
- [x] 사다리의 폭은 입력될 수 있는 사람 이름의 최대 길이로 고정한다. (상수화)
- [x] 출력 메세지
- [x] 참여할 사람 이름 입력 메세지
- [x] 최대 사다리 높이 입력 메세지
- [x] 실행 결과 입력 메세지
- [x] 사다리 결과 메세지
- [x] 결과 출력 대상 입력 메세지
- [x] 실행 결과 확인 메세지
- [x] 실행 결과 출력
- [x] 전체 플레이어 이름 출력
- [x] 사다리 출력
- [x] 사다리 발판 유/무에 따른 모양을 생성한다.
- [x] 게임 결과 출력
- [x] 단일 플레이어 결과 출력
- [x] 모든 플레이어 결과 출력


## Todo
- 매개변수 final화 하기
- (출력값을 위한 Enum 사용 고려?)
- (true, 사다리 있는 칸 출력값)
- (false, 사다리 없는 칸 출력값)
- 같은 클래스의 일급 컬렉션 비교 기능 추가하기
- toString 추가
- makeAllPlayerTest 테스트 결과 출력 부분
- 테스트 케이스 추가
- 혹은 parameterizedTest 어노테이션 삭제
- 플레이어 이름 제한 길이에 따른 step 길이 변화 기능 추가하기
3 changes: 1 addition & 2 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
import java.util.Scanner;

public class Application {

public static void main(String[] args) {
LadderGameController ladderGameController = new LadderGameController( new InputView(new Scanner(System.in)),new OutputView());
LadderGameController ladderGameController = new LadderGameController(new InputView(new Scanner(System.in)), new OutputView());
ladderGameController.run();
}
}
53 changes: 48 additions & 5 deletions src/main/java/controller/LadderGameController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package controller;

import model.Ladder;
import model.LadderHeight;
import model.Names;
import model.Players;
import model.domain.Ladder;
import model.domain.LadderGame;
import model.vo.LadderHeight;
import model.vo.Name;
import model.domain.Players;
import model.vo.Result;
import view.InputView;
import view.OutputView;

import java.util.List;

public class LadderGameController {
public InputView inputView;
public OutputView outputView;
Expand All @@ -18,12 +22,51 @@ public LadderGameController(InputView inputView, OutputView outputView) {

public void run() {
Players players = new Players(setPlayerNames());
List<Result> results = setResults(players.size());
Ladder ladder = new Ladder(players, setLadderHeight());
showCreateLadderResult(players, results, ladder);
LadderGame ladderGame = new LadderGame(players, ladder, results);
showGameResult(ladderGame.getPlayersAfterPlay());
}

private void showCreateLadderResult(Players players, List<Result> results, Ladder ladder) {
outputView.printMakeLadderResultMessage();
outputView.printAllPlayerNames(players.getAllPlayerNames());
outputView.printLadder(ladder);
outputView.printAllResults(results);
}

private void showGameResult(Players players) {
Name name = getDesirousResultName();
repeatShowResultUntilInputAll(players, name);
showAllResults(players);
}

private void repeatShowResultUntilInputAll(Players players, Name name) {
Name all = new Name("all");
while (!name.isSame(all)) {
outputView.printResultHeaderMessage();
outputView.printResult(players.getResultOf(name));
name = getDesirousResultName();
}
}

private void showAllResults(Players players) {
outputView.printResultHeaderMessage();
players.getAllPlayerNames().forEach(name -> outputView.printNameAndResult(name, players.getResultOf(name)));
}

private Name getDesirousResultName() {
outputView.printDesirousResultNameMessage();
return inputView.readDesirousResultName();
}

private List<Result> setResults(int playerCount) {
outputView.printResultsMessage();
return inputView.readResults(playerCount);
}

private Names setPlayerNames() {
private List<Name> setPlayerNames() {
outputView.printPlayerNamesMessage();
return inputView.readPlayerNames();
}
Expand Down
18 changes: 0 additions & 18 deletions src/main/java/model/LadderStep.java

This file was deleted.

36 changes: 0 additions & 36 deletions src/main/java/model/Names.java

This file was deleted.

13 changes: 0 additions & 13 deletions src/main/java/model/Player.java

This file was deleted.

26 changes: 0 additions & 26 deletions src/main/java/model/Players.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package model;
package model.domain;

import model.vo.LadderHeight;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -20,6 +22,7 @@ public int getHeight() {
}

private void makeLadderLines(int playersSize, int height) {
IntStream.range(0, height).forEach(index -> lines.add(new Line(new RandomPointGenerator(), playersSize)));
PointGenerator pointGenerator = new RandomPointGenerator();
IntStream.range(0, height).forEach(index -> lines.add(new Line(pointGenerator, playersSize)));
}
}
33 changes: 33 additions & 0 deletions src/main/java/model/domain/LadderGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package model.domain;

import model.vo.Result;

import java.util.List;
import java.util.stream.IntStream;

public class LadderGame {
private Players players;
private Ladder ladder;
private List<Result> results;

public LadderGame(Players players, Ladder ladder, List<Result> results) {
this.players = players;
this.ladder = ladder;
this.results = results;
}

public Players getPlayersAfterPlay() {
play();
return players;
}

private void play() {
IntStream.range(0, ladder.getHeight())
.forEach(index -> playOneLine(players, ladder.getLine(index)));
players.saveAllResults(results);
}

private void playOneLine(Players players, Line line) {
players.moveAllPlayersByLinePoints(line.getPoints());
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package model;
package model.domain;

import java.util.ArrayList;
import java.util.List;
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/model/domain/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package model.domain;

import model.vo.Name;
import model.vo.Position;
import model.vo.Result;

public class Player {
private final Name name;
private Result result;
private Position position;
Comment on lines +7 to +10
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PlayerResult의 책임을 가지고 있는 것이 맞을까요 ?
처음 결과가 주어지기 전 result가 비어있는 '데이터 무결성이 깨지는 상태'가 너무 오래 지속되지 않을까 해요.
Player와 Result의 매핑정보를 알고 있는 것은 어떤 객체가 되면 좋을지 한번 고민해봅시다 😊

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Players에게 과도한 책임이 부여되는 문제가 발생하면서 같이 생긴 문제라고 생각합니다. 여기도 Player가 Players 외부에 반환되어 게임 진행 이후에 result 객체와 맵핑할 수 있는 객체를 설계한다면 해결할 수 있는 부분이라고 생각됩니다. 해당 부분은 Players에 달아주신 코멘트에 대한 답변을 듣고 수정해보고 싶어 일단은 그대로 두었습니다!


public Player(final Name name, final Position position) {
this.name = name;
this.position = position;
}

public Name getName() {
return name;
}

public Result getResult() {
return result;
}

public void saveResult(final Result result) {
this.result = result;
}

public boolean isSameName(Name other) {
return this.name.isSame(other);
}

public boolean isSamePosition(Position other) {
return this.position.isSame(other);
}

public void changePositionWith(Player otherPlayer) {
Position temporaryPosition = otherPlayer.position;
otherPlayer.position = this.position;
this.position = temporaryPosition;
}
}
Loading