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단계 - 사다리 생성] 제이미(임정수) 미션 제출합니다. #201

Merged
merged 42 commits into from
Feb 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0faa657
docs: 요구사항 및 기능 목록 추가
JJ503 Feb 22, 2023
c337052
feat: 결과 기능 추가
JJ503 Feb 22, 2023
f417b0d
feat: 결과들 기능 추가
JJ503 Feb 22, 2023
00aac30
feat: 사다리 게임 전체 결과 인덱스 가져오기 기능 추가
JJ503 Feb 22, 2023
acfe36e
rename: 파일명 오타로 인한 수정
JJ503 Feb 22, 2023
82f126d
feat: 사다리 게임의 결과 판단 기능 추가
JJ503 Feb 22, 2023
da00181
feat: 요청 값에 따른 결과 반환 기능 추가
JJ503 Feb 22, 2023
1f79bc4
fix: 출력 포맷 수정
JJ503 Feb 22, 2023
1043538
feat: 결과 입력 및 출력 기능 추가
JJ503 Feb 22, 2023
85d183c
refactor: GameMap 제거 및 Ladder로 기능 전달
JJ503 Feb 22, 2023
1b76f30
refactor: 메서드 명으로 변경
JJ503 Feb 22, 2023
90bd727
refactor: 사용하지 않는 패키지 제거
JJ503 Feb 22, 2023
6df7c53
refactor: 메서드 및 변수명 변경
JJ503 Feb 22, 2023
5203156
feat: 보고 싶은 사람 입력 기능 추가
JJ503 Feb 23, 2023
c94305b
feat: 보고 싶은 사람의 실행 결과 출력 기능 추가
JJ503 Feb 23, 2023
de78b60
refactor: 사용하지 않는 패키지 제거
JJ503 Feb 23, 2023
0d3c367
fix: 기능 추가에 따른 입출력 수정
JJ503 Feb 23, 2023
1107fff
refactor: private 생성자 추가
JJ503 Feb 23, 2023
3d21b32
refactor: outputview에서 domain을 파라미터로 받지 않도록 수정
JJ503 Feb 23, 2023
93a8476
refactor: 게임 결과 도메인 명 변경
JJ503 Feb 23, 2023
765f14c
feat: 게임을 실행하는 도메인 추가
JJ503 Feb 23, 2023
c0be9a4
refactor: 이름과 결과 입력 시 양옆의 공백 허용
JJ503 Feb 23, 2023
f1ddbef
refactor: 컨벤션 적용
JJ503 Feb 23, 2023
7148ab8
rename: ErrorMessage 경로 수정
JJ503 Feb 23, 2023
cf546ca
docs: 요구사항 완료 체크
JJ503 Feb 23, 2023
cf0409e
fix: 로직 문제에 대한 수정
JJ503 Feb 24, 2023
a6065ca
refactor: 라인 상태에 대한 객체 추가
JJ503 Feb 26, 2023
2eb1d2a
rename: view 내부 패키지 제거
JJ503 Feb 26, 2023
1a15d38
refactor: 파라미터 변수명 수정
JJ503 Feb 26, 2023
3cf3a5b
refactor: 컨트롤러의 생성자 추가
JJ503 Feb 27, 2023
615707c
refactor: 예외 메시지 출력 기능 outputView로 이동
JJ503 Feb 27, 2023
4ba26ca
refactor: 재입력 인터페이스 생성 및 적용
JJ503 Feb 27, 2023
90eb49c
refactor: 사용하지 않는 메서드 제거
JJ503 Feb 27, 2023
81551b1
refactor: 변수명을 명확하게 수정
JJ503 Feb 27, 2023
313e459
refactor: 객체 비교 기능 추가
JJ503 Feb 27, 2023
facbee6
feat: TestGenerator 추가
JJ503 Feb 27, 2023
4caaff5
docs: 네이밍 관련 수정
JJ503 Feb 27, 2023
32cf4e8
docs: 완료 기능 체크
JJ503 Feb 27, 2023
0815728
rename: readme 파일 합침
JJ503 Feb 27, 2023
5281476
fix: 잘못된 조건 수정
JJ503 Feb 27, 2023
0a4a092
refator: 사용하지 않는 패키지 제거
JJ503 Feb 27, 2023
6a8768f
feat: List 미션 수행
JJ503 Feb 27, 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
124 changes: 124 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,127 @@
## 우아한테크코스 코드리뷰

- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md)


---
## 📚 도메인 모델 네이밍 사전

| 한글명 | 영문명 | 설명 |
|-----|--------------|----------------------|
| 참가자 | Participants | 사다리 게임에 참가하는 사람들을 지칭 |
| 사람 | Person | 사람을 지칭 |
| 사다리 | Ladder | 사다리 지칭 |
| 라인 | Line | 사다리의 한줄을 지칭 |
| 결과 | Result | 실행 결과를 지칭 |

