Skip to content
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

[블랙잭 게임 미션] 김지혜 1단계 리퀘스트 #1

Open
wants to merge 11 commits into
base: Revivekirin
Choose a base branch
from

Conversation

Revivekirin
Copy link

@Revivekirin Revivekirin commented Jan 27, 2024

1단계의 첫번째 시안입니다. 수정이 필요합니다.

  1. DecideResult.java에서 승과 패를 결정하고 이를 참여자마다 개별적으로 출력하게 하는 프로그램이 필요합니다.
  2. 현재 participant는 모두 입력만으로 추가됩니다. 항상 존재하는 딜러를 만들고 딜러를 고려하여 승패 결정을 출력하게 해야 합니다.
  3. Between16And21.java에서 16과 21의 숫자가 반복될 경우 반복하여 질문할 수 있는 루트를 만들어야 합니다.
  4. 코드를 객체지향적으로 분리해야 합니다.
  5. 전체적으로 예외처리가 부족합니다.
  6. challenge: 테스트 코드를 작성해야 합니다.

@Revivekirin Revivekirin changed the title 1번째 리퀘스트 [김지혜] 1단계 리퀘스트 Jan 27, 2024
@Revivekirin Revivekirin changed the title [김지혜] 1단계 리퀘스트 [블랙잭 게임 미션] 김지혜 1단계 리퀘스트 Jan 28, 2024
@Revivekirin
Copy link
Author

DecideResult.java에서 아래 사항 필요

  1. Calculate "딜러" ParticipantState.printsum()
  2. Compare each participant's sum value with dealer

Copy link
Contributor

@BGuga BGuga left a comment

Choose a reason for hiding this comment

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

안녕하세요 지혜님!!
현재 DecideResult에 return 값이 없어서 컴파일이 되지 않는군요 😂
이번 미션에서는 1단계만 진행해도 좋으니 아래 요구사항 들을 우선적으로 반영해주세요!!
현재 코드에 대한 몇가지 리뷰는 남겼지만 무엇보다 객체지향적으로 기능을 완성시키는 것이 중요하기 때문에 자세한 리뷰는 먼저 기능을 완성한 후에 이야기 나눠보도록 하겠습니다!!

우선순위 높음

  1. 1단계 기능 요구사항 만족
  2. InputView, OutputView 분리
  3. 적절한 객체 생성(Player, Dealer, BlackjackGame)과 메서드 할당

우선순위 중간

  1. mvc 패턴 학습 후 적용
  2. 테스트 코드 추가

src/main/java/blackjack/DecideResult.java Outdated Show resolved Hide resolved
Comment on lines 8 to 10
public static class ParticipantState {
private int sum;
private List<String> cardlist;
Copy link
Contributor

Choose a reason for hiding this comment

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

내부 class를 사용해주셨군요!
저만의 내부 class 사용 기준을 공유드리자면

내부 클래스 어떻게 쓰는가?
내부 클래스는 크게 non-static, static으로 선언할 수 있습니다.
다만 non-static class는 메모리 누수를 발생시킬 수 있어서 외부 클래스(내부 클래스가 정의된 클래스)에서 사용되는 상황에만 사용합니다. 참고 글

내부 클래스 언제 쓰는가?
사실 내부 클래스 자체를 거의 사용하지 않지만 사용한다면
non-static 클래스의 경우
외부 클래스(내부 클래스가 정의된 클래스)에서만 사용하는 interface 구현체가 있다면
어차피 항상 같이 사라지거나 변경되고 외부 클래스만 사용하기 때문에 내부 class를 사용합니다.
static 클래스의 경우
외부 클래스에 대한 converter 같은 객체를 정의할 때 사용합니다.
non-static 클래스와의 차이는 외부 클래스가 아닌 다른 class에서 접근이 가능하다는 점입니다.

앞서 말했듯이 저는 inner class를 대부분 사용하지 않습니다.
내부 class는 응집도를 높혀주지만 class 파악이 힘들어지기 때문이죠 ㅎㅎ
그렇기 때문에 위와 같이 converter 혹은 내부에서만 사용되는 interface 구현체에만 사용합니다!
이 기준은 추후에 바뀔 수 있으나 지금 단계에서는 객체로 온전히 분리해서 구현해주셔도 좋을 것 같습니다 ㅎㅎ

Comment on lines 15 to 45
public static void main(String[] args) {
Map<String, List<Integer>> Cards = CardDictionary.createCardDictionary();

List<String> Dealer = Arrays.asList("딜러");
List<String> participants = getInput("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)", s -> Arrays.asList(s.split(",")));
ParticipantSize(participants); //예외 처리

Collections.shuffle(participants);

Map<String, CardGameSimulator.ParticipantState> participantStates = CardGameSimulator.simulateCardGame(participants, Cards);
Map<String, CardGameSimulator.ParticipantState> dealerState = CardGameSimulator.simulateCardGame(Dealer, Cards);

for (String participant : participants) {
for (Map.Entry<String, CardGameSimulator.ParticipantState> entry : participantStates.entrySet()) {
Between16And21.SumBetween16And21(participant, entry, Cards);
}
}


for (Map.Entry<String, CardGameSimulator.ParticipantState> entry : dealerState.entrySet()) {
Between16And21.DealerBetween16And21(Dealer.get(0), entry, Cards);
}


for (String participant : participants) {
for (Map.Entry<String, CardGameSimulator.ParticipantState> entry : participantStates.entrySet()) {
DecideResult.CompareWithDealer();
}

}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

main 메서드가 static이기 때문에 다른 메서드들도 대부분 static 으로 작성된 것 같군요!!
이에 관련해서 팁을 드리자면
BlackJackGame이란 객체를 만들고 main 에서는

BlackJackGame blackJackGame = new BlackJaclGame(...)
backjackGame.startGame()

을 main에서 호출하는 것으로 변경하면 static method를 줄일 수 있을 겁니다!!

import java.util.Map;
import java.util.Scanner;

public class Between16And21 {
Copy link
Contributor

Choose a reason for hiding this comment

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

객체지향은 현실에 있을 법한 네이밍을 가진 객체에서 적절한 책임을 분배하는 것이 중요합니다.
그래서 내부에 정의된 메서드들을 Player, Delear라는 객체로 만들고
canReceiveCard 과 같은 메서드들을 통해 대체하도록 만드는 것이 좋아보입니다!
딜러가 카드를 받을 수 있는 규칙을 딜러가 정의한다면 적절한 책임 분배라 볼 수 있겠죠?

@Revivekirin
Copy link
Author

Revivekirin commented Jan 30, 2024 via email

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.

2 participants