-
Notifications
You must be signed in to change notification settings - Fork 467
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[2단계 - 블랙잭 베팅] 피글렛(김은수) 미션 제출합니다. #874
base: rladmstn
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
피글렛 안녕하세요.
2단계 전체적으로 잘 구현해주셨네요
질문주신 내용과 몇 가지 코멘트 남겼습니다.
확인해주세요 :)
public void increase(int increaseAmount) { | ||
amount += increaseAmount; | ||
} | ||
|
||
public void decrease(int decreaseAmount) { | ||
amount -= decreaseAmount; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
public void increase(int increaseAmount) { | |
amount += increaseAmount; | |
} | |
public void decrease(int decreaseAmount) { | |
amount -= decreaseAmount; | |
} | |
public void increase(int increaseAmount) { | |
this.amount += increaseAmount; | |
} | |
public void decrease(int decreaseAmount) { | |
this.amount -= decreaseAmount; | |
} |
this 키워드를 추가할 수 있을 것 같아요
boolean isPlayerBust = player.isBust(); | ||
boolean isDealerBust = dealer.isBust(); | ||
boolean isPlayerBlackjack = player.isBlackjack(); | ||
boolean isDealerBlackjack = dealer.isBlackjack(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
플레이어가 직접 판단하는 로직으로 변경되었네요 🚀
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
마지막 줄에 개행이 없네요 :)
Google Java Style Guide 규칙 중 모든 소스 파일은 빈 줄로 끝나야 합니다~
인텔리제이에 적용해봅시다 :)
|
||
@Test | ||
void 플레이어들_중_블랙잭인_플레이어에_대해_금액을_업데이트한다() { | ||
// given | ||
Player winner = Player.of("pobi1", Money.of(1000)); | ||
Player player = Player.of("pobi2", Money.of(1000)); | ||
Players players = Players.of(List.of(winner, player)); | ||
|
||
winner.receive(Card.of(TrumpNumber.ACE, TrumpShape.SPADE)); | ||
winner.receive(Card.of(TrumpNumber.JACK, TrumpShape.SPADE)); | ||
player.receive(Card.of(TrumpNumber.FIVE, TrumpShape.DIAMOND)); | ||
player.receive(Card.of(TrumpNumber.SIX, TrumpShape.DIAMOND)); | ||
|
||
Dealer dealer = Dealer.of(CardDeck.of()); | ||
dealer.receive(Card.of(TrumpNumber.FIVE, TrumpShape.DIAMOND)); | ||
dealer.receive(Card.of(TrumpNumber.SEVEN, TrumpShape.SPADE)); | ||
|
||
// when | ||
players.judgeBlackjack(dealer); | ||
|
||
// then | ||
Assertions.assertAll(() -> { | ||
assertThat(winner.getTotalWinnings()).isEqualTo(1500); | ||
assertThat(dealer.getTotalWinnings()).isEqualTo(-1500); | ||
}); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여러 테스트 케이스를 꼼꼼히 작성해 주셨네요~
### 공통 | ||
|
||
- [x] 잘못된 입력 시, 예외를 발생하고 프로그램을 종료한다. | ||
|
||
### 사용자 입력 받기 | ||
|
||
- [x] 게임에 참여할 사람의 이름을 입력 받는다. | ||
- 쉼표 기준으로 입력을 받는다. | ||
- 5명을 초과할 시, 예외를 발생하고 프로그램을 종료한다. | ||
- [x] 쉼표 기준으로 입력을 받는다. | ||
- [x] 5명 이하의 이름을 입력 받는다. | ||
- [x] 각 플레이어 별 베팅 금액을 입력 받는다. | ||
- [x] 21억을 넘지 않는 숫자를 입력 받는다. | ||
|
||
### 기본 카드 나눠주기 | ||
|
||
- [x] 플레이어부터 카드를 한 장씩 2 사이클 나눠준다. | ||
- [x] 플레이어가 가진 2장의 카드 합이 21일 경우, 베팅 금액의 1.5배를 딜러에게 받는다. | ||
- [x] 딜러의 2번 째 카드는 비공개한다. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요구사항 작성 👍
import view.InputView; | ||
import view.OutputView; | ||
|
||
public class Game { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
클래스 명이 단순 Game
이네요
이 클래스는 어떤 역할을 수행할 지 코드를 보기 전까지 알기 어려운 것 같아요
[MVC의 적합성] 이번 블랙잭 미션에서 이렇게 MVC를 사용하지 않았을 때의 단점은 무엇인가요? 제로는 무엇이 단점이 될 것이라 생각하시는지 궁금합니다
이게 과연 MVC의 Controller가 가져도 되는 로직일까?’ 라는 의문에 공감됩니다.
서비스 계층을 통해 모델을 조작하는 비즈니스 로직을 수행토록 하는 것이 일반적이기도 한데요, 이번 블랙잭 미션에서는 서비스 계층이 존재하지 않으므로, 컨트롤러가 직접 모델과 상호작용하는 구조로 진행이 되었고 다시 이렇게 수정하게 된 것 같아요.
다만 지금 Game
클래스가 사실상 서비스 계층의 역할을 수행하고 있는 것으로 보이네요. 이러한 동작을 하는 클래스가 BlackjackApplication
클래스와 동등하게 존재하는 것도 어색한 것 같아요.
저라면 BlackjackService
를 추가하고 도메인 객체 또한 책임을 강화하도록 수정을 고려해볼 것 같아요. 또한 이번 미션이 MVC 모델을 사용하는 것이기에 BlackjackController의 삭제는 고려해볼 것 같아요. (이번 미션 단계에서 Service 계층을 사용할 지에 대한 고민도 할 것 같아요. 고민과 결정은 피글렛이 결정해서 수정해볼까요?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Application과 Game의 차이
DI가 어려워지면 테스트도 어려워질 것 같아요. Application만 사용하면 단순하지만 유지보수성이 떨어질 것 같고, 위의 답변과 중복되는 내용이 있을 것 같아요 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 확장성 고려 수준
저 또한 개발할 때 고민되고 어려운 점이라고 생각되는데요!
요구사항을 만족하는 것이 우선되나 추가 요구사항이 생길 가능성이 있는 곳은 신경써서 고려할 것 같아요.
블랙잭
이라는 기본 규칙에 변할 가능성이 적다면 너무 유연하게 만들 필요는 없다고 생각해요 :)
안녕하세요 제로!
step2를 진행하며 고민하고 궁금했던 사항들 PR 본문에 올려두었습니다!
이번에는 코드 자체의 고민보단 미션을 진행하면서 궁금했던 설계 사항에서 고민이 많았던 것 같습니다.
피드백 해주셔서 감사합니다 :)
체크 리스트
test
를 실행했을 때, 모든 테스트가 정상적으로 통과했나요?객체지향 생활체조 요구사항을 얼마나 잘 충족했다고 생각하시나요?
1~5점 중에서 선택해주세요.
선택한 점수의 이유를 적어주세요.
프로그램의 큰 틀 구조가 변경되면서, 객체 별 역할이 정확하게 지켜진 것인지 판단이 모호합니다.
어떤 부분에 집중하여 리뷰해야 할까요?
1. MVC의 적합성
이번 블랙잭 미션의 step1까지는 MVC 패턴으로 진행했었는데요, 최근 크루들과 함께 플레이어의 hit 여부로 카드를 다시 받는 것을 구현하는 사항에 대해, ‘이게 과연 MVC의 Controller가 가져도 되는 로직일까?’ 라는 의문을 갖기 시작했습니다. 전통적인 MVC에서 Controller는 비즈니스 로직 없이 오로지 View와 Model 사이 중간자 역할만 해야 한다고 생각했습니다. 하지만, 위에서 언급한 y/n 입력 받는 로직은 InputView와 Model 간 불가피하게 양방향 상호작용이 필요합니다.
이러한 사고 과정의 흐름에 따라, 결국 위처럼 지속적인 InputView와 Model 간 양방향 상호작용이 필요하다면 과연 MVC 패턴이 이번 블랙잭 미션에 적합 했을지 알고싶어졌습니다.
보통의 MVC는 자주 변경되는 View와 중요한 데이터를 갖는 Model 간 의존성을 제거하기 위해 사용된다고 알고있습니다. 아직 View가 자주 변경된다는 사항에 대해 체감을 못하고 있어서 이번 step2의 제 구현에 대한 문제점을 명확히 인지하지 못하겠습니다.
물론 이번 미션에서 배워 가길 바라는 핵심 내용은 디자인 패턴이 아니겠지만, 크루들과 토론해보다가 제로의 의견이 정말 궁금해져서 이렇게 질문 남깁니다..! 이번 블랙잭 미션에서 이렇게 MVC를 사용하지 않았을 때의 단점은 무엇인가요? 제로는 무엇이 단점이 될 것이라 생각하시는지 궁금합니다!
2. Application과 Game의 차이
1번과 연장된 질문입니다! 그렇다면 Application에 현재의 Game 로직을 직접 갖게 만들었을 경우의 장단점이 무엇일지 궁금합니다! 제가 생각하는 장점은 Game이라는 클래스가 더 필요 없게 되리라 생각합니다. 이에 반해 단점은 View가 또 다른 View로 변경되는 것이 DI로 해결할 수 없다는 것이라고 생각했습니다. (InputView와 outputView를 Application에서 static으로 갖고 있을 경우로 가정합니다.) 제로가 보기에는 현재 Game의 로직이 Application단으로 옮겨진다면 이 때의 장/단점이 무엇이 되리라 생각하시는지도 알고싶습니다!
3. 확장성 고려 수준
미션을 진행하는 동안 크루들과 토론해보면, 항상 확장성은 빼놓을 수 없는 주제였던 것 같습니다. 현재 주어진 미션에 핏한 구현을 해야할지, 아니면 정말 이 프로그램에 대해 나중에 기능이 추가되거나 view가 변경되는 등의 확장성까지 고려하며 구현해야할지 기준점을 잘 모르겠습니다. 이러다보니 확장성과 오버 엔지니어링의 기준이 모호하다는 생각이 듭니다. 레벨 1의 미션에서는 확장성을 어느정도로 고려를 해야할지 기준 잡는게 어려워서, 확장성을 고려하는 기준을 잡는 방법에 대해 제로의 의견을 들어보고 싶습니다!