본문 바로가기

우아한테크코스/코드 리뷰

블랙잭 2

코로나19 때문에 집에서 공부를 하다가 7주차 부터는 집에서 벗어나 우아한 테크코스 교육장에 가게되었다.

교육장에 오랜만에 간 첫 날 오전 강의가 끝나고 아버지가 다치셨다는 전화를 받았다.

아버지옆에 간호할 사람이 필수로 있어야했고 오랜만에 간 교육장을 뒤로하고 병원에서 7주차의 대부분을 보내게 되었다.

변명은 아니지만.., 이런 이유로 7주차는 미션도 힘겹게 마무리했다.


7주차에는 6주차에서 하던 블랙잭 미션의 2단계 미션을 진행했다.

6주차에서는 승 / 패로 게임 결과를 표시했다면 7주차 2단계에서는 플레이어들이 배팅을 하고 배팅 결과로 게임 결과를 표시하도록 요구사항이 변경된 미션이다.


배팅한 순간 Money는 User의 손을 떠나기 때문에 Money는 User의 소유가 아니라고 생각했었다. 그래서 Map<Money, User>를 가지고있는 일급컬렉션 객체를 따로 만들어서 관련 로직들을 처리했었다.

위와 같은 리뷰를 받고 나의 생각이 잘못됐다는 걸 깨달을 수 있었다.

User가 Money를 갖게하고 관련 로직들을 수정하니 훨씬 코드들이 깔끔해지고 가독성도 좋아졌다. 현실 세계에 맞춰서 객체를 설계하는 것도 중요하지만, 역할과 책임을 다시 한번 생각해보며 구조를 잡는 연습을 해야겠다.


이번 블랙잭 미션은 draw하고 카드 목록을 출력하는 등 게임 진행 사이사이에 출력을 해줘야했다.

UI 로직과 비즈니스 로직을 분리하기 위해서 UI 로직이 필요한 기능들을 한곳에 모아서 구현하다보니 클래스가 너무 커지는 것을 느꼈다.

분리를 하려고 노력해봐도 UI 관련 로직들 때문에 분리를 할 수 없었다. 힌트를 얻기 위해 다른 크루들이 받은 리뷰를 훑어보다 관련된 리뷰보고 힌트를 얻을 수 있었다.

public class Players {
    private List<Player> players;

    public Players(List<Player> player) {
        this.players = new ArrayList<>(players)
    }
    public void draw(CardDeck cardDeck) {
        for (Player player : players) {
            players.drawCard(cardDeck.devide());
            OutputView.printPlyaerCard(player);
        }
    }
}

Player들의 List를 가지고 있는 일급컬렉션 객체 Players가 있다.

Players 클래스의 draw메소드는 UI로직과 비즈니스 로직을 분리하지 못했다. 비즈니스로직에서 UI로직인 OutputView의 printPlayerCard메소드를 호출하기 때문이다.

하지만 다음과 같이 구현한다면 UI 로직과 비즈니스 로직은 분리가 된 것이다.

public class Players {
    private List<Player> players;

    public Players(List<Player> player) {
        this.players = new ArrayList<>(players)
    }
    public void draw(CardDeck cardDeck, Consumer<Player> printer) {
        for (Player player : players) {
            players.drawCard(cardDeck.devide());
            printer.accept(player);
        }
    }
}
Players players = PlayersFactory.create();
CardDeck cardDeck = new CardDeck();
players.draw(cardDeck, OutputView::printPlayerCard);

draw 메소드에서는 함수형 인터페이스인 Consumer를 파라미터로 받고 accept로 그걸 실행했을 뿐이다. 때문에 UI 로직과 비즈니스 로직은 엄연히 분리된 것이다.

확실히 위와 같은 방법을 사용하면 UI 로직과 비즈니스 로직을 분리하면서 클래스를 효과적으로 분리할 수 있을 것이다.

물론 자주 사용하는 방법은 아니지만 이러한 방식의 접근법도 있다는 것을 배울 수 있었다.


이번 주에는 개인적인 공부는 많이 하지 못했다. 이런 저런일이 많았지만 결론적으로 아버지가 건강하셔서 다행이다.

일주일 입원 후 정밀 검사를 통과하시고 퇴원까지 하셨다. 역시 가장 중요한 것은 나의 건강함, 주변인들의 건강함 속에서오는 마음의 평화란걸 다시 한번 느꼈다.

'우아한테크코스 > 코드 리뷰' 카테고리의 다른 글

체스 게임 2  (0) 2020.04.25
체스 게임 1  (2) 2020.04.17
블랙잭 1  (0) 2020.03.18
로또 게임 2  (0) 2020.03.02
로또 게임 1  (0) 2020.02.26