[level1] 블랙잭 1단계

유콩·2022년 3월 17일
1

우아한테크코스

목록 보기
8/15

우아한테크코스 레벨1 미션인 블랙잭의 1단계 피드백 내용을 정리한다.

도메인 용어


처음 페어랑 개발을 할 때에는 중요하지 않은 부분에 시간을 쓰고 싶지 않아 네이밍에 신경을 못썼는데 피드백을 받았다. 개발하는 도메인을 파악하고 그에 맞는 용어를 사용하는 것이 다른 개발자가 코드를 읽고 내용을 파악하는데 도움을 줄 것이다. 해당 피드백을 받고 블랙잭 게임에서 사용하는 용어로 이름을 수정하였다.

처음 2장의 카드를 받음 : deal
추가로 카드를 한 장씩 받음 : draw(hit)

Stack vs Deque


CardDeck 의 자료구조를 ArrayList 로 사용하다가 매번 뽑아낸 카드의 값을 제거하는 것보다는 Stack 을 활용하는 것이 제거 비용을 줄일 수 있을 거라 생각해 Stack 을 사용했다. 그러다 Stack 의 문제점을 알게되고 Deque 로 수정하였다.

Stack 은 Vector 클래스를 상속받은 클래스 이다. Deque 는 Queue 인터페이스를 구현한 인터페이스 이다. Stack 은 모든 작업에 Lock 이 걸리기 때문에 성능 저하 이슈가 있어 자바 공식문서에서도 Deque 사용을 권장한다.

블로그 포스팅 - [Java] Stack 과 Queue, Deque

DTO


피드백은 상속에 관한 얘기였지만 잘못 이해해서 DTO 를 써봤다.(ㅋㅋ) 나름 만들어보기는 했으나 DTO 에 대해 찾아본 결과 잘못 사용하고 있는듯하다.

  • 비즈니스 로직 없어야 함
  • getter 와 setter 로만 이루어짐

아직까진 DTO 를 어떻게 만들어야 할지, 만들더라도 어떻게 활용해야 하는 것인지 잘 모르겠다....

함수형 인터페이스

Q. 컨트롤러를 어떻게 가볍게 할 수 있을까요?

A. 역할 분리

지난 번에는 함수형 인터페이스를 새로 생성하여 테스트에서 활용했었는데 이번에는 메소드 파라미터로 넘겨 도메인 내에서 실행해보았다.

이번 블랙잭 미션은 입력 -> 기능 수행 -> 결과 출력의 로직이 반복되었고 모든 것을 컨트롤러에서 해결하다보니 컨트롤러가 점점 비대해졌다. 컨트롤러의 역할을 줄이기 위해 반복적으로 이루어지는 과정 속에 뷰의 메소드를 도메인에서 함수형 인터페이스로 받아 도메인 내부에서 실행되도록 하였다.

1. 파라미터로 함수 전달

    private void bet(final Players players, final Profit profit) {
        players.bet(profit, OutputView::printBetting, InputConverter::createBetting);
    }

2. 파라미터로 함수형 인터페이스를 받아 함수를 변수처럼 사용

    public void bet(final Profit profit,
                    final Consumer<String> inputBetting, final Supplier<Betting> betting) {
        for (Player player : players) {
            player.bet(inputBetting);
            profit.bet(player, betting);
        }
    }

3. 도메인 내에서 실제 메소드 실행

    public void bet(final Consumer<String> inputBetting) {
        inputBetting.accept(name);
    }

미션을 진행할수록 점점 어려워진다. 특히나 이번 블랙잭 미션은 규칙을 정리하는 것부터가 어려웠다. 뭔가 새로 알게된 것들은 많은데 내가 제대로 활용못하고 있는것같아 아쉽다.

4개의 댓글

comment-user-thumbnail
2022년 3월 17일

유콩 안녕하세요~
정리 감사해요!

저도 이번 미션이 정말 어렵더라구요~
2단계 화이팅입니다!!

1개의 답글
comment-user-thumbnail
2022년 3월 17일

👍

1개의 답글