<br>

## 👨‍🍳 기능 목록

- 참가자
- [x] 사람은 10명까지 ( 테스트 원할한 범위 )
- [x] 사람은 2명 이상이다.
- [x] 사람이름은 ',' 로 구분한다.
- [x] 중복된 이름을 가질 수 없다.


- 사람
- [x] 이름은 최대 5글자까지 가능하다
- [x] 이름은 빈문자 혹은 공백으로만 이루어지면 안 된다


- 사다리 게임
- [x] 사다리를 생성한다.
- [x] 사다리 게임의 결과를 판단한다.
- [x] 보고싶은 사람의 사다리 게임의 결과를 전달한다.


- 사다리
- [x] 사다리의 높이는 숫자여야 한다.
- [x] 사다리의 최소 높이는 1이다.
- [x] 사다리의 최대 높이는 10이다. ( 테스트 원할한 범위 )
- [x] 사다리는 높이만큼의 라인을 가진다.
- [x] 사다리의 라인은 1이상 9이하의 갯수의 상태를 갖는다. (참가자수에서 1을 뺀 값)


- 라인
- [x] 라인은 1이상 9이하의 갯수의 상태를 갖는다.
- [x] 상태는 두 가지 경우를 가진다 (연결 혹은 비연결)
- [x] true, false 중 랜덤한 boolean을 생성한다.
- [x] 연속으로 연결상태를 가질 수 없다.


- 참가자
- [x] 사람은 10명까지 ( 테스트 원할한 범위 )
- [x] 사람은 2명 이상이다.
- [x] 사람이름은 ',' 로 구분한다.
- [x] 중복된 이름을 가질 수 없다.


- 결과들
- [x] 결과는 사람 수 만큼이다.
- [x] 결과는은 ',' 로 구분한다.크
- [x] all을 받은 경우 전체 결과를 반환한다.
- [x] 사람 이름을 받은 경우 해당 사람의 결과를 반환한다.


- 결과
- [x] 사다리의 결과는 최대 5글자까지 가능하다
- [x] 결과는 빈문자 혹은 공백으로만 이루어지면 안 된다


- 출력
- [x] 사람 이름은 5자 기준으로 출력하기에 폭도 이에 맞춘다.
- [x] 보고 싶은 사람의 실행 결과를 출력한다.


- 입력
- [x] 참여자 이름을 입력한다.
- [x] 최대 사다리 높이를 입력한다.
- [x] 실행 결과를 입력한다.
- [x] 결과를 보고 싶은 사람의 이름을 입력한다.

## 요구 사항

- [x] 사다리 게임에 참여하는 사람에 이름을 최대5글자까지 부여할 수 있다.
- [x] 사다리를 출력할 때 사람 이름도 같이 출력한다.
- [x] 사람 이름은 쉼표(,)를 기준으로 구분한다.
- [x] 사람 이름을 5자 기준으로 출력하기 때문에 사다리 폭도 넓어져야 한다.
- [x] 사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다.
- [x] |-----|-----| 모양과 같이 가로 라인이 겹치는 경우 어느 방향으로 이동할지 결정할 수 없다.
<br>
- [x] 실행 결과를 쉼표(,)를 기준으로 구분한다.
- [x] 사다리 결과 출력 시 결과도 함께 출력한다.
- [x] 결과를 보고 싶은 사람 이름을 입력한다. (all 입력 시 전체 결과 출력)
- [x] all이 아닐 경우 결과 보고 싶은 사람 이름을 다시 물어야 한다.

## 📌 Commit Convention

커밋 메시지는 다음과 같은 형태로 작성합니다.

```Bash
> "커밋의 타입: 커밋 메세지 내용"
ex) "docs: 기능 목록 추가"
```

커밋의 타입은 아래 10가지 중 가장 적절한 것을 선택해 작성합니다.

| 커밋의 타입 | 설명 |
| :---------: | :-----------------------------------------------: |
| feat | 새로운 기능 추가 |
| fix | 버그 수정 |
| comment | 필요한 주석 추가 및 변경 |
| test | 테스트 코드 추가 |
| docs | 문서를 추가 혹은 수정 (ex. README 수정) |
| rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업 |
| remove | 파일을 삭제하는 작업만 수행 |
| chore | 빌드 태스크 업데이트, 패키지 매니저를 설정 |
| refactor | 코드 리팩토링 |
| style | 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 |

<br>

## 📌 Code Convention

- 구글 Java 코딩 컨벤션을 준수합니다.
- IntelliJ의 Formatter를 적용합니다.
93 changes: 0 additions & 93 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,93 +0,0 @@
# java-racingcar

