Skip to content

페어매칭 최종 제출 #8

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

Open
wants to merge 94 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
753dca9
feature (IoPrinter) : 기본적인 출력 구조 설정
JaeHongDev Dec 8, 2022
2d5b2c2
feature (PairmatchingContext) : 페어매칭에서 사용하는 컨텍스트 정의
JaeHongDev Dec 8, 2022
1ab4496
docs (PairmatchingStatus) : 사용자 입력의 상태 정의
JaeHongDev Dec 8, 2022
0de5bba
test (initStatus) : 초기상태 상태 테스트 코드 작성
JaeHongDev Dec 8, 2022
1a4f104
feature (PairmatchingStatus) : 페어매칭 상태 인터페이스 정의
JaeHongDev Dec 8, 2022
0ecf099
feature (InitStauts) : 페어매칭 초기상태 구현
JaeHongDev Dec 8, 2022
832d112
feature (PairmatchingView) : 페어매칭에서 사용하는 view의 정보를 가지는 기능 구현
JaeHongDev Dec 8, 2022
3be1a09
feature (PairmatchingContext) : 컨텍스트에서 뷰를 전달받는 기능 구현
JaeHongDev Dec 8, 2022
fa01a6d
test (FakePairmatchingContext) : 가짜 컨텍스트 구현
JaeHongDev Dec 8, 2022
87920fe
test (InitStatus) : 초기상태에서 가짜 컨텍스트를 사용하도록 변경
JaeHongDev Dec 8, 2022
f744304
test (FeatureCommandTest) : 잘못된 명령어를_입력하면_오류가_발생하는지 검증하는 테스트코드 작성
JaeHongDev Dec 8, 2022
978bfab
feature (FeautreCommand) : 명령에 따라서 올바른 명령어를 반환하는 코드 작성
JaeHongDev Dec 8, 2022
fce867a
test (FeatureCommandTest) : 기능목록이 정상적으로 반환되는지 검증하는 테스트코드 작성
JaeHongDev Dec 8, 2022
24c0e21
feature (FeautreCommand) : 메시지 출력 기능 구현
JaeHongDev Dec 8, 2022
3b4d979
feature (QuitStatus) : 종료상태 기능 구현
JaeHongDev Dec 8, 2022
7e97c1d
feature (PairmatchingLauncher) : 런처를 통해서 페어매칭을 실행하도록 변경
JaeHongDev Dec 8, 2022
b70a41b
feature (SelectFeatureStatus) : 기능선택상태에서 페어매칭 기능을 입력받도록 구현
JaeHongDev Dec 8, 2022
83292e3
feature (CommandToStatusConvertor) : 기능 선택을 상태로 변경해주는 기능 구현
JaeHongDev Dec 8, 2022
1fbc668
feature (InputView) : 사용자 명령어를 받는 기능 추가
JaeHongDev Dec 8, 2022
98d95c5
test (CourseTest) : 과정에 대한 테스트코드 작성
JaeHongDev Dec 8, 2022
acd3a9a
test (Course) : 과정에 대한 테스트 변경
JaeHongDev Dec 8, 2022
a1f103b
feature (Course) : 교육과정에 대한 기능 구현
JaeHongDev Dec 8, 2022
1eef991
test (SubjectTest) : 과제에대한 테스트 코드 작성
JaeHongDev Dec 8, 2022
157f2b2
feature (Subject): 과제에 대한 기능 구현 완료
JaeHongDev Dec 8, 2022
8fe16e8
test (LevelTest) : 레벨에 대한 테스트코드 작성
JaeHongDev Dec 8, 2022
e7e0137
refactor (Subject) : 과제 추가
JaeHongDev Dec 8, 2022
f09cbe0
feature (Subject) : 과목의 이름을 반환하는 기능 추가
JaeHongDev Dec 8, 2022
6a7891e
feature (Level) : 레벨에 대한 기능 구현
JaeHongDev Dec 8, 2022
6e62a6a
feature (IoPrinter) : 출력 상수 추가
JaeHongDev Dec 8, 2022
c2bd5d5
style
JaeHongDev Dec 8, 2022
6986986
refactor (PairmatchingLaunceher) : 런처 생성자를 public으로 변경
JaeHongDev Dec 8, 2022
268709e
test (MatchingDivisionTest) : 매칭을 위한 구분값에 대한 테스트 코드 작성
JaeHongDev Dec 8, 2022
bffbaa2
feature (MatchingDivision) : 매칭을 위한 구분값 기능 구현
JaeHongDev Dec 8, 2022
cee799f
test (CrewTest) : 크루에 대한 테스트 요구사항 작성
JaeHongDev Dec 8, 2022
c4a01b3
fix (CrewTest) : 콤마 추가
JaeHongDev Dec 8, 2022
40d7744
refactor (CrewTest) : 강좌가 다른 크루 검증하는 코드 변경
JaeHongDev Dec 8, 2022
e07f9f7
feature (Course) : 과정에서 연결되는 파일명을 가지도록 변경
JaeHongDev Dec 8, 2022
2a604d6
feature (Crew) : 크루에 대한 기능 구현
JaeHongDev Dec 8, 2022
3e54340
feature (ReadFile) : 파일을 읽어오는 기능 구현
JaeHongDev Dec 8, 2022
90265bf
feature (ShuffleGenerator) : 문자열을 섞는 기능 구현
JaeHongDev Dec 8, 2022
248f1d0
feature (FackeFileReader) : 가짜 파일 읽기 클래스 구현
JaeHongDev Dec 8, 2022
c41940d
feature (FakeShuffle) : 가짜 데이터 섞기 클래스 구현
JaeHongDev Dec 8, 2022
0a54d28
feature (Level) : 문자열을 입력받을때 공백을 제거하도록 변경
JaeHongDev Dec 8, 2022
f1de8d1
test (CrewGeneratorTest) : 섞인 크루를 반환하는 코드 작성
JaeHongDev Dec 8, 2022
7104905
feature (CrewGenerator) : 크루들을 생성하는 기능 구현
JaeHongDev Dec 8, 2022
989e903
feature (InputView) : 매칭 구분값을 입력받는 기능 구현
JaeHongDev Dec 8, 2022
b406bb0
feature (PairmatchingContext) : 컨텍스트에서 매칭 구분값을 저장하는 기능 추가
JaeHongDev Dec 8, 2022
522aeac
feature (PairmatchingContextImpl) : 컨텍스트에서 매칭에 필요한 크루 생성 클래스를 주입받도록 변경
JaeHongDev Dec 8, 2022
d0179c8
refactor (PairmatchingLauncher) : 실행할때 초기상태로 설정
JaeHongDev Dec 8, 2022
f2bd807
feature (MatchedCrew) : 매칭된 크루 정보를 가지는 클래스 생성
JaeHongDev Dec 8, 2022
618a72c
feature (MatchedCrews) : 매칭된 크루 집합을 가지는 일급 컬렉션 생성
JaeHongDev Dec 8, 2022
e247dad
feature (MatchingResult) : 매칭된 결과를 가지는 클래스 생성
JaeHongDev Dec 8, 2022
06b4946
feature (PairmatchingContext) : 매칭하는 기능 컨텍스트에 지정
JaeHongDev Dec 8, 2022
308553c
feature (InputStatus) : 매칭 초기상태 구현
JaeHongDev Dec 8, 2022
204c52b
feature (MatchingProcessStatus) : 매칭 처리상태 생성
JaeHongDev Dec 8, 2022
fc346e7
feature (CustomException) : 매칭과 관련된 커스텀 예외 추가
JaeHongDev Dec 9, 2022
eb93093
test (MatchedCrewsTest) : 매칭된 크루 목록에 대한 테스트코드 작성
JaeHongDev Dec 9, 2022
4737c37
test (MatchingResultTest) : 매칭 결과에 대한 테스트코드 작성
JaeHongDev Dec 9, 2022
8dc1bb4
feature (Crew) : 이름을 반환하는 기능 추가
JaeHongDev Dec 9, 2022
2e8aade
feature (MatchedCrew) : 매칭된 크루의 이름을 구분지어 반환하는 기능 추가
JaeHongDev Dec 9, 2022
6a41f5f
feature (MatchedCrews) : 매칭된 크루 목록에 대한 결과를 반환하는 기능 추가
JaeHongDev Dec 9, 2022
f71e69a
feature (MatchingResult) : 매칭 결과를 저장하고 조회하는 기능 추가
JaeHongDev Dec 9, 2022
810632a
test (TestUtils) : 공통 테스트코드 추가
JaeHongDev Dec 9, 2022
f163974
feature (BeforeMathcedCrewException) : 이전에 매칭한적이 있는 크루에 대한 커스텀 예외 생성
JaeHongDev Dec 9, 2022
e9f0d7e
test (MatchingResultTest) : 같은 레벨에서 매칭된 결과가 있는지 검증하는 테스트 코드 작성
JaeHongDev Dec 9, 2022
9fe770b
feature (MatchingDivision) : 같은 레벨인지 검증하는 코드 작섬ㅇ
JaeHongDev Dec 9, 2022
12affbe
feature (MatchedCrew) : 매칭된 적이 있는지 검증하는 코드 작성
JaeHongDev Dec 9, 2022
312c676
feature (MathcedCrews) : 매칭된 크루 목록에서 이미 매칭한적이 있는지 검증하는 코드 작성
JaeHongDev Dec 9, 2022
4466f75
feature (MatchingResult) : 같은 레벨에서 이미 매칭한 경험이 있는 경우 오류를 발생하도록 구현
JaeHongDev Dec 9, 2022
9fffc9a
feature (OutputView) : 매칭 결과를 출력하는 기능 추가
JaeHongDev Dec 9, 2022
bc3af25
feature (InputView) : 매칭을 다시 시도하는 기능 추가
JaeHongDev Dec 9, 2022
b5dee8d
feature (RetryCount) : 재시도횟수 관련 기능 추가
JaeHongDev Dec 9, 2022
b597461
refactor (MatchingResult) : 매칭을 추가하는 기능과 재매칭하는 기능의 분리
JaeHongDev Dec 9, 2022
52067a0
refactor (CommandToStatusConvertor) : 코드에서 상태를 변경해주는 코드 추가
JaeHongDev Dec 9, 2022
e77d571
feature (RematchingCommand) : 다시 매칭하는 기능 추가
JaeHongDev Dec 9, 2022
9bd9d3d
test (SelectFeatureStatusTest) : 기능을 고르는 상태 테스트코드 작성
JaeHongDev Dec 9, 2022
1d957e0
feature (CommandToStatusConvertor) : 종료 상태와 초기화상태 추가
JaeHongDev Dec 9, 2022
0ba0ceb
feature (MatchingInitalizeStatus) : 매칭 초기화 상태 구현
JaeHongDev Dec 9, 2022
0ce3832
refactor (MatchingInitalizeStatus) : 매칭 초기화 상태 추가
JaeHongDev Dec 9, 2022
b56bd5f
refactor (RetryCount) : 재시도 횟수 초과 메시지 변경
JaeHongDev Dec 9, 2022
f757bce
refactor (MatchingResult) : 매칭된 결과에서 본인을 제외하고 탐색하도록 변경
JaeHongDev Dec 9, 2022
e567fea
refactor (RematchingCommand) : 매칭 명령어에서 상태를 가지지 않도록 변경
JaeHongDev Dec 9, 2022
f92ac27
feature (PairmatchingContextImpl) : 매칭에서 재 매칭을 하기 위한 기능 구현
JaeHongDev Dec 9, 2022
01cf996
refactor (PairmatchingLauncher) : 런처에서 오류를 핸들링하도록 변경
JaeHongDev Dec 9, 2022
9d8d6b6
feature (AskRematchingStatus) : 매칭 재시도를 묻는 기능 추가
JaeHongDev Dec 9, 2022
630a698
feature (FindMatchingResultStatus) : 매칭 결과를 조회하는 기능 추가
JaeHongDev Dec 9, 2022
22d2953
feature (BeforeMatchingIgnoreProcessStatus) : 이전에 매칭 경험을 무시하고 다시 매칭하는…
JaeHongDev Dec 9, 2022
ac1ed22
feature (SelectFeautrStatus) : 기능 선택상태에서 시도횟수 초기화하는 기능 추가
JaeHongDev Dec 9, 2022
a68cb99
refactor (MatchingProcessStatus) : 매칭 처리하는 상태 추가
JaeHongDev Dec 9, 2022
0026285
refacotr (View) : 메뉴출력 기능을 InputVIew에서 OutputView로 변경
JaeHongDev Dec 9, 2022
1ed6a1a
refactor (InputStatus) : 입력 상태에서 메뉴 출력하도록 변경
JaeHongDev Dec 9, 2022
34644b8
clean
JaeHongDev Dec 9, 2022
3429bc8
test
JaeHongDev Dec 9, 2022
a8c6d06
refactor (PairmatchingLauncher) : 코드 정리
JaeHongDev Dec 9, 2022
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
141 changes: 90 additions & 51 deletions config/WootecoStyle.xml
Original file line number Diff line number Diff line change
@@ -1,56 +1,95 @@
<code_scheme name="WootecoStyle" version="173">
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
<option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="METHOD_PARAMETERS_WRAP" value="1" />
<option name="EXTENDS_LIST_WRAP" value="1" />
<option name="THROWS_KEYWORD_WRAP" value="1" />
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
<option name="TERNARY_OPERATION_WRAP" value="1" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="FOR_STATEMENT_WRAP" value="1" />
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
<option name="WRAP_COMMENTS" value="true" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
<JavaCodeStyleSettings>
<option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<?xml version="1.0" encoding="UTF-8"?>
<code_scheme name="WootecoStyle">
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="4"/>
<option name="CONTINUATION_INDENT_SIZE" value="8"/>
<option name="TAB_SIZE" value="4"/>
<!-- <option name="INDENT_SIZE" value="2" /> -->
<!-- <option name="CONTINUATION_INDENT_SIZE" value="4" /> -->
<!-- <option name="TAB_SIZE" value="2" /> -->
<option name="USE_TAB_CHARACTER" value="false"/>
<option name="SMART_TABS" value="false"/>
<option name="LABEL_INDENT_SIZE" value="0"/>
<option name="LABEL_INDENT_ABSOLUTE" value="false"/>
<option name="USE_RELATIVE_INDENTS" value="false"/>
</value>
</option>
<option name="INSERT_INNER_CLASS_IMPORTS" value="true"/>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999"/>
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999"/>
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
<value/>
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="" withSubpackages="true" static="true" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
</value>
<value>
<package name="" withSubpackages="true" static="true"/>
<emptyLine/>
<package name="" withSubpackages="true" static="false"/>
</value>
</option>
</JavaCodeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="METHOD_PARAMETERS_WRAP" value="1" />
<option name="EXTENDS_LIST_WRAP" value="1" />
<option name="THROWS_KEYWORD_WRAP" value="1" />
<option name="METHOD_CALL_CHAIN_WRAP" value="1" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
<option name="TERNARY_OPERATION_WRAP" value="1" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="FOR_STATEMENT_WRAP" value="1" />
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
<option name="WRAP_COMMENTS" value="true" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
</codeStyleSettings>
<option name="RIGHT_MARGIN" value="120"/>
<!-- <option name="RIGHT_MARGIN" value="100" /> -->
<option name="JD_ALIGN_PARAM_COMMENTS" value="false"/>
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false"/>
<option name="JD_P_AT_EMPTY_LINES" value="false"/>
<option name="JD_KEEP_EMPTY_PARAMETER" value="false"/>
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false"/>
<option name="JD_KEEP_EMPTY_RETURN" value="false"/>
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="0"/>
<!-- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> -->
<!-- <option name="ALIGN_MULTILINE_FOR" value="false" /> -->
<option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="THROWS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3"/>
<option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true"/>
<codeStyleSettings language="JAVA">
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<!-- <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> -->
<!-- <option name="ALIGN_MULTILINE_PARAMETERS" value="false" /> -->
<!-- <option name="ALIGN_MULTILINE_RESOURCES" value="false" /> -->
<!-- <option name="ALIGN_MULTILINE_FOR" value="false" /> -->
<option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="THROWS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3"/>
<option name="PARENT_SETTINGS_INSTALLED" value="true"/>
<indentOptions>
<option name="INDENT_SIZE" value="4"/>
<option name="CONTINUATION_INDENT_SIZE" value="8"/>
<option name="TAB_SIZE" value="4"/>
<!-- <option name="INDENT_SIZE" value="2" /> -->
<!-- <option name="CONTINUATION_INDENT_SIZE" value="4" /> -->
<!-- <option name="TAB_SIZE" value="2" /> -->
</indentOptions>
</codeStyleSettings>
</code_scheme>
8 changes: 8 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## 도메인 요구사항

## 상태별 요구사항

- 매칭 초기화 초기상태
- [ ] 매칭의 초기상태로 다음 상태는 사용자 입력 선택 상태입니다.
- 사용장 명령어 선택 상태
- [ ] 사용자로부터 입력을 기능선택의 입력을 받아옵니다.
4 changes: 3 additions & 1 deletion src/main/java/pairmatching/Application.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package pairmatching;

import pairmatching.launcher.PairmatchingLauncher;

public class Application {
public static void main(String[] args) {
// TODO 구현 진행

new PairmatchingLauncher().execute();
}
}
34 changes: 34 additions & 0 deletions src/main/java/pairmatching/domain/code/Course.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package pairmatching.domain.code;

import java.util.Arrays;
import java.util.stream.Collectors;

public enum Course {
BACKEND("백엔드", "backend-crew.md"),
FRONTEND("프론트엔드", "frontend-crew.md");

private final String name;
private final String fileName;

Course(final String name, final String fileName) {
this.name = name;
this.fileName = fileName;
}

public static String messages() {
return Arrays.stream(values())
.map(course -> course.name)
.collect(Collectors.joining(" | "));
}

public static Course from(String input) {
return Arrays.stream(values())
.filter(course -> course.name.equals(input.trim()))
.findAny()
.orElseThrow(IllegalArgumentException::new);
}

public String getFileName() {
return this.fileName;
}
}
47 changes: 47 additions & 0 deletions src/main/java/pairmatching/domain/code/Level.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package pairmatching.domain.code;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public enum Level {
LEVEL1("레벨1", List.of(Subject.RACING, Subject.LOTTO, Subject.BASEBALL)),
LEVEL2("레벨2", List.of(Subject.SHOPPING, Subject.PAYMENT, Subject.SUBWAY)),
LEVEL3("레벨3"),
LEVEL4("레벨4", List.of(Subject.IMPROVE_PERFORMANCE, Subject.DEPLOY)), LEVEL5("레벨5");

private final String name;
private final List<Subject> subjects;

Level(final String name) {
this.name = name;
this.subjects = new ArrayList<>();
}

Level(final String name, final List<Subject> subjects) {
this.name = name;
this.subjects = subjects;
}

public static Level from(final String name, final Subject subject) {
return Arrays.stream(values())
.filter(level -> level.name.equals(name.trim()))
.filter(level -> level.subjects.contains(subject))
.findAny()
.orElseThrow(IllegalArgumentException::new);
}

public static String messages() {
return Arrays.stream(values())
.map(Level::message)
.collect(Collectors.joining("\n"));
}

private String message() {
var subjectNames = subjects.stream()
.map(Subject::getName)
.collect(Collectors.joining(" | "));
return String.format(" - %s: %s", name, subjectNames);
}
}
32 changes: 32 additions & 0 deletions src/main/java/pairmatching/domain/code/Subject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package pairmatching.domain.code;

