기능 요구사항에서 기능 분류서 작성하기

60jong·2022년 11월 28일
0

Java

목록 보기
7/14

우아한테크코스 프리코스 과제를 진행하며, 가장 첫 작업은 항상 기능 분류서를 작성하는 것이었다. 그리고 이 부분이 개발의 근원이 됨에도 기능 분류서에 있는 기능 별로 개발 / commit이 잘 이루어지지 않았다. 그 이유로
기능 분류서에서 기능을 개발하는 단위에 맞지 않게 작성했기 때문이라고 생각한다.

따라서 기능 요구사항을 바탕으로 기능 분류서를 작성하는 연습을 하고자 한다.

컨셉은

  • 프로그램의 흐름에 따라 필요한 기능을 세부적으로!!
  • 객체의 관점으로 작성해보자!!
  • 프리코스 과제에서 작성한 기능 분류서

숫자 야구 게임 기능

- ### 게임 시작 시 `숫자 야구 게임을 시작합니다.` 출력한다.
- ### 겹치지 않는 랜덤 숫자 3개를 정해 목표 수로 저장한다.
- ### `숫자를 입력하세요`라는 출력을 하고 사용자의 숫자 3개를 입력 받는다.
- ### 정답을 맞출 때까지, 사용자의 입력 수와 목표 수를 비교를 반복한다.
- ### 비교 결과를 콘솔에 출력한다.
  - 입력 수가 목표 수와 겹치는 숫자가 없다면 "낫싱" 출력
  - 숫자가 겹칠 때
    - 숫자의 자리가 겹치지 않으면 "볼"
    - 숫자의 자리까지 겹친다면 "스트라이크"
    - `N볼 M스트라이크` 형식으로 출력한다.
- ### 입력 수와 목표 수가 같다면 "3스트라이크" 출력    
- ### 3스트라이크시 게임 재시작 / 종료 여부를 입력 받는다.
  - 1이 입력되면 게임 재시작
  - 2가 입력되면 게임 종료
- ### 예외 상황) 사용자가 숫자를 입력하지 않은 경우
  - `※서로 다른 숫자 3개를 입력해주세요.※`를 출력한 뒤, 다시 입력을 받는다.
- ### 예외 상황) 사용자가 입력한 숫자가 3개가 아닌 경우
  - `※서로 다른 숫자 3개를 입력해주세요.※`를 출력한 뒤, 다시 입력을 받는다.
- ### 예외 상황) 사용자가 중복된 숫자를 입력한 경우
  - `※서로 다른 숫자 3개를 입력해주세요.※`를 출력한 뒤, 다시 입력을 받는다.
- ### 예외 상황) 게임 재시작 / 종료 여부를 입력 받을 때 1 / 2가 아닌 값이 입력된 경우
  - `게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.`를 다시 출력한 뒤, 입력을 받는다.
  • 다시 작성한 기능 분류서
- 숫자 야구 게임 시작 문구를 출력한다.
- 정답 숫자 N개의 객체를 생성한다.
- 플레이어의 숫자 입력 요청 문구를 출력한다.
- 플레이어의 숫자 N개를 입력 받는다.
  - `예외처리`
    - 숫자가 아닌 경우
    - 중복되는 숫자가 있는 경우
    - N개를 초과하는 갯수의 숫자인 경우
- 플레이어의 숫자와 정답 숫자를 비교한다.
  - 자리 + 숫자가 같으면 스트라이크
  - 숫자만 같으면 볼
- 비교 결과로 `x볼 x스트라이크`문자열을 만든다.
  - 0볼 0스트라이크의 경우는 '낫싱'이라는 문자열을 만든다.
- 비교 결과 문자열을 출력한다.
- 비교 결과에서 스트라이크 갯수가 N개일 경우, 
  - 게임 재시작/종료 여부를 입력 받는다.
    - 1이 입력되면 전체 게임을 재시작한다.
    - 2가 입력되면 게임을 종료한다.
    - `예외처리`
      - 숫자가 아닌 경우
      - 1 or 2가 아닌 숫자인 경우
- N스트라이크가 아닌 경우, 다시 플레이어로부터 숫자 N개를 입력받는다.

로또 게임

  • 프리코스 과제에서 작성한 기능 분류서