<br>

## 📚 도메인 모델 네이밍 사전

| 한글명 | 영문명 | 설명 |
|-------|--------------|---------------------|
| 참가자 | Participants | 사다리 게임에 참가하는 사람들을 지칭 |
| 사람 | Person | 사람을 지칭 |
| 맵 | Map | 맵 정보 지칭 |
| 사다리 | Ladder | 사다리 지칭 |
| 라인 | Line | 사다리의 한줄을 지칭 |

<br>

## 👨‍🍳 기능 목록

- 참가자
- [x] 사람은 10명까지 ( 테스트 원할한 범위 )
- [x] 사람은 2명 이상이다.
- [x] 사람이름은 ',' 로 구분한다.
- [x] 중복된 이름을 가질 수 없다.


- 사람
- [x] 이름은 최대 5글자까지 가능하다
- [x] 이름은 빈문자 혹은 공백으로만 이루어지면 안 된다


- 맵 (사다리)
- [x] 사다리의 높이는 숫자여야 한다.
- [x] 사다리의 최소 높이는 1이다.
- [x] 사다리의 최대 높이는 10이다. ( 테스트 원할한 범위 )
- [x] 사다리는 높이만큼의 라인을 가진다.
- [x] 사다리의 라인은 1이상 9이하의 갯수의 상태를 갖는다. (참가자수에서 1을 뺀 값)


- 라인
- [x] 라인은 1이상 9이하의 갯수의 상태를 갖는다.
- [x] 상태는 두 가지 경우를 가진다 (연결 혹은 비연결)
- [x] true, false 중 랜덤한 boolean을 생성한다.
- [x] 연속으로 연결상태를 가질 수 없다.


- 출력
- [x] 사람 이름은 5자 기준으로 출력하기에 폭도 이에 맞춘다.


- 입력
- [x] 참여자 이름을 입력한다.
- [x] 최대 사다리 높이를 입력한다.

## 요구 사항

- [x] 사다리 게임에 참여하는 사람에 이름을 최대5글자까지 부여할 수 있다.
- [x] 사다리를 출력할 때 사람 이름도 같이 출력한다.
- [x] 사람 이름은 쉼표(,)를 기준으로 구분한다.
- [x] 사람 이름을 5자 기준으로 출력하기 때문에 사다리 폭도 넓어져야 한다.
- [x] 사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다.
- [x] |-----|-----| 모양과 같이 가로 라인이 겹치는 경우 어느 방향으로 이동할지 결정할 수 없다.
<br>

## 📌 Commit Convention

커밋 메시지는 다음과 같은 형태로 작성합니다.

```Bash
> "커밋의 타입: 커밋 메세지 내용"
ex) "docs: 기능 목록 추가"
```

커밋의 타입은 아래 10가지 중 가장 적절한 것을 선택해 작성합니다.

| 커밋의 타입 | 설명 |
| :---------: | :-----------------------------------------------: |
| feat | 새로운 기능 추가 |
| fix | 버그 수정 |
| comment | 필요한 주석 추가 및 변경 |
| test | 테스트 코드 추가 |
| docs | 문서를 추가 혹은 수정 (ex. README 수정) |
| rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업 |
| remove | 파일을 삭제하는 작업만 수행 |
| chore | 빌드 태스크 업데이트, 패키지 매니저를 설정 |
| refactor | 코드 리팩토링 |
| style | 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 |

<br>

## 📌 Code Convention

- 구글 Java 코딩 컨벤션을 준수합니다.
- IntelliJ의 Formatter를 적용합니다.
16 changes: 10 additions & 6 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import controller.RadderGameController;
import controller.LadderGameController;
import util.RandomBooleanGenerator;
import view.input.InputView;
import view.output.OutputView;
import view.InputView;
import view.OutputView;

import java.util.Scanner;

