Skip to content

Conversation

@DoomchitYJ
Copy link

@DoomchitYJ DoomchitYJ commented Dec 11, 2024

예상 시나리오

  1. 기능 선택 보기를 출력한다.
  2. 기능 선택 입력을 받는다.
    1. 1을 입력받은 경우 (페어 매칭)
      1. 과정, 미션을 출력한다.
      2. 과정, 미션, 레벨을 입력 받는다.
        • 이미 매칭 결과가 있을 경우, 재매칭 여부를 묻는다.
          • 네 -> 2-i-c로 가서 재매칭 결과를 출력한다.
          • 아니오 -> 2-i-b로 돌아간다.
        • 올바르지 않은 값을 입력한 경우, 에러 메시지를 출력하고 다시 입력 받는다.
      3. 매칭 결과를 출력한다.
      4. 1로 돌아간다.
    2. 2를 입력한다. (페어 조회)
      1. 과정, 미션을 출력한다.
      2. 과정, 미션, 레벨을 입력 받는다.
        • 매칭 결과가 있을 경우, 기존에 존재하는 해당 매칭 결과를 출력한다.
        • 없을 경우, 없음을 고지하고 1로 돌아간다.
        • 올바르지 않은 값을 입력한 경우, 에러 메시지를 출력하고 다시 입력 받는다.
    3. 3을 입력한다. (페어 초기화)
      1. 초기화되었음을 출력한다.
    4. Q를 입력한다. (종료)
      1. 프로그램을 종료한다.
    5. 이 외의 값을 입력한다.
      1. 에러 메시지를 출력하고 다시 입력 받는다.

예외 처리

  1. 기능 선택 시, 주어진 1, 2, 3, Q 외 값을 입력한다.
  2. 과정, 미션, 레벨 입력 시, 주어진 보기 외 값을 입력한다.

구현 기능 목록

기능 선택 보기를 입력 받는 기능

  • "기능을 선택하세요.\n1. 페어 매칭\n2. 페어 조회\n3. 페어 초기화\nQ. 종료"를 출력한다.
  • 값을 입력 받는다.
  • 입력값을 검증한다.
    • 1, 2, 3, Q 중에 하나인가?

크루원 목록 생성 기능

  • backend-crews.md 파일을 읽는다.
  • 내용을 List 변수에 담는다.
  • frontend-crews.md 파일을 읽는다.
  • 내용을 List 변수에 담는다.

페어 매칭 기능

  • "#############################################\n
    과정: [과정 목록]\n
    미션:\n
    - 레벨1: [미션 목록]\n
    - 레벨2: [미션 목록]\n
    - 레벨3: [미션 목록]\n
    - 레벨4: [미션 목록]\n
    - 레벨5: [미션 목록]\n
    ############################################\n
    과정, 레벨, 미션을 선택하세요.\n
    ex) 백엔드, 레벨1, 자동차경주"를 출력한다.
  • 과정, 레벨, 미션을 입력 받는다.
  • 입력값을 검증한다.
    • 과정, 레벨, 미션으로 파싱한다.
    • 과정이 존재하는가?
    • 레벨이 존재하는가?
    • 미션이 존재하는가?
  • 기존 매칭 결과가 있을 경우,
    • "매칭 정보가 있습니다. 다시 매칭하시겠습니까?\n 네 | 아니오"를 출력한다.
    • 값을 입력 받는다.
      • "네" -> 아래의 "새로운 매칭 결과를 출력하는 경우"로 넘어간다.
      • "아니오" -> "과정, 레벨, 미션 입력"으로 돌아간다.
  • 새로운 매칭 결과를 출력하는 경우,
    • 각 과정에 맞는 크루원 이름을 셔플한다.
    • 결과를 저장한다.
  • 매칭 결과를 출력한다.
    • "페어 매칭 결과입니다."를 출력한다.
    • 한 줄에 두 명씩 묶어 "[이름] : [이름]" 형태로 출력한다.
      • 크루원이 홀수일 경우, 마지막 3명을 한 페어로 묶어 출력한다.
  • 기능 선택으로 돌아간다.

페어 조회 기능

  • "#############################################\n
    과정: [과정 목록]\n
    미션:\n
    - 레벨1: [미션 목록]\n
    - 레벨2: [미션 목록]\n
    - 레벨3: [미션 목록]\n
    - 레벨4: [미션 목록]\n
    - 레벨5: [미션 목록]\n
    ############################################\n
    과정, 레벨, 미션을 선택하세요.\n
    ex) 백엔드, 레벨1, 자동차경주"를 출력한다.
  • 과정, 레벨, 미션을 입력 받는다.
  • 입력값을 검증한다.
    • 과정, 레벨, 미션으로 파싱한다.
    • 과정이 존재하는가?
    • 레벨이 존재하는가?
    • 미션이 존재하는가?
  • 기존 매칭 결과가 존재하는 경우,
    • 매칭 결과를 출력한다.
  • 매칭 결과가 존재하지 않을 경우,
    • "매칭 이력이 없습니다."를 출력한다.
  • 기능 선택으로 돌아간다.

페어 초기화 기능

  • 매칭 결과를 모두 삭제한다.
  • "초기화 되었습니다."를 출력한다.
  • 기능 선택으로 돌아간다.

종료 기능

  • Q를 입력받을 경우, 프로그램을 종료한다.

- showResult(): 기존 매칭 이력이 없을 경우, 다시 과정, 레벨, 미션 입력으로 돌아가는 구조에서 기능 선택 입력으로 돌아가도록 수정함

### 페어 매칭 기능

- [x] "#############################################\n

Choose a reason for hiding this comment

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

리드미도 어쨌든 개발자가 직접 관리해야 하는 자원이기 때문에 추후 변경이 있으면 직접 변경해야 합니다. 때문에 출력값또한 언제든지 변경될 수 있기에 너무 구체적으로 적기보단, "미션 출력 기능" 이런식으로 간단하게 적는게 좋다고 들었어요!


private static Pairs pairs = new Pairs();

private static final String PAIR_MATCHING_FUNC = "1";

Choose a reason for hiding this comment

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

1,2,3,Q 이러한 값들을 Enum 으로 관리하면 편하더라구요!


public Optional<Pair> findByCourseLevelMission(final Course course, final Level level, final Mission mission) {
return pairs.stream()
.filter(pair -> pair.getCourse() == course && pair.getLevel() == level && pair.getMission() == mission)

Choose a reason for hiding this comment

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

계산이 많아서 가독성이 살짝 떨어지는거 같습니다! 메서드로 분리하면 좋을거 같아요

import pairmatching.domain.Course;
import pairmatching.exception.PairmatchingException;

public class CrewNameRepository {

Choose a reason for hiding this comment

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

Repository 로 관리하니 역할이 분리되서 좋네요!

import pairmatching.view.InputView;
import pairmatching.view.OutputView;

public class PairCheckService {

Choose a reason for hiding this comment

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

Controller 하위 계층이 Service 계층으로 보이는데, View 관련 기능들이 깊은 계층에 들어오면 사용자 입출력 관계가 비지니스 로직과 가까워져 위험할 수 있을거 같습니다!(개인적인 생각) 영진님은 어떻게 생각하시나요 ?

import java.util.Map;
import pairmatching.repository.CrewNameRepository;

public class CrewNameList {

Choose a reason for hiding this comment

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

클래스 네이밍에 List,Set 과같은 자료 타입이 들어가는걸 조심해야 합니다(클린코드)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants