📜 제목으로 보기

Count VO 포장

줄어드는 횟수Count VO의 포장

미리 원시값도 줄어들 때 hasNext패턴을 만들어두었다.
  • 내 패턴으로는 0을 허용하면서 더 큰 n부터 줄어들되 0이 아닐때까지, 즉, 1까지도는 것이다.
public static List<Lotto> issueLottoByCount(int count) {
    final List<Lotto> lottos = new ArrayList<>();
    while (count != 0) {
        count -= 1;
        lottos.add(LottoFactory.issueLotto());
    }

    return lottos;
}
메서드에서부터 파라미터로 전해지도록 Count 포장 (포장은 테매 인자에서부터~ )
  • 이름은 도메인Count로 만들어야한다. 포장하는 순간, 대명사가 아니다.

    image-20220312003536372

  1. 포장하기

     public class LottoCount {
         private final int value;
        
         public LottoCount(final int value) {
             this.value = value;
         }
     }
    
VO는 equals/hC부터

image-20220312003656278

count VO는 0까지는 허용해주도록 검증을 만든다. (for while문에서 0까지 간 뒤 0에서 탈출시킴)
public LottoCount(final int value) {
    if (value < 0) {
        throw new IllegalArgumentException("0보다 작을 수 없습니다.");
    }
    this.value = value;
}
새기준메서드 새로 만들어, 기존메서드 위로 위치이동후, 내용복붙후, 처리

image-20220312003800304

image-20220312003812864

image-20220312003835351

image-20220312003858891

값자리에는 포장.getter()를 -> 연산이 할만하면 바로 메세지를

image-20220312003929036

image-20220312004010360

image-20220312004110748

값의 연산 -> 포장 안으로 잘라들고가서 this.값으로 연산
  1. getter지우고 메세지보내기 image-20220312004601305
    • 만약, 지우고 빨간메서드가 남아있다면 그대로 정의해도 된다.
    • 여기선 연산!=0이 남아있으니, 그에 맞는 의미있는 메서드를 지어준다. 0=Finish!= 아직 Not이냐 image-20220312004712286
    • 남은 연산을 잘라내서 -> 메서드만들고 -> 내부에서 this.값으로 잘라낸 연산 처리 image-20220312004815528 image-20220312004836272 image-20220312004844430
값의 재할당 -> VO에서는 연산만 들고 들어가면서 메서드를 만들고, 포장 = 는 그대로 둔다. -> 내부에서는this.값으로 연산한 뒤 =에 대해 새VO로 응답하는 [메세지]로 작성한다.
  1. -= 1을 포장 처리하려면

    • -1 을 내부로 들고 들어가서 this.값 -1으로 연산
    • =새 VO를 반환

    image-20220312005238446

    image-20220312005247506

  2. = 놓아두고, -1만 들고 들어가면서, 연산과 관련된 메서드명으로 메세지를 보낸다.

    image-20220312005409104image-20220312005445774

    image-20220312005609930

    image-20220312005630589

연산을 들고들어갔더라도 바깥에서는 포장변수 = 이 새 VO응답을 기다리고 있으므로 내부연산 결과를 포장해서 응답해준다.

image-20220312005715018

image-20220312005725788

  • final을 풀어 재할당 가능하게 해준다. image-20220312005808639
public static List<Lotto> issueLottoByCount(LottoCount lottoCount) {
    final List<Lotto> lottos = new ArrayList<>();
    while (lottoCount.isNotFinish()) {
        lottoCount = lottoCount.decrease();
        lottos.add(LottoFactory.issueLotto());
    }

    return lottos;
}
포장전 기존메서드가 사용중이면 찾아가서, 수정해준다.

image-20220312010317777

image-20220312010330740

  • count가 사용중인데, 일단 money.getCount()의 반환값도 원시count으로 바꿔준다.

      public int getCount() {
          return this.money / 1000;
      }
    

    image-20220312010436131

      public LottoCount getCount() {
          return new LottoCount(this.money / 1000);
      }
    
      public static List<Lotto> issueByMoney(final Money money) {
          final LottoCount count = money.getCount();
        
          return LottoFactory.issueLottoByCount(count);
      }
    
새 기준메서드 완성시, 포장검증을 메서드로 퉁치는 테스트(-1이하에서 에러)

image-20220312011115940

자체 도메인Test생성후 Count VO 검사
  • 0까지 허용하여 음수 생성자 에러
@Test
void create() {
    assertAll(
        () -> {
            assertDoesNotThrow(() -> new LottoCount(1));
            assertDoesNotThrow(() -> new LottoCount(0));
            assertThatThrownBy(() -> new LottoCount(-1));
        }
    );
}
  • 1개 뽑 + 감소된 것 뽑 -> 감소된 로직후 동일한지 비교
@Test
void decrease() {
    final LottoCount lottoCount = new LottoCount(1);
    final LottoCount expected = new LottoCount(0); // 감소된 것 미리 뽑기

    final LottoCount actual = lottoCount.decrease();

    assertThat(actual).isEqualTo(expected);
}