Skip to content
Open
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
dc2a806
[1단계 - 블랙잭 게임 실행] 누누(송은우) 미션 제출합니다. (#456)
be-student Mar 7, 2023
aaf1160
fix: 안 지워진 파일 제거
be-student Mar 8, 2023
86d3127
refactor: 도메인 객체에 이름을 주는 방식으로 view에 strategy 제거
be-student Mar 9, 2023
9bd63e2
refactor: response 객체 대신 Collection 을 넘기는 것으로 수정
be-student Mar 9, 2023
092f1ab
refactor: blackJackRule 을 외부에서 주입받도록 수정
be-student Mar 9, 2023
bdd40b3
refactor: 서비스에서 변환을 해주는 역할 제거
be-student Mar 9, 2023
2931e75
feat: 점수 계산 캐싱 적용
be-student Mar 9, 2023
3c963fe
feat: resultType enum 으로 반대 결과 가져오는 메서드 정의
be-student Mar 9, 2023
886d8ae
feat: 베팅 금액 입력 받는 기능 추가
be-student Mar 9, 2023
acaf20f
feat: 출력 방식 지정
be-student Mar 9, 2023
adc2c80
feat: 카드 포켓에 블랙잭인지 확인 기능 추가
be-student Mar 9, 2023
36eb098
feat: 각각의 playerProfit 데이터 추가
be-student Mar 9, 2023
6e00bc0
feat: 블랙잭인 경우에 따라서 수익 반환해주는 기능 추가
be-student Mar 9, 2023
077a5d4
feat: rename hasBlackJack 으로 메서드 변경
be-student Mar 9, 2023
2547f72
docs: 질문 정리
be-student Mar 9, 2023
be4591d
chore: 안 쓰이는 코드 제거
be-student Mar 9, 2023
f14ba4e
refactor: 블랙잭 게임 승패 출력이 없어지면서 필요없어진 코드 제거
be-student Mar 9, 2023
7be4015
chore: 줄바꿈 변경
be-student Mar 9, 2023
b7f060a
refactor: 카드 포켓에 점수를 저장하는 기능 추가
be-student Mar 9, 2023
6e3773c
feat: 대소문자 구분 안 하도록 변경
be-student Mar 9, 2023
618f993
docs: 질문 작성
be-student Mar 9, 2023
9a4e3ab
docs: 타이틀 작성
be-student Mar 9, 2023
27a8fed
refactor: 로직 리팩토링
be-student Mar 9, 2023
7a8079d
refactor: controller 대신 application 에서 작업을 하도록 변경
be-student Mar 11, 2023
fe7fb38
refactor: 현재 모든 예외는 입력에서 발생하기에, inputView 에서 예외 처리
be-student Mar 11, 2023
680486e
refactor: 캐싱 제거
be-student Mar 11, 2023
a6dd7ac
refactor: 이름 내부 변수 getValue 로 네이밍 변경
be-student Mar 11, 2023
7cc4e18
docs: 주석 제거
be-student Mar 11, 2023
35e55fb
refactor: 블랙잭 패키지 만들어서 이동
be-student Mar 11, 2023
0048059
feat: 플레이어가 갖고 있는 베팅 금액 추가
be-student Mar 11, 2023
359f18c
feat: 블랙잭 게임에 있던 점수 계산 기능을 players 로 옮김
be-student Mar 11, 2023
e3750dc
test: 빠진 displayGenerator 추가
be-student Mar 11, 2023
a6c01f0
feat: 이름을 검증하는 기능 추가
be-student Mar 11, 2023
0672801
refactor: cardResponse 를 도메인에서 직접 응답하도록 변경
be-student Mar 11, 2023
0fa0ba9
refactor: 카드를 주어진 형태로 주는 기능을 players로 이동
be-student Mar 11, 2023
e621337
docs: 안 쓰이는 주석 제거
be-student Mar 11, 2023
8feda99
test: cardFixture 을 통해 중복 제거
be-student Mar 11, 2023
ed4540b
refactor: blackJackRule 제거
be-student Mar 11, 2023
b4ddb0f
feat: player 에서 베팅 금액을 알고 있는 기능 추가
be-student Mar 11, 2023
5a18897
feat: 베팅 금액 검증 기능 추가
be-student Mar 11, 2023
5126cca
fix: names 테스트에서 Players 를 호출하고 있던 부분 수정
be-student Mar 11, 2023
dd80fd6
refactor: cardPocket 에서 바로 CardResponse 로 반환하도록 변경
be-student Mar 11, 2023
6559e0a
refactor: blackjackGame 제거
be-student Mar 11, 2023
30fad82
chore: 안 쓰이는 코드 제거
be-student Mar 11, 2023
21d84e0
refactor: card 대신 deck 을 통해 최초 draw 를 하도록 변경
be-student Mar 11, 2023
1dda7c0
refactor: deck 을 통해서 최초 카드를 draw 하도록 변경
be-student Mar 11, 2023
2914060
refactor: util 클래스에 있던 repeat 부분 main 으로 이동
be-student Mar 11, 2023
7d16dcf
refactor: 사용자를 기준으로 점수 계산 작업 추가
be-student Mar 11, 2023
805def5
fix: 계산 잘못 되고 있던 부분 수정
be-student Mar 11, 2023
f677e7e
refactor: 안 쓰이는 캐스팅 제거
be-student Mar 12, 2023
6df66b3
feat: 돈 입력시에도 반복하도록 변경
be-student Mar 12, 2023
948dea8
feat: 딜러의 첫 카드를 aggregate root 를 기준으로 조회하도록 변경
be-student Mar 12, 2023
1a1bef8
docs: 기능 목록 작성
be-student Mar 12, 2023
dbf6028
chore: 상수와, 필드 사이에 빈칸 추가
be-student Mar 12, 2023
87d1212
chore: 상수에 static keyword 추가
be-student Mar 12, 2023
68fa3ab
feat: inputOutput 에게 전달해주는 IOView 클래스 추가
be-student Mar 13, 2023
165c340
feat: controller, game 객체 추가
be-student Mar 13, 2023
28d1fb8
chore: 줄바꿈 수정
be-student Mar 13, 2023
40d04b2
feat: player정보를 저장하는 클래스 추가
be-student Mar 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,81 @@
## 우아한테크코스 코드리뷰

- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md)

