Skip to content

Conversation

sk11ingyuhwang
Copy link

@sk11ingyuhwang sk11ingyuhwang commented Feb 17, 2022

안녕하세요. 🙇‍♂️

이번 미션에서는 연료주입, 블랙잭에 대해 구현했습니다.

이번 미션에서 집중한 내용은 공통 기능에 대해서 인터페이스와 필요하다면 추상클래스를 적절히 묶어서 구현체로 구현 해 보았어요.

한일

연료주입 🚐

연료주입 에서는 추상 메서드를 하나 이상 가지고 있는 Car 클래스를 기반으로 K5, Sonata, Avante 를 만들어주었어요.

입력 값에 따라서 자동차 객체를 생성해줘야 하는 부분을 어떻게 구현해줘야 할지 고민이 많았어요.
이 부분은 페어와 의견을 공유해보면서 아래 of 메소드를 활용해 자동차 이름과, 거리를 입력 받으면 알맞은 자동차 객체를 반환하도록 만들어 보았어습니다.

public static Car of(final String rentCarName, final double distance) {
        return (Car) Objects.requireNonNull(Arrays.stream(values())
            .filter(car -> Objects.equals(car.rentCarName, rentCarName))
            .findAny().orElse(null)).apply(distance);
    }

블랙잭 🎴

블랙잭 에서는 공통 기능을 분류하는 작업을 우선 고민해보았어요.
어떤 부분이 필요할지 몰라 블랙잭을 우선 먼저 구현해보고 필요한 기능을 엮어보았습니다.

아래 6가지가 공통된 기능을 수행하고 있었어요.

interface

cards() :: Cards 객체 반환 한다.
addCard() :: Card 객체를 추가 한다.
getCards() :: List<Card> 객체 반환 한다.
getTotalScore() :: 카드 숫자의 총합을 반환 한다.

isEnd() :: 블랙잭 게임을 계속 할지 안할지 결정 한다.
judge() :: 블랙잭 게임에서 21을 넘기는지 검사 한다. 

위 interface 기능에서 관련된 것끼리 abstract으로 묶었어요.

abstract

CardAddibleSupport :: 딜러와 플레이어 소유한 Card 객체를 가지고 있다. 
`-- cards()
`-- addCard()
`-- getCards()
`-- getTotalScore() 

StateSupport :: 블랙잭에서 딜러와 플레이어가 Card 를 더 받을지 안받을지 판단한다. 
`-- isEnd() 
`-- judge() 

또, 인터페이스를 활용해보니 저수준 모듈에서 고수준 모듈을 의존하게끔 바꿈으로써 구현 변경 및 테스트 어려움을 해결할 수 있었어요.

질문

이 글 을 읽어보고 interface와 abstract을 활용했는데 블랙잭에 필요한 공통 기능을 잘 나누었는지 리뷰어님께 확인받고 싶어요.

객체간에 의존 관계가 깊어져서 getter() 를 여러번 타게 되는 경우가 많이 발생했어요. 불필요한 객체를 만든건 아닌지 무척 걱정이 됩니다. Winner 클래스에 Game 객체를 들고 있는것이 맞는지 확신이 안들어요. Winner 클래스의 역할을 Winner 를 가리기 위한 책임을 가지고 있는 클래스라고 생각했어요. 그래서 Game 을 함으로써 Winner를 보여준다. 는 행위를 수행하는 역할을 하게 되는데요. 이 부분에 대해서 리뷰어 님의 생각이 궁금해요. 🙇‍♂️

hyoenju and others added 30 commits February 11, 2022 16:02
- CarTest.java
- RentCarTest.java
@sk11ingyuhwang sk11ingyuhwang changed the title Step1 [황인규] 연료 주입, blackjack (Step1) Feb 17, 2022
Copy link

@joswlv joswlv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 인규님!
몇 가지 코멘트를 남겼습니다.
확인 부탁드립니다.

Comment on lines 13 to 20
static {
Arrays.stream(CardNumber.values()).forEach(
cardNumber -> Arrays.stream(CardPattern.values()).forEach(
cardPattern -> cards.add(new Card(cardNumber, cardPattern))
)
);
Collections.shuffle(cards);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 게임이 여러번 진행되면 문제가 발생할 것으로 예상됩니다.
덱보다 카드를 정적으로 생성해보는 것은 어떨까요?

Copy link
Author

@sk11ingyuhwang sk11ingyuhwang Feb 26, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

반영했습니다. :)
한가지 궁금증이 있습니다. 리뷰 중 게임이 여러번 진행되면 카드가 전부 소멸될 수 있기 때문에 문제가 발생되는것일까요?
코드를 변경하였는데 말씀하신 내용이 잘 반영되었는지 걱정이네요.
감사합니다.