public class Application {

public static void main(String[] args) {
InputView inputView = new InputView();
InputView inputView = new InputView(new Scanner(System.in));
OutputView outputView = new OutputView();
RandomBooleanGenerator randomBooleanGenerator = new RandomBooleanGenerator();
RadderGameController radderGameController = new RadderGameController();
radderGameController.play(inputView, outputView, randomBooleanGenerator);

LadderGameController ladderGameController =
new LadderGameController(inputView, outputView, randomBooleanGenerator);

Choose a reason for hiding this comment

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

BooleanGenerator를 Application에서부터 주입시켜 주는 것이 좋은가

사실 이 말을 듣고 많은 생각이 떠올랐는데요. 역할부터 시작해서 많은 의문이 들긴했습니다ㅎㅎ

  • BooleanGenerator를 주입시킨다는 생각을 하기 전에, 애초에 BooleanGenerator의 역할은 무엇일까요?
  • Boolean value를 만드는 거 아닐까요?
  • RandomBooleanGenerator는 랜덤한 Boolean Value를 만드는 역할인데 왜 인터페이스를 구현해줬어야할까요?
  • 단순히 랜덤한 Boolean Value를 만드는 역할이라면 어떤 인터페이스를 구현하는 클래스이기보단 어디서든 사용할 수 있는 유틸 클래스가 더 맞지 않을까요?
  • 유틸 클래스라면 따로 생성자로 주입해주지 않고도 어디서든 사용가능하지 않을까요?
  • 현재 단순히 테스트의 용이함을 위해서 BooleanGenerator 인터페이스를 구현한 건 아닐까요?

라는 생각이 들었네요ㅎㅎ 다시 돌아와서,

그런데, 사용은 Ladder 생성 시에만 사용되는 것을 확인할 수 있습니다.
컨트롤러 테스트를 위해 BooleanGenerator를 컨트롤러에서부터 주입을 시켰는데 괜찮은지 빙봉의 의견이 궁금합니다.

라는 물음에 답해본다면 BooleanGenerator의 역할을 먼저 생각해볼 필요가 있으며, 인터페이스를 그대로 사용하고자 한다면 BooleanGenerator는 어디에 있어야하는 게 맞을지 고민해보면 좋을 것 같습니다. (본질적으론 아마 이걸 물어보신 거겠죠?)

현재는 Controller 안에 있는데요. BooleanGenerator가 gernerate()하는 곳을 살펴보면 Line 클래스 안 뿐입니다. 결론적으로 Line의 상태를 생성한다고 볼 수 있으므로 LineFactory이란 클래스를 따로 생성하고 이 안에 BooleanGenerator가 있어야된다고 생각이 드네요. (LineFactory를 생성할 때 new RandomBooleanGenerator() 주입하는 형태, Model과 View를 연결짓는 Controller 역할과는 상관없으며 Ladder 도메인과도 연관이 없음)

ladderGameController.play();
}
}
89 changes: 89 additions & 0 deletions src/main/java/controller/LadderGameController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package controller;

import domain.*;
import util.BooleanGenerator;
import util.Task;
import view.InputView;
import view.OutputView;

public class LadderGameController {

private static final String RESULT_ALL = "all";

private final InputView inputView;
private final OutputView outputView;
private final BooleanGenerator booleanGenerator;

public LadderGameController(InputView inputView, OutputView outputView,
BooleanGenerator booleanGenerator) {
this.inputView = inputView;
this.outputView = outputView;
this.booleanGenerator = booleanGenerator;
}

public void play() {
Participants participants = setParticipants();
Results results = setResults(participants);
Ladder ladder = generateLadder(participants, booleanGenerator);

LadderGame ladderGame = new LadderGame(participants, results, ladder);
printLadder(ladderGame);

printResult(ladderGame);
}

private Participants setParticipants() {
return Task.retryUntilSuccess(() -> {
String participantNames = inputView.enterParticipantNames();
return new Participants(participantNames);
}, outputView);
}

private Results setResults(Participants participants) {
return Task.retryUntilSuccess(() -> {
String results = inputView.enterResults();
return new Results(results, participants.getParticipantCount());
}, outputView);
}

private Ladder generateLadder(Participants participants, BooleanGenerator booleanGenerator) {
return Task.retryUntilSuccess(() -> {
Height height = new Height(inputView.enterHeight());
Weight weight = new Weight(participants.getParticipantCount());
return new Ladder(height, weight, booleanGenerator);
}, outputView);
}

private void printLadder(LadderGame ladderGame) {
outputView.printLadder(ladderGame.getParticipants(), ladderGame.getLadder(),
ladderGame.getResults());
}

private void printResult(LadderGame ladderGame) {
boolean isContinue = true;
while (isContinue) {
isContinue = getResult(ladderGame);
}
}

private boolean getResult(LadderGame ladderGame) {
try {
String inputResult = inputView.enterGetResult();
return getResultByInput(ladderGame, inputResult);
} catch (IllegalArgumentException exception) {
outputView.printErrorMessage(exception);
return true;
}
}

private boolean getResultByInput(LadderGame ladderGame, String inputValue) {
if (RESULT_ALL.equals(inputValue)) {
outputView.printMatchAllResult(ladderGame.getGameAllResult(),
ladderGame.getParticipants());
return false;
}

outputView.printMatchResult(ladderGame.getGameResultByName(inputValue));
return true;
}
}
43 changes: 0 additions & 43 deletions src/main/java/controller/RadderGameController.java

This file was deleted.

Loading