import java.util.Arrays;

public enum Subject {
RACING("자동차경주"),
LOTTO("로또"),
BASEBALL("숫자야구게임"),
SHOPPING("장바구니"),
PAYMENT("결제"),
SUBWAY("지하철노선도"),
IMPROVE_PERFORMANCE("성능개선"),
DEPLOY("배포");


private final String name;

Subject(final String input) {
this.name = input;
}

public static Subject from(final String input) {
return Arrays.stream(values())
.filter(subject -> subject.name.equals(input.trim()))
.findAny()
.orElseThrow(IllegalArgumentException::new);
}

public String getName() {
return name;
}
}
24 changes: 24 additions & 0 deletions src/main/java/pairmatching/domain/count/RetryCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package pairmatching.domain.count;

public class RetryCount {
private static final int INITIALIZE_COUNT = 0;
private static final int PLUS_COUNT = 1;
private static final int MAX_COUNT = 3;
private final int count;

private RetryCount(final int count) {
if (count > MAX_COUNT) {
throw new IllegalStateException("3회이상 매칭을 시도할 수 없습니다.");
}
this.count = count;
}

public static RetryCount generateInitializeCount() {
return new RetryCount(INITIALIZE_COUNT);
}

public RetryCount plusRetry() {
return new RetryCount(this.count + PLUS_COUNT);
}

}
48 changes: 48 additions & 0 deletions src/main/java/pairmatching/domain/generator/CrewGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package pairmatching.domain.generator;