```mermaid
---
title: 의존성그래프
---
graph TD
BlackJackGame --> Players
BlackJackGame --> Deck
BlackJackGame --> Dealer

Players --> Dealer
Dealer --> Player

Participant --> CardPocket
Dealer --> Participant
Player --> Participant

Players --> Player
Player --> Name
CardPocket --> Card

Deck --> Card
Card --> Shape
Card --> Symbol
```

# 기능구현 목록

## UI

1. 입력

- 참여할 사람을 입력한다
- List<String>으로 변환 및 반환한다
-

## 도메인

1. Deck
- [x] 카드를 생성한다
- [x] 총 52장
- [x] Shape마다 13장을 출력
- [x] 카드를 나눠준다

2. BlackJack
- 딜러와 플레이어에게 카드를 2장씩 나눠준다.
-- 카드를 나눠준다
3. Participant
- [x] 21 이상인지 확인하고
- [x] 21 이상이라면,
- [x] 블랙잭인지 확인한다 = 받을 수 없음
- [x] BURST인지 확인한다 = 받을 수 없음4
- [x] 현재 점수를 숫자 형태로 반환한다
- [x] 현재 카드를 반환한다
4. Player
- [x] 21 미만이면, 받을 수 있다는 boolean
5. Dealer
- [x] 16 이하이면, 받을 수 있따는 boolean
6. CardPocket
- [x] 카드의 Symbol 점수를 계산한다.(ScoreCalculator 역할)
- 카드반환 한다
- [x] 카드 계산 총합 반환
7. Shape
- [x] enum 형태로 하트, 스페이스, 클로버, 다이아를 저장한다
8. Symbol
- [x] a=1 2-9, j,q,k =10
- [x] value는 int 형으로 저장한다
9. Card
- [x] Shape와 Symbol을 저장하는 자료구조

10. Players
- [x] 플레이어 이름 중복
- [x] 플레이어 수 1명이상, 5명 이하
- [x] 플레이어에게 카드 나눠주기
- [x] 플레이어의 draw여부 알기
11. Name
- [x] isBlank 체크
- [x] 100자 이하 체크
14 changes: 14 additions & 0 deletions src/main/java/blackjack/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package blackjack;

import blackjack.controller.BlackJackController;
import blackjack.domain.card.ShuffledDeckFactory;
import blackjack.view.InputView;
import blackjack.view.OutputView;

public class Application {

public static void main(final String[] args) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

main 메소드가 길어서 전 안읽었는데 분리하는 것은 어때요? 분리 안한 이유가 궁금합니다

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
읽어주세요
#9 (comment)
여기서 볼 수 있는 것처럼 나름의 고민을 했는데, 그냥 분리 안 했어요

final BlackJackController blackJackController = new BlackJackController(new InputView(), new OutputView());
blackJackController.play(new ShuffledDeckFactory());
}
}
127 changes: 127 additions & 0 deletions src/main/java/blackjack/controller/BlackJackController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package blackjack.controller;

import static blackjack.controller.DomainConverter.convertCard;
import static blackjack.controller.DomainConverter.convertCards;
import static blackjack.controller.DomainConverter.convertPlayersCards;
import static blackjack.controller.DomainConverter.getPlayerCards;
import static blackjack.util.Repeater.repeatUntilNoException;

import blackjack.domain.BlackJackRuleImpl;
import blackjack.domain.card.DeckFactory;
import blackjack.service.BlackJackGame;
import blackjack.view.DrawCommand;
import blackjack.view.InputView;
import blackjack.view.OutputView;
import java.util.List;

