🍀

19일차_지난 과제 피드백 고려해 설계하기

작성일자
Nov 6, 2023
태그
DIARY_DEVELOP
프로젝트
PreCourse
책 종류

1. 설계 방법 고민하기

  • 이번 주차에 tdd를 넣고자 했으나, 코드 리뷰를 하고 이를 정리하는 데에 거의 4일을 쏟아붓는 바람에,,, tdd 책을 다 읽지 못했다. 따라서, tdd는 다음주에 적용하고자 한다. 우선은 지난 주에 익힌 객체지향적인 설계 방식을 한 번 더 적용하며 동시에 코드 리뷰를 통해 배운 것들을 적용하는 데까지를 목표로 잡았다.
 

2. 이번 과제 정리하기

  • 프로그래밍 요구 사항
    • 함수 길이가 15라인 넘지 않게 한다(한 가지 일만 하도록 구현)
      else 예약어 쓰지 않는다. switch/case도 쓰지 않는다. (early return은 가능)
      enum을 사용한다
      도메인 로직에 단위 테스트를 구현한다. 단, UI 로직은 제외한다.
      (도메인 로직과 UI 담당 로직 분리해 구현)
      Random 값 추출은  pickUniqueNumbersInRange()를 활용한다.
      List<Integer> numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6);
      사용자가 입력하는 값은 readLine()을 활용한다.
      제공하는 Lotto 클래스를 활용해 구현해야 한다. (패키지 변경은 가능)
      numbers의 접근 제어자인 private을 변경할 수 없다.
      Lotto에 필드(인스턴스 변수)를 추가할 수 없다.
      indent는 2까지만 허용한다
      3항 연산자 사용하지 않는다
      기능 목록이 정상 동작함을 테스트코드로 확인한다
  • 과제 진행 요구 사항
    • 기능 구현 전에 기능 목록 만들고, 기능 목록 단위로 커밋하기
  • 과제 목표
    • 클래스(객체)를 분리하는 연습하기
    • 도메인 로직에 대한 단위 테스트를 작성하는 연습하기
  • 기능 요구 사항
    • 구입 금액을 입력받는다.
      • 로또 1장의 가격은 1000원
    • 구입 금액만큼 로또를 구입해, 구매한(발행한) 로또의 수량과 번호를 출력한다.
      • 번호는 오름차순 정렬
    • 당첨 번호와 보너스 번호를 입력받는다.
      • 로또 번호는 1~45 사이의 숫자 6개로 이루어지며 중복 안됨
    • 발행한 로또 번호와 당첨 번호를 비교해, 당첨 통계(등수 별 당첨 개수와 수익률)을 출력한다.
      • 수익률은 소수점 둘째 자리에서 반올림
  • 예외 처리
    • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
    • (view) 사용자가 입력한 구입 금액이 정수가 아닐 때
    • (model) 사용자가 입력한 구입 금액이 1000원으로 나누어 떨어지지 않을 때
    • (view) 사용자가 입력한 당첨 번호가 (쉼표로 구분된) 정수형 리스트가 아닐 때
    • (view) 사용자가 입력한 보너스 번호가 정수가 아닐 때
    • (model) 사용자가 입력한 당첨 번호, 보너스 번호가 1~45 사이가 아닐 때
    • (model) 사용자가 입력한 당첨 번호 개수가 6개가 아닐 때
    • (model) 사용자가 입력한 당첨 번호가 중복될 때

3. 지난 설계 한 번 더 사용해 검증하기