import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import pairmatching.domain.code.Course;
import pairmatching.domain.matching.Crew;

public class CrewGenerator {
private final ReadFile readFile;
private final ShuffleGenerator shuffleGenerator;


public CrewGenerator(ReadFile readFile, ShuffleGenerator shuffleGenerator) {
this.readFile = readFile;
this.shuffleGenerator = shuffleGenerator;
}

public List<Crew> generateCrews(Course course) {
var crewNames = this.readFileByCrews(course.getFileName());

var generatedCrews = this.shuffleGenerator.shuffle(crewNames)
.stream()
.map(name -> new Crew(course, name))
.collect(Collectors.toList());

validateCrewSizeIsGreaterThanMinSize(generatedCrews.size());
validateDuplicatedCrew(generatedCrews);

return generatedCrews;
}

private void validateDuplicatedCrew(List<Crew> generatedCrews) {
if (generatedCrews.size() != new HashSet<>(generatedCrews).size()) {
throw new IllegalStateException("크루의 이름이 중복됩니다.");
}
}

private void validateCrewSizeIsGreaterThanMinSize(int size) {
if (size < 2) {
throw new IllegalStateException("매칭할 수 없습니다.");
}
}

private List<String> readFileByCrews(final String fileName) {
return readFile.readFile(fileName);
}
}
7 changes: 7 additions & 0 deletions src/main/java/pairmatching/domain/generator/ReadFile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package pairmatching.domain.generator;

import java.util.List;

public interface ReadFile {
List<String> readFile(String fileName);
}
23 changes: 23 additions & 0 deletions src/main/java/pairmatching/domain/generator/ReadFileImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package pairmatching.domain.generator;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class ReadFileImpl implements ReadFile {
private static final String RESOURCES = "src/main/resources/";

@Override
public List<String> readFile(String fileName) {
return this.read(fileName);
}

private List<String> read(String fileName) {
try {
return Files.readAllLines(Paths.get(RESOURCES + fileName));
} catch (IOException exception) {
throw new IllegalStateException("잘못된 파일이거나 읽을 수 없습니다.");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package pairmatching.domain.generator;

import java.util.List;

public interface ShuffleGenerator {

List<String> shuffle(List<String> input);
}
Loading