- ### 로또 프로그램을 실행시킬 수 있다. [ # LottoProgram.run() ]
- ### 로또 구매 금액을 입력 받을 수 있다. [ # LottoProgram.getOrderPrice() ]
- ### 로또 구매 금액으로 로또 구매 수량을 구할 수 있다. [ # LottoService.getOrderQuantity(int orderPrice)]
  - 로또 1장은 1000원이다. [ # LottoService.LOTTO_PRICE ]
- ### 로또 구매 수량을 출력할 수 있다. [ # LottoProgram.alertOrderQuantity(int orderQuantity) ]
  - `N개를 구매했습니다.` 
- ### 로또 번호를 생성할 수 있다. [ # LottoFactory.createLottoNumbers() ]
  - 로또 번호는 랜덤으로 선택된다. [ # Randoms.pickUniqueNumbersInRange(LOTTO_START_NUMBER, LOTTO_END_NUMBER, LOTTO_NUMBER_COUNT) ]
  - 로또 번호는 오름차순으로 정렬한다. [ # LottoFactory.sortInAscending(List<Integer> numbers) ]
- ### 구매한 로또 수 만큼 로또 번호를 생성할 수 있다. [ # LottoFactory.createLottos(int quantity) ]
  - 생성된 로또 번호를 모두 출력할 수 있다. [ # LottoFactory.alertUserLottos(List<Lotto> lottos) ]
- ### 입력 받은 숫자로 당첨 번호를 만들 수 있다. [LottoProgram.createWinningLotto()]
  - 당첨 번호는 서로 다른 6개의 숫자이다.
- ### 보너스 번호를 입력 받을 수 있다. [ # LottoProgram.getBonusNumber() ]
  - 보너슨 번호는 담청 번호와 중복되지 않는 1개의 번호이다.
- ### 당첨 로또는 6개의 당첨 번호와 1개의 보너스 번호로 이루어진다. [ # WinningLotto ]
- ## [ # LottoAccountant.getLottoResults ] 당첨 내역을 계산할 수 있다.
  - 당첨 숫자와 사용자 로또 숫자의 일치하는 숫자 갯수를 계산할 수 있다. [ # LottoResultMaker.countLottoNumberMatch ]
  - 보너스 숫자와 사용자 로또 숫자 사이에 일치하는 숫자가 있는지 확인할 수 있다. [ # LottoResultMaker.countBonusNumberMatch ]
  [ # LottoWinnings ]
    - 3개 일치 시 5,000원
    - 4개 일치 시 50,000원
    - 5개 일치 시 1,500,000원
    - 5개 일치, 보너스 볼 일치 시 30,000,000원
    - 6개 일치 시 2,000,000,000원

- ### [ LottoAccountant.calculateRateOfReturn ] 총 수익률을 계산할 수 있다.
  - 수익률은 소숫점 둘째 자리에서 반올림한다.

- ### 당첨 통계를 콘솔에 출력할 수 있다.

- ### [  ] 사용자가 잘못된 값을 입력한 경우를 감지할 수 있다.
    - [  ] 입력 값이 숫자가 아닌 경우
    - [  ] 로또 구매 금액이 1000으로 나누어 떨어지지 않는 경우
    - [  ] 로또 번호가 `1이상 45이하`를 벗어난 경우
    - [  ] 로또 번호가 중복되는 경우
- ### [  ] 사용자가 잘못된 값을 입력한 경우, 예외를 발생시키고 에러메시지를 출력할 수 있다.
    - 예외 상황에 `IllegalArgumentException`을 발생시킨다.
      - [  ] 로또 구매 금액이 1000으로 나누어 떨어지지 않는 경우
        - [  ] `[ERROR] 로또는 1000원 단위로 구매할 수 있습니다.`를 출력하고 프로그램을 종료 시킨다.
      - [  ] 로또 번호가 `1이상 45이하`를 벗어난 경우    
        - [  ] `[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.`를 출력하고 프로그램을 종료 시킨다.
      - [  ] 로또 번호가 중복되는 경우
        - [  ] `[ERROR] 로또 번호는 중복되지 않아야 합니다.`를 출력하고 프로그램을 종료시킨다.
  • 다시 작성한 기능 분류서
- [] `출력` 구입금액 입력을 요구하는 문구를 출력한다.
- [] `입력` 구입금액을 입력 받는다.
  - [] `예외처리`
    - [] 숫자 단위가 아닌 경우
    - [] 금액이 1000원 단위가 아닌 경우
- [] 구입금액을 통해 로또 수량을 계산한다.
- [] 로또 수량만큼 로또를 생성한다.
  - [] 로또 번호 6개를 랜덤으로 생성한다.
- [] `출력` 구입금액을 통해 구입한 로또 수량을 출력한다.
- [] `출력` 로또 수량만큼 로또 숫자 리스트들을 출력한다.
- [] `입력` 당첨 번호를 입력받는다.
  - [] `예외처리`
    - [] 6개의 숫자가 아닌 경우
    - [] 중복되는 숫자가 있는 경우
    - [] 1이상 45 이하의 숫자가 아닌 경우
- [] `입력` 보너스 번호를 입력받는다.
  - [] `예외처리`
    - [] 1개의 숫자가 아닌 경우
    - [] 당첨 번호와 중복되는 경우
    - [] 1이상 45 이하의 숫자가 아닌 경우
- [] 로또와 당첨 로또를 통해 당첨 결과를 만들 수 있다.
  - [] 로또끼리 같은 당첨 번호의 갯수를 셀 수 있다.
  - [] 당첨 로또의 보너스 번호가 로또에 포함되는지 확인할 수 있다.
- [] 당첨 결과를 통해 당첨 금액을 계산할 수 있다.

    - 1등: 6개 번호 일치 / 2,000,000,000원
    - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
    - 3등: 5개 번호 일치 / 1,500,000원
    - 4등: 4개 번호 일치 / 50,000원
    - 5등: 3개 번호 일치 / 5,000원

- [] `출력` 당첨 결과를 출력할 수 있다.
- [] 당첨 결과를 통해 수익률을 계산할 수 있다.
- [] `출력` 총 수익률을 출력할 수 있다.

두 분류서를 비교했을 때, 다시 작성한 기능 분류서는 (방금 작성해서 일수도 있지만) 더 개발 단위에 맞춰져 있다고 느껴진다.

profile
울릉도에 별장 짓고 싶다

0개의 댓글