public class BlackJackController {

private final InputView inputView;
private final OutputView outputView;

public BlackJackController(final InputView inputView, final OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

//이 메서드는 10라인도 훨씬 넘었고, 되게 복잡하게 되어있는데, 이렇게 두는 것이 좋은가요?
//원래대로 돌렸을 경우에, 훨씬 간단해보였던 것 같아요
// public void play(final DeckFactory deckFactory) {
// final BlackJackGame blackJackGame = repeatUntilNoException(
// () -> BlackJackGame.of(
// inputPlayerNames(),
// deckFactory,
// new BlackJackRuleImpl()),
// outputView::printError);
//
// for (final String playerName : blackJackGame.getPlayerNames()) {
// blackJackGame.addPlayerMoney(playerName, inputPlayerMoney(playerName));
// }
//
// blackJackGame.distributeInitialCard();
//
// outputView.printInitialCards(
// convertCard(blackJackGame.getDealerFirstCard()),
// getPlayerCards(blackJackGame.getPlayers()));
//
// for (final String playerName : blackJackGame.getPlayerNames()) {
// DrawCommand playerChoice = DrawCommand.DRAW;
// while (blackJackGame.isPlayerDrawable(playerName) && playerChoice != DrawCommand.STAY) {
// playerChoice = inputPlayerChoice(playerName);
// if (playerChoice == DrawCommand.DRAW) {
// blackJackGame.drawPlayerCard(playerName);
// }
// outputView.printCardStatusOfPlayer(playerName, convertCards(blackJackGame.getPlayerCards(playerName)));
// }
// }
//
// while (blackJackGame.isDealerDrawable()) {
// blackJackGame.drawDealerCard();
// outputView.printDealerCardDrawMessage();
// }
//
// outputView.printFinalStatusOfDealer(blackJackGame.getDealerScore(),
// convertCards(blackJackGame.getDealerCards()));
// outputView.printFinalStatusOfPlayers(convertPlayersCards(blackJackGame.getPlayersCards()),
// blackJackGame.getPlayersScores());
//
// outputView.printFinalMoney(blackJackGame.calculatePlayersMoney());
// }

//한 메서드가 너무 길어지는 느낌이 드는 것 같은데요 이것은 어떤가요?
public void play(final DeckFactory deckFactory) {
final BlackJackGame blackJackGame = repeatUntilNoException(
() -> BlackJackGame.of(
inputPlayerNames(),
deckFactory,
new BlackJackRuleImpl()),
outputView::printError);
for (final String playerName : blackJackGame.getPlayerNames()) {
blackJackGame.addPlayerMoney(playerName, inputPlayerMoney(playerName));
}

blackJackGame.distributeInitialCard();
outputView.printInitialCards(
convertCard(blackJackGame.getDealerFirstCard()),
getPlayerCards(blackJackGame.getPlayers()));

for (final String playerName : blackJackGame.getPlayerNames()) {
drawPlayerCard(blackJackGame, playerName);
}
while (blackJackGame.isDealerDrawable()) {
blackJackGame.drawDealerCard();
outputView.printDealerCardDrawMessage();
}

outputView.printFinalStatusOfDealer(blackJackGame.getDealerScore(),
convertCards(blackJackGame.getDealerCards()));
outputView.printFinalStatusOfPlayers(convertPlayersCards(blackJackGame.getPlayersCards()),
blackJackGame.getPlayersScores());
outputView.printFinalMoney(blackJackGame.calculatePlayersMoney());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

적절한 기능별로 메서드로 묶어서 추상화해보는 것은 어떨까요?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

리뷰어의 말을 듣고 이렇게 해보았는데요
적절한 단위로 묶어보는 것은 괜찮아 보이네요
조금 더 고민해볼게요

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

컨트롤러에서, private 메서드로 작업들을 하는데, 그 과정에서 blackjackGame 이 계속 인자로 넘어가다보니 가독성이 안좋은 것 같다는 말을 듣고, 이렇게 작업을 했었는데요
image
처음에는 이런 느낌이었어요
이때 여기서도 직접 blackJackGame 을 호출하도록 하라는 피드백을 받고 이 방향으로 바꿔보고 어떤 느낌이 날지를 확인해보려고 했었는데요
직접 해보고 가독성을 보고, 천천히 생각해보니 이정도까지는 괜찮아 보이기도 하네요 메서드 네이밍만 조금 더 신경쓰면 괜찮을 것 같아보이네요
controller 를 없애면서, main 문으로 옮기면서 줄이 더 늘어나면서 복잡해서 가독성이 너무 안좋아진다면 묶어볼 것 같고, 아니라면 안 묶어도 괜찮겠다는 생각이 들기도 하네요
이대로도 괜찮을 수도 있겠다는 생각이 드네요

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

확실히 blackjackGame이 게속 인자로 넘어가니 확실히 가독성이 안좋은 느낌이기도 하네
따라서 블랙잭 미션의 경우에는 필드에 있는 것도 괜찮다고 생각해!

확실히 메서드 네이밍에 신경쓴다면 읽는데 큰 문제가 없을 것 같은 느낌?
난 처음 것도 괜찮은 것 같아!

}

private void drawPlayerCard(final BlackJackGame blackJackGame, final String playerName) {
DrawCommand playerChoice = DrawCommand.DRAW;
while (blackJackGame.isPlayerDrawable(playerName) && playerChoice != DrawCommand.STAY) {
playerChoice = inputPlayerChoice(playerName);
if (playerChoice == DrawCommand.DRAW) {
blackJackGame.drawPlayerCard(playerName);
}
outputView.printCardStatusOfPlayer(playerName, convertCards(blackJackGame.getPlayerCards(playerName)));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

2depth 😢

@be-student be-student Mar 10, 2023

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

이것도 리뷰어가... blackJackGame 을 인자로 넘기지 않았으면 좋겠다는 말을 듣고 시작하게 되었는데요

if 문을 물론 메서드로 분리할 수는 있겠지만, 의미를 못 드러내는 것 같아서 그냥 이대로 두어보려고 해요

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

depth는 사실 연습을 위한 도구인 느낌이라 합당한 이유가 있다면 괜찮다고 생각해

}
}

private int inputPlayerMoney(final String playerName) {
return repeatUntilNoException(
() -> inputView.inputPlayerMoney(playerName), outputView::printError);
}

private DrawCommand inputPlayerChoice(final String playerName) {
return repeatUntilNoException(
() -> inputView.inputCommand(playerName), outputView::printError);
}

private List<String> inputPlayerNames() {
return inputView.inputPlayerNames();
}
}
54 changes: 54 additions & 0 deletions src/main/java/blackjack/controller/DomainConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package blackjack.controller;

import blackjack.domain.card.Card;
import blackjack.domain.participant.Players;
import blackjack.response.CardResponse;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

//이 클래스는 controller 의 역할이지만, controller 에다가 두면, 너무 많은 역할을 하게 되는 것 같아서 분리하였습니다
//이 클래스가 단순하게 유틸리티 비슷한 클래스인데, 이대로 괜찮을지 여쭤보고 싶어요

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

DTO로 변환시키는 것도 controller의 책임이라고 생각이 되는데
응집도를 생각했을 때, 해당 기능들을 controller에 위치시켜 보는 것은 어떨까?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

생각해보면, 지금은 도메인 객체를 그냥 내보냈는데, 사실 도메인 객체를 보호하기 위해서, 바로 안 내보낸다고 response를 내보내준다고 생각하면 response 객체를 blackjackGame 에서 바로 내보내도 괜찮을지도...?
아니면 도메인 객체를 바로 내보내는 방식으로 싹 갈아엎어봐도 괜찮을지도...?
고민이 계속 되네

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

그런 고민 좋은데요?

class DomainConverter {

private DomainConverter() {
}

static CardResponse convertCard(final Card card) {
return CardResponse.from(card);
}

static List<CardResponse> convertCards(final List<Card> cards) {
return cards.stream()
.map(CardResponse::from)
.collect(Collectors.toList());
}

static Map<String, List<CardResponse>> getPlayerCards(final Players players) {
final List<String> playerNames = players.getPlayerNames();
final Map<String, List<CardResponse>> playerCards = new HashMap<>();
for (final String playerName : playerNames) {
final List<CardResponse> cardResponses = players.findPlayerByName(playerName)
.getCards()
.stream()
.map(CardResponse::from)
.collect(Collectors.toList());
playerCards.put(playerName, cardResponses);
}
return playerCards;
}

static Map<String, List<CardResponse>> convertPlayersCards(final Map<String, List<Card>> playersCards) {
return playersCards.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream()
.map(CardResponse::from)
.collect(Collectors.toList()),
(oldValue, newValue) -> newValue,
LinkedHashMap::new
));
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

List에서 DTO로 변환시키는 부분이 중복되는 것 같아서 다음과 같이 개선할 수 있을 것 같아~
동작 될지는 모름..!

static Map<String, List<CardResponse>> getPlayerCards(final Players players) {
    return players.getPlayerNames.stream()
            .collect(toMap(
                    Function::identity,
                    name -> generateCardResponses(players.findPlayerByName(name).getCards())
            ));
}

static List<CardResponse> generateCardResponses(final List<Card> cards) {
    return cards.stream()
            .map(CardResponse::from)
            .collect(Collectors.toList());
}

static Map<String, List<CardResponse>> convertPlayersCards(final Map<String, List<Card>> playersCards) {
    return playersCards.keySet().stream()
            .collect(toMap(
                    Function.identity(),
                    name -> generateCardResponses(playersCards.get(name)),
                    (a, b) -> a,
                    LinkedHashMap::new
            ));
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

이거 고마워 바로 적용했어

}
9 changes: 9 additions & 0 deletions src/main/java/blackjack/domain/BlackJackRule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package blackjack.domain;

import blackjack.domain.participant.Dealer;
import blackjack.domain.participant.Player;

public interface BlackJackRule {

ResultType calculateDealerResult(Dealer dealer, Player player);
}
60 changes: 60 additions & 0 deletions src/main/java/blackjack/domain/BlackJackRuleImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package blackjack.domain;

import blackjack.domain.participant.Dealer;
import blackjack.domain.participant.Player;

/**
* 이 클래스가 룰이 자주 변경될 수 있기에, 인터페이스를 둔다는 점은 좋은데요
* <p>
* 사실상 한 클래스만 존재하는 상황에서, 이를 interface로 빼는 것은 별로 의미가 없을 수 있어보이는데, 어떻게 생각하시나요?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

인터페이스가 필요하지 않은 상황에서 사용하는 것은 별로라고 생각해!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

또한 규칙같은 경우는 변경이 많은 부분이기 때문에, interface로 분리한다면 확장성 있는 설계가 될 수 있을것 같습니다.

라는 피드백을 듣고 interface로 분리하고 작업을 해보았는데요
변경이 잦은 부분인 것은 맞지만, 분리 하고 나서도 새로운 규칙을 만든 것이 아니라, 기존 규칙을 직접 변경한 것을 봐서 interface가 큰 의미가 없어서 다음 리뷰때는 없앨 예정입니다
고마워요 허브

*/
public class BlackJackRuleImpl implements BlackJackRule {

private static final int BUST_POINT = 21;

@Override
public ResultType calculateDealerResult(final Dealer dealer, final Player player) {
//이 부분이 애매해서 리팩토링을 해보려고 했는데, 더 좋은 방법이 생각나지 않아서 일단 이렇게 구현했습니다.
//enum 클래스에 BiPredicate를 추가해서 구현해보려고 했는데, enum 클래스에 메서드를 추가하는 것이 맞는지 잘 모르겠습니다.
if (isBlackJackWin(dealer, player)) {
return ResultType.BLACKJACK_WIN;
}
if (isBlackJackLose(dealer, player)) {
return ResultType.BLACKJACK_LOSE;
}
final int dealerScore = dealer.currentScore();
final int playerScore = player.currentScore();
if (isTie(dealerScore, playerScore)) {
return ResultType.TIE;
}
if (isDealerWin(dealerScore, playerScore)) {
return ResultType.WIN;
}
return ResultType.LOSE;
}

private boolean isBlackJackWin(final Dealer dealer, final Player player) {
return dealer.hasBlackJack() && !player.hasBlackJack();
}

private boolean isBlackJackLose(final Dealer dealer, final Player player) {
return !dealer.hasBlackJack() && player.hasBlackJack();
}

private boolean isTie(final int dealerScore, final int playerScore) {
if (playerScore > BUST_POINT && dealerScore > BUST_POINT) {
return true;
}
return playerScore == dealerScore;
}

private boolean isDealerWin(final int dealerScore, final int playerScore) {
if (playerScore > BUST_POINT) {
return true;
}
if (dealerScore > BUST_POINT) {
return false;
}
return dealerScore > playerScore;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

딜러 기준으로 계산하는 것 같은데 (여기서는)딜러의 블랙잭 승은 의미없는 것 같아.
다음의 코드가 동작할 지 모르겠지만, 개선할 수 있을 것 같아

public ResultType calculateDealerResult(final Dealer dealer, final Player player) {
    if (dealer.hasBlackJack()) {
        return playWithBlackjack(player);
    }
    if (dealer.currentScore() > BUST_POINT) {
        return playWithBust(player);
    }
    return playWithScore(dealer, player);
}

private ResultType playWithBlackjack(final Player player) {
    if (player.hasBlackJack()) {
        return ResultType.TIE;
    }
    return ResultType.WIN
}

private ResultType playWithBust(final Player player) {
    if (player.currentScore() > BUST_POINT) {
        return ResultType.WIN;
    }
    if (player.hasBlackJack()) {
        return ResultType.BLACKJACK_LOSE;
    }
    return ResultType.LOSE;
}

private ResultType playWithScore(final Dealer dealer, final Player player) {
    if (player.hasBlackJack()) {
        return ResultType.BLACKJACK_LOSE;
    }
    if (player.currentScore() > BUST_POINT || dealer.currentScore() > player.currentScore()) {
        return ResultType.WIN;
    }
    return ResultType.LOSE;
}

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

일단 이렇게 바꿔봤는데

enum 쪽으로 이 메서드들을 넣어볼지 말지 고민해보아야 될 것 같긴 하네
되게 쉽지 않네

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

enum으로 넣는다.. 음.. 감이 안잡히네

}
}
46 changes: 46 additions & 0 deletions src/main/java/blackjack/domain/ResultType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package blackjack.domain;

public enum ResultType {
BLACKJACK_WIN(1.5) {
@Override
public ResultType getOppositeResult() {
return BLACKJACK_LOSE;
}
},
WIN(1) {
@Override
public ResultType getOppositeResult() {
return LOSE;
}
},
TIE(0) {
@Override
public ResultType getOppositeResult() {
return TIE;
}
},
LOSE(-1) {
@Override
public ResultType getOppositeResult() {
return WIN;
}
},
BLACKJACK_LOSE(-1) {
@Override
public ResultType getOppositeResult() {
return BLACKJACK_WIN;
}
};

private final double playerProfit;

ResultType(final double playerProfit) {
this.playerProfit = playerProfit;
}

public abstract ResultType getOppositeResult();

public double getPlayerProfit() {
return playerProfit;
}
}
Loading