스토리텔링식으로 설계해 협력/책임/역할 정하기

  • 이야기 : 모자장수가 로또를 사고 당첨 결과를 얻음
    • 로또 판매를 시작하는 일요일, 로또 가게에 로또 발행 기계, 판매원, 모자 장수, 로또 당첨 계산 어플이 있음
      • 판매원이 모자 장수에게 “얼마어치 구매할 건가요?” 라고 물어봄
        • 모자 장수가 판매원에게 “로또 8000원어치 구매요~”라고 말함
      • 판매원이 “8장 구매”라고 로또 발행 기계에 입력함
        • 로또 발행 기계가 판매원에게 로또 8장을 종이에 출력해줌
      • 판매원이 “발행된 로또 가져가세요~ 갖고계셔야 당첨금 받으실 수 있어요~”라고 모자장수에게 말함
        • 모자 장수가 발행된 로또 가져가서 소유함
    • 일주일이 지나 로또 판매를 마친 토요일, 로또 발표 현장에 , 로또 당첨 계산 어플이 있음
      • 이 “이번주 당첨 번호는 1,2,5,26,35,42+17 로 결정!”이라고 로또 당첨 계산 어플에 입력함
        • 로또 당첨 계산 어플이 왕의 당첨 번호를 입력받음
    • 다음날 일요일, 모자 장수의 집에 모자 장수, 로또 당첨 계산 어플이 있음
      • 모자 장수로또 당첨 계산 어플에 본인의 로또 번호를 입력함
        • 로또 당첨 계산 어플이 모자 장수의 로또 번호들을 저장함
      • 모자 장수가 로또 당첨 계산 어플에서 “당첨 통계 계산” 버튼을 클릭함
        • 로또 당첨 계산 어플이 당첨 통계를 출력함
  • 협력 : 요청과 응답
    • 누군가가 판매원에게 판매를 시작하라고 요청함으로써 로또 판매가 시작됨 (in 로또 가게)
      • 판매원이 모자 장수에게 구매 개수를 말할 것을 요청함
        • 모자 장수가 구매 개수를 말함으로써 판매원의 요청에 응답함
      • 판매원이 로또 발행 기계에게 개수만큼 로또를 발행할 것을 요청함
        • 로또 발행 기계가 로또를 발행함으로써 판매원의 요청에 응답함
      • 판매원이 모자 장수에게 발행된 로또를 가져가서 소유하라고 요청함
        • 모자 장수가 발행된 로또 소유함으로써 판매원의 요청에 응답함
    • 누군가가 에게 로또 발표를 시작하라고 요청함으로써 로또 당첨 번호 결정이 시작됨 (in 로또 발표 현장)
      • 이 로또 당첨 계산 어플에게 결정한 당첨 번호를 저장할 것을 요청함
        • 로또 당첨 계산 어플이 당첨 번호를 저장함으로써 왕의 요청에 응답함
    • 누군가가 모자 장수에게 당첨 결과 확인해보라고 요청함으로써 로또 결과 확인이 시작됨 (in 모자 장수의 집)
      • 모자 장수로또 당첨 계산 어플에게 본인의 로또 번호를 저장할 것을 요청함
        • 로또 당첨 계산 어플이 모자 장수의 로또 번호들을 저장함으로써 모자 장수의 요청에 응답함
      • 모자 장수가 로또 당첨 계산 어플에게 당첨 통계를 계산할 것을 요청함
        • 로또 당첨 계산 어플이 당첨 통계를 계산해 출력함으로써 모자 장수의 요청에 응답함
  • 책임 : 하는 것(요청, 계산)과 아는 것
    • 판매원
      • 하는 것 : 모자 장수에게 구매할 로또 개수 말하도록 요청, 로또 발행 기계에게 로또 발행하도록 요청, 모자 장수에게 발행한 로또 가져가서 소유할 것을 요청
    • 로또 발행 기계
      • 하는 것 : 로또 번호를 자동으로 뽑아 로또 발행(생성)
    • 모자 장수
      • 하는 것 : 로또 당첨 계산 어플에게 로또 번호들 저장하도록 요청, 로또 당첨 계산 어플에게 당첨 통계 계산하도록 요청
      • 아는 것 : 구매할 로또 개수, 발행된 로또
      • 하는 것 : 로또 당첨 계산 어플에게 당첨 번호 저장하도록 요청
      • 아는 것 : 당첨 번호
    • 로또 당첨 계산 어플
      • 하는 것 : 모자 장수가 구매한 로또들과 당첨 번호 비교해 당첨 규칙대로 당첨 통계를 계산
      • 아는 것 : 모자 장수의 로또, 당첨 번호, 당첨 규칙
  • 역할 : 책임의 집합 (재사용성)
    • 판매원 → 로또 판매자 (LottoSeller)
    • 모자 장수 → 로또 구매자 (LottoBuyer)
    • 로또 발행 기계 → 로또 발행기 (LottoGenerator)
      • 로또 (Lotto)
    • 왕 + 로또 당첨 계산 어플 → 로또 당첨 결과 분석기 (LottoWinningAnalyzer)
      • 당첨 번호 (WinningNumbers)
      • 당첨 규칙 (WinningRule)
 