import blackjack.domain.card.Cards;
import java.util.List;

public abstract class CardSupport implements Gameable {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

StageSupport는 불필요한 행위인 것 같습니다.
그리고 CarSupport -> Gameable를 통해서 어떤 것을 말하고 싶었나요?

카드 추가 유무는 행위자인 Person에 있는 게 더 적절해 보입니다.
카드보다는 게임 자체 상태를 추상화해 관리해 보면 어떨까요?

블랙잭에는 여러 게임 상태가 존재합니다.

  • bust
  • blackjack
  • stay
  • hit
    그리고 그런 게임 상태에 따라 게임 진행 여부를 판단하도록 구현해 보는 것이 어떨까요?

Copy link
Author

@sk11ingyuhwang sk11ingyuhwang Feb 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 맞습니다. 😭
블랙잭 게임에 대한 이해가 충분하지 못했던것 같아요. 🙇‍♂️
기존에 존재하던 CardSupport 와 Gameable 관계는 자주 사용하는 메소드를 분리하는 목적으로 만들었어요. 그러다 보니, 전혀 블랙잭 게임 룰을 반영하지 못헀던것 같아요.

현재는 CardSupport, StageSupport를 지우고 Gameable 에 staty, draw 를 두어 상태관리를 추가하였습니다.

Gameable stay();
Gameable draw();

그리고, 각 게임 상태를 클래스로 구현해서 만들어주었어요.
게임에 상태에 따라 알맞은 구현체를 호출하면서 블랙잭 게임에 대한 상태가 더 명확해졌다는것을 느낄 수 있었어요. 👍

| -- state
|     `-- Blackjack
|     `-- Bust 
|     `-- Hit
|     `-- Stay
|-- 

return false;
}

public int getTotalScoreOfPlayer(Player player) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Person에서 카드 추가 유무와 현재 카드 상태를 가지도록 수정해 보는 것은 어떨까요?

현실 세계에서는 참가자와 딜러 손으로 카드를 받고, 현재 카드 점수를 판단합니다.

.filter(targetScore -> sourceScore > targetScore).count()).intValue();
}

private int countLose(final int sourceScore, final List<Integer> targetScores) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

각 플레이어와 딜러의 경기 입니다.
아래의 경우 b는 1패를 기록 해야합니다.
스크린샷 2022-02-21 오후 10 42 19

}

public List<Integer> calculateDealerGameResult() {
int dealerScore = game.getDealer().getCards().cards().sumScore();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

질문주신 내용은 카드 점수의 상태를 CardSupport를 수정하시면 자연스럽게 해결 될 문제라고 생각합니다.

블랙잭 게임 역할을 하는 Game객체는 크게 다음과 같은 기능을 하면 될 것으로 생각합니다.

  • 카드 분배
  • Winner에게 참가자와 딜러의 카드점수 상태 전달
  • Winner에서 게임 결과 리턴받기

승패를 결정하는게 Winner의 역할이라고 생각합니다.

@sk11ingyuhwang
Copy link
Author

감사합니다. 리뷰어님!
말씀해주신 내용 깊이 생각해보고 코드 리뷰 반영하겠습니다.
좋은 하루 보내세요~! 🙇‍♂️

@sk11ingyuhwang
Copy link
Author

sk11ingyuhwang commented Feb 27, 2022

승완님 안녕하세요. 🙇‍♂️
슬랙으로 드렸던 토요일 자정내로 리뷰를 다 마치지 못해서, 일부 리뷰만 적용하고 코멘트를 추가했습니다.
학습 속도가 조금 더 빨랐으면 블랙잭까지 마무리 지을 수 있었을 텐데 무척 아쉬워요. 😱
나머지 리뷰도 잘 반영해서 디벨롭 하도록 하겠습니다.
좋은 리뷰 감사드립니다. 블랙잭에 대한 도메인 이해, 상태값에 대한 인터페이스 설계에 대해 충분히 학습하고 이해할 수 있는 시간이었어요.
주말 잘 보내세요~!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants