-
Notifications
You must be signed in to change notification settings - Fork 252
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
Changes from all commits
Commits
Show all changes
42 commits
Select commit
Hold shift + click to select a range
0faa657
docs: 요구사항 및 기능 목록 추가
JJ503 c337052
feat: 결과 기능 추가
JJ503 f417b0d
feat: 결과들 기능 추가
JJ503 00aac30
feat: 사다리 게임 전체 결과 인덱스 가져오기 기능 추가
JJ503 acfe36e
rename: 파일명 오타로 인한 수정
JJ503 82f126d
feat: 사다리 게임의 결과 판단 기능 추가
JJ503 da00181
feat: 요청 값에 따른 결과 반환 기능 추가
JJ503 1f79bc4
fix: 출력 포맷 수정
JJ503 1043538
feat: 결과 입력 및 출력 기능 추가
JJ503 85d183c
refactor: GameMap 제거 및 Ladder로 기능 전달
JJ503 1b76f30
refactor: 메서드 명으로 변경
JJ503 90bd727
refactor: 사용하지 않는 패키지 제거
JJ503 6df7c53
refactor: 메서드 및 변수명 변경
JJ503 5203156
feat: 보고 싶은 사람 입력 기능 추가
JJ503 c94305b
feat: 보고 싶은 사람의 실행 결과 출력 기능 추가
JJ503 de78b60
refactor: 사용하지 않는 패키지 제거
JJ503 0d3c367
fix: 기능 추가에 따른 입출력 수정
JJ503 1107fff
refactor: private 생성자 추가
JJ503 3d21b32
refactor: outputview에서 domain을 파라미터로 받지 않도록 수정
JJ503 93a8476
refactor: 게임 결과 도메인 명 변경
JJ503 765f14c
feat: 게임을 실행하는 도메인 추가
JJ503 c0be9a4
refactor: 이름과 결과 입력 시 양옆의 공백 허용
JJ503 f1ddbef
refactor: 컨벤션 적용
JJ503 7148ab8
rename: ErrorMessage 경로 수정
JJ503 cf546ca
docs: 요구사항 완료 체크
JJ503 cf0409e
fix: 로직 문제에 대한 수정
JJ503 a6065ca
refactor: 라인 상태에 대한 객체 추가
JJ503 2eb1d2a
rename: view 내부 패키지 제거
JJ503 1a15d38
refactor: 파라미터 변수명 수정
JJ503 3cf3a5b
refactor: 컨트롤러의 생성자 추가
JJ503 615707c
refactor: 예외 메시지 출력 기능 outputView로 이동
JJ503 4ba26ca
refactor: 재입력 인터페이스 생성 및 적용
JJ503 90eb49c
refactor: 사용하지 않는 메서드 제거
JJ503 81551b1
refactor: 변수명을 명확하게 수정
JJ503 313e459
refactor: 객체 비교 기능 추가
JJ503 facbee6
feat: TestGenerator 추가
JJ503 4caaff5
docs: 네이밍 관련 수정
JJ503 32cf4e8
docs: 완료 기능 체크
JJ503 0815728
rename: readme 파일 합침
JJ503 5281476
fix: 잘못된 조건 수정
JJ503 0a4a092
refator: 사용하지 않는 패키지 제거
JJ503 6a8768f
feat: List 미션 수행
JJ503 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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를 적용합니다. | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
ladderGameController.play(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사실 이 말을 듣고 많은 생각이 떠올랐는데요. 역할부터 시작해서 많은 의문이 들긴했습니다ㅎㅎ
라는 생각이 들었네요ㅎㅎ 다시 돌아와서,
라는 물음에 답해본다면 BooleanGenerator의 역할을 먼저 생각해볼 필요가 있으며, 인터페이스를 그대로 사용하고자 한다면 BooleanGenerator는 어디에 있어야하는 게 맞을지 고민해보면 좋을 것 같습니다. (본질적으론 아마 이걸 물어보신 거겠죠?)
현재는 Controller 안에 있는데요. BooleanGenerator가 gernerate()하는 곳을 살펴보면 Line 클래스 안 뿐입니다. 결론적으로 Line의 상태를 생성한다고 볼 수 있으므로 LineFactory이란 클래스를 따로 생성하고 이 안에 BooleanGenerator가 있어야된다고 생각이 드네요. (LineFactory를 생성할 때 new RandomBooleanGenerator() 주입하는 형태, Model과 View를 연결짓는 Controller 역할과는 상관없으며 Ladder 도메인과도 연관이 없음)