Today in 프리코스

TIL 작성하기
몰입
이번주에 적용해 볼 설계 방법 고민하기
설계 구상하기 (객체지향적으로 생각해보기)
 
🍀
1일차_둘러보기, 환경설정하기
Oct 19, 2023
DIARY_DEVELOP
🍀
2일차_컨벤션 정리하기
Oct 20, 2023
DIARY_DEVELOP
🍀
3일차_설계에 대해 고민하기
Oct 21, 2023
DIARY_DEVELOP
🍀
4,5일차_MVC 온전히 이해하기
Oct 22, 2023
DIARY_DEVELOP
🍀
6일차_설계를 코드로 구현하기
Oct 24, 2023
DIARY_DEVELOP
🍀
7일차_리팩토링과 마무리하기
Oct 25, 2023
DIARY_DEVELOP
🍀
8,9일차_코드 리뷰 통해 객체지향에 다가가기
Oct 27, 2023
DIARY_DEVELOP
🍀
10일차_지난 과제 돌아보며 객체지향 이해하기, 의존성과 설계의 관계 맛보기
Oct 28, 2023
DIARY_DEVELOP
🍀
11일차_객체지향을 미션 설계에 적용하기(with [책] 객체 지향의 사실과 오해)
Oct 29, 2023
DIARY_DEVELOP
🍀
12일차_기능 별로 구현하며 단위 테스트의 필요성 느끼기 (with [책]자바와 JUnit을 활용한 실용주의 단위 테스트)
Oct 30, 2023
DIARY_DEVELOP
🍀
13,14일차_일급 컬렉션과 레코드 적용해 리팩토링하기
Oct 31, 2023
DIARY_DEVELOP
🍀
15, 16일차_코드 리뷰를 통해 성장하기(1)_다른 사람의 코드 읽으면 배운 것 정리
Nov 2, 2023
DIARY_DEVELOP
🍀
17일차_코드 리뷰를 통해 성장하기(2)_내 코드 개선하며 배운 것 정리
Nov 4, 2023
DIARY_DEVELOP
🍀
18일차_내가 찾은 설계 방법 공유하기, 공유에 대해 고민하기
Nov 5, 2023
DIARY_DEVELOP
🍀
19일차_지난 과제 피드백 고려해 설계하기
Nov 6, 2023
DIARY_DEVELOP
🍀
20, 21일차_일단 돌아가는 코드를 만들기
Nov 7, 2023
DIARY_DEVELOP
🍀
22일차_현재 도움이 될 것 생각하기 (디자인패턴과 mvc2 과감히 패스)
Nov 9, 2023
DIARY_DEVELOP
🍀
23일차_코드리뷰하기 (feat. converter 파고들기)
Nov 10, 2023
DIARY_DEVELOP
🍀
24일차_기획을 문서화하기
Nov 11, 2023
DIARY_DEVELOP
🍀
25일차_설계하며 고민하기
Nov 12, 2023
DIARY_DEVELOP
🍀
26, 27일차_구현하며 고민하기
Nov 13, 2023
DIARY_DEVELOP