Skip to content

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] 이프 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1104

Open
jihwankim128 wants to merge 24 commits intowoowacourse:jihwankim128from
jihwankim128:step2
Open

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] 이프 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1104
jihwankim128 wants to merge 24 commits intowoowacourse:jihwankim128from
jihwankim128:step2

Conversation

@jihwankim128
Copy link

@jihwankim128 jihwankim128 commented Mar 13, 2026

μ„œλ‘ 

μ•ˆλ…•ν•˜μ„Έμš” μ œλ‚˜! 사이클 1에 이어 사이클 2 μ§„ν–‰ μ™„λ£Œν–ˆμŠ΅λ‹ˆλ‹€.
사이클 2λ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ½”λ“œμ— 정말 λ§Žμ€ λ³€ν™”κ°€ λ°œμƒν–ˆλ„€μš” 🀣

μš°μ„  리뷰 μš”κ΅¬ 사항을 μž‘μ„±ν•˜κΈ° μ „, μ œκ°€ μ˜λ„ν–ˆλ˜ λ°”λ₯Ό κ°„λž΅ν•˜κ²Œλ‚˜λ§ˆ μ „λ‹¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€!
사이클 2μ—μ„œ λ² νŒ… κΈ°λŠ₯이 μΆ”κ°€λ˜λ©΄μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ―Έλ² νŒ… λΈ”λž™μž­ 원할 μˆ˜λ„ μžˆλ‹€λŠ” μ „μ œλ₯Ό 두고 λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μΆ”κ°€λœ κΈ°λŠ₯은 λΈ”λž™μž­ 확인 κΈ°λŠ₯ μΆ”κ°€, λ² νŒ… κΈ°λŠ₯ μΆ”κ°€ 정도이고, κ·Έ μ™Έμ—λŠ” λͺ¨λ‘ λ¦¬νŒ©ν† λ§μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€!
μ œκ°€ μ›ν•œ 것은 GameMode(BlackJackApplication μ—μ„œ μˆ˜μ •)만 λ³€κ²½ν•˜λ©΄ λ―Έλ² νŒ… κΈ°λŠ₯으둜 μ „ν™˜λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
ν˜„μž¬ 희망사항은 좩쑱이 λμœΌλ‚˜ ꡬ쑰 상 λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” 뢀뢄이 많이 λŠκ»΄μ Έμ„œ ν”Όλ“œλ°±μ„ λ°›κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ πŸ”₯πŸ”₯
(μ‹œκ°„μ΄ λΆ€μ‘±ν•΄μ„œ 더 κ°œμ„ ν•˜μ§€ λͺ»ν•˜κ³ , μš°μ„ μ€ PR을 λ‚¨κΉλ‹ˆλ‹€... Step1μ—μ„œ λ°€λ¦° 것 λ•Œλ¬Έμ— Step2에 차질이 μƒκ²Όλ„€μš” γ… )

그리고 사이클 2인 만큼 λƒ‰μ •ν•˜κ²Œ ν”Όλ“œλ°±ν•΄μ£Όμ‹œλ©΄ 제 μ„±μž₯에 정말 큰 도움이 될 것 κ°™μ•„μš”!

체크 리슀트

  • λ―Έμ…˜μ˜ ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ κ΅¬ν˜„ν–ˆλ‚˜μš”?
  • Gradle testλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ, λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ μ •μƒμ μœΌλ‘œ ν†΅κ³Όν–ˆλ‚˜μš”?
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ‚˜μš”?

μ–΄λ–€ 뢀뢄에 μ§‘μ€‘ν•˜μ—¬ 리뷰해야 ν• κΉŒμš”?

1. Controller 뢄리 ꡬ쑰에 λŒ€ν•œ ν”Όλ“œλ°±

image

Betting, NonBetting은 μž…λ ₯λ°›λŠ” ν˜•μ‹κ³Ό 좜λ ₯ν•˜λŠ” ν˜•μ‹λΆ€ν„° λ‹¬λžκΈ° λ•Œλ¬Έμ— 각 각 Reader와 ResultReporter둜 ꡬ뢄 ν–ˆμŠ΅λ‹ˆλ‹€.
BettingPlayerReaderμ—μ„œλŠ” BettingPlayerλ₯Ό μƒμ„±ν•˜λ„λ‘ ν–ˆκ³ , NonBettingPlayerReaderμ—μ„œλŠ” NonBettingPlayerλ₯Ό μƒμ„±ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μ„€κ³„ν•œ μ΄μœ λŠ” 이미 κ΅¬ν˜„λœ 2κ°€μ§€ λͺ¨λ“œμ—μ„œ λͺ¨λ“œ 변경이 쉽도둝, GameModeμ—μ„œ toBettingMode(), toNonBettingMode()λ₯Ό 톡해 κ°„λ‹¨νžˆ κ²Œμž„μ„ λ³€κ²½ν•˜κΈ° μœ„ν•΄ μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€.

    public static GameMode toBettingMode() {
        return new GameMode(new BettingPlayerReader(), new BettingResultReporter());
    }

    public static GameMode toNonBettingMode() {
        return new GameMode(new NonBettingPlayerReader(), new NonBettingResultReporter());
    }

2. ISP 원칙 λ―Έμ€€μˆ˜μ—μ„œ λ°œμƒν•œ ꢁ금증

λ―Έλ² νŒ…, λ² νŒ…μ— λŒ€ν•œ ν”Œλ ˆμ΄μ–΄λ₯Ό κ΅¬λΆ„ν•˜λ €λ‹€ λ³΄λ‹ˆ NonBettingPlayer, BettingPlayer둜 κ΅¬λΆ„ν•˜κ²Œ λμŠ΅λ‹ˆλ‹€.
그리고 PlayerλΌλŠ” interface둜 μΆ”μƒν™”ν•΄μ„œ κ΄€λ¦¬ν–ˆλŠ”λ°, μ΄λŸ¬λ‹ˆ SOLID 쀑 ISPμ—μ„œ λ²—μ–΄λ‚œ 것 κ°™μŠ΅λ‹ˆλ‹€.

public interface Player {

    ...
    default Profit calculateProfit(ResultStatus resultStatus) {
        return ZERO;
    }
}

NonBettingPlayerμ—μ„œλŠ” calculateProfit() λ©”μ„œλ“œκ°€ ν•„μš”μ—†λŠ”λ°, PlayerResultμ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ²˜λ¦¬ν•˜λ €λ‹€λ³΄λ‹ˆ default methodλ₯Ό μƒμ„±ν•˜κ²Œ λμŠ΅λ‹ˆλ‹€.

이것을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ–΄λ–»κ²Œ ν•΄μ•Ό 될까?

였늘 일정을 마친 ν›„ μ§€κΈˆκΉŒμ§€, 이 μ§ˆλ¬Έμ— κ³„μ†ν•΄μ„œ μƒκ°ν•΄λ΄€λŠ”λ° μ œλ„ˆλ¦­ ν˜Ήμ€ μ œλ„ˆλ¦­ ν™•μž₯ Players<T>, Players<T extends Player>λ₯Ό ν™œμš©ν•΄ λ³Ό 수 μžˆμ„ 것 κ°™μ•˜μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ Controllerμ—μ„œλΆ€ν„° Playersλ₯Ό μ‚¬μš©ν•˜λ‹ˆκΉŒ Controller λ˜ν•œ Generic을 μ˜μ‘΄ν•˜κ²Œ λ˜λŠ”λ°, 이건 ꡬ쑰적 λ¬Έμ œμΈμ§€... ν˜Ήμ€ 더 λ‚˜μ€ 방법이 μžˆλŠ”μ§€ ꡉμž₯히 κΆκΈˆν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

3. Enumμ—μ„œ 좜λ ₯ μ—°κ΄€ 정보 제거

κΈ°μ‘΄ Enumμ—μ„œλŠ” 좜λ ₯에 λŒ€ν•œ 정보λ₯Ό λ“€κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

public enum CardShape {
    DIAMOND("닀이아λͺ¬λ“œ"),
    HEART("ν•˜νŠΈ"),
    CLOVER("ν΄λ‘œλ²„"),
    SPADE("μŠ€νŽ˜μ΄λ“œ");

    private final String shape;
...
}

μ—¬κΈ°μ„œ μ €λŠ” model νŒ¨ν‚€μ§€μ—μ„œλŠ” view에 λŒ€ν•œ μ˜μ‘΄μ„±μ΄ μ—†μ–΄μ•Ό MVC에 λ§žλŠ” 섀계라고 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ shape λ³€μˆ˜λ₯Ό μ—†μ• κ³ , Viewμ—μ„œ 직접 Enum에 λŒ€ν•œ 좜λ ₯ κ²°κ³Όλ₯Ό λ§€ν•‘ν•˜λ„λ‘ ν–ˆλŠ”λ°μš”...

public class EnumMapper {
    public static final Map<CardShape, String> CARD_SHAPE_MAPPER = Map.of(
            CardShape.HEART, "ν•˜νŠΈ",
            CardShape.SPADE, "μŠ€νŽ˜μ΄λ“œ",
            CardShape.CLOVER, "ν΄λ‘œλ²„",
            CardShape.DIAMOND, "닀이아λͺ¬λ“œ"
    );
}

μ΅œμ’…μ μœΌλ‘œ ViewλŠ” 같은 계측에 μžˆλŠ” EnumMapperλ₯Ό 톡해 정보λ₯Ό 좜λ ₯ν•˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

그런데 이런 방법둠, λͺ¨λΈλ§ κ°œλ…λ“€μ„ 100% μ μš©ν•˜λŠ” 것이 쒋은가?

κ²°κ³Όλ₯Ό λ§ˆμ£Όν•˜λ‹ˆκΉŒ κΈ°μ‘΄ Enumμ—μ„œ κ°„λ‹¨ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλŠ” 것을, Viewμ—μ„œ 클래슀 ν•˜λ‚˜λ₯Ό 더 λ§Œλ“€λ©΄μ„œ 'ꡳ이?' λΌλŠ” 생각도 λ“€λ”λΌκ΅¬μš”... γ…‹γ…‹γ…‹ κ·Έλž˜λ„ μ œλ‚˜λŠ” μ–΄λ–»κ²Œ μƒκ°ν•˜μ‹œλŠ”μ§€ κΆκΈˆν•΄μ„œ ν•œ 번 μ μš©ν•΄λ΄€μŠ΅λ‹ˆλ‹€...

μ—¬μ­™κ³  싢은 λ‚΄μš©μ„ λ§ˆμ§€λ§‰μ— μž‘μ„±ν•΄λ²„λ ΈλŠ”λ°, μ œλ‚˜μ˜ κ²½ν—˜μ„ ν† λŒ€λ‘œ Modelμ—μ„œ View에 λŒ€ν•œ 의쑴이 μ—†λŠ” ꡬ쑰가 κ·Έλž˜λ„ μ’‹λ‹€ vs Model에 View에 λŒ€ν•œ μ΅œμ†Œν•œμ˜ μ˜μ‘΄μ€ 였히렀 쒋을 수 μžˆλ‹€μ— λŒ€ν•΄ μ–΄λ–»κ²Œ μƒκ°ν•˜μ‹œλŠ”μ§€ μ•Œ 수 μžˆμ„κΉŒμš”?

4. κ·Έ μ™Έ

κ·Έ μ™Έ μ „μ²΄μ μœΌλ‘œλ‚˜ 자유둜운 ν”Όλ“œλ°±μ„ μ£Όμ‹œλ©΄ 정말 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€..!

* λ² νŒ…/λ―Έλ² νŒ… μ „ν™˜μ— μš©μ΄ν•˜λ„λ‘ κ°œμ„ 
public Player(String name) {
super(name);
}
public interface Player {
Copy link

@yenawee yenawee Mar 15, 2026

Choose a reason for hiding this comment

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

ν˜„μž¬ νƒ€μž… 계측 ꡬ쑰λ₯Ό 보면:

Participant (abstract class)
β”œβ”€β”€ Dealer
β”œβ”€β”€ BettingPlayer implements Player
└── NonBettingPlayer implements Player

Player (interface)
β”œβ”€β”€ BettingPlayer
└── NonBettingPlayer

Player , Participant κ°„ 쀑볡 μ˜€λ²„λ‘œλ“œκ°€ λ°œμƒν•˜λŠ”λ°μš”.

drawOneCard(), printCardByPlayerWithScore() 이 두 λ©”μ„œλ“œλŠ” μ™„μ „νžˆ λ™μΌν•œ μ½”λ“œμž…λ‹ˆλ‹€.
calculateProfit() ν•˜λ‚˜λ₯Ό μ œμ™Έν•˜λ©΄ Player μΈν„°νŽ˜μ΄μŠ€λŠ” Participantλ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•œ κ²ƒμœΌλ‘œ λ³΄μ—¬μš”.

μ˜€λ²„λ‘œλ“œλœ λ©”μ„œλ“œκ°€ λ™μΌν•œ λ™μž‘μ„ ν•˜κ³  μžˆλ‹€λ©΄, νƒ€μž… 계측 섀계λ₯Ό λ‹€μ‹œ κ³ λ €ν•΄λ³Ό ν•„μš”μ„±μ΄ λ³΄μ—¬μš”.

Copy link
Author

Choose a reason for hiding this comment

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

리뷰 κ°μ‚¬ν•©λ‹ˆλ‹€! κ΄€λ ¨λœ μž‘μ—…μ„ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€!

ν•΄λ‹Ή 문제λ₯Ό κ³ λ―Όν•˜λ©΄μ„œ ꡬ쑰적인 κ°œμ„ μ΄ λ“€μ–΄κ°”μŠ΅λ‹ˆλ‹€! κ·ΈλŸ¬λ‹ˆ μžμ—°μŠ€λŸ½κ²Œ ISP λ¬Έμ œλ„ ν•΄κ²°λ˜λ”λΌκ΅¬μš”!

Participant (abstract class)
β”œβ”€β”€ Dealer
└── Player (class)
    └── BettingPlayer (extends Player)

PlayerResult -> BettingCalculator (λ² νŒ… κ΄€λ ¨ 둜직 뢄리)

ResultReporter (interface)
β”œβ”€β”€ BettingResultReporter    ← BettingCalculator μ‚¬μš©
└── NonBettingResultReporter

GameMode
β”œβ”€β”€ PlayerReader (interface)
β”‚   β”œβ”€β”€ BettingPlayerReader
β”‚   └── NonBettingPlayerReader
└── ResultReporter (interface)
    β”œβ”€β”€ BettingResultReporter
    └── NonBettingResultReporter

κΈ°μ‘΄μ—λŠ” λ―Έλ² νŒ…/λ² νŒ… ν”Œλ ˆμ΄μ–΄ κ°„ κ³΅ν†΅μ μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ Interfaceλ₯Ό λΆ„λ¦¬ν–ˆμ§€λ§Œ, κ°œμ„  ν›„ abstractλ‘œλ„ μΆ©λΆ„ν–ˆλ‹€λŠ”κ²Œ λŠκ»΄μ§€λ„€μš” πŸ˜… 그리고 λ² νŒ… κΈ°λŠ₯이 μΆ”κ°€λ˜λ©΄μ„œ κΈ°μ‘΄ PlayerResultμ—μ„œ λ² νŒ… κ΄€λ ¨ λ‘œμ§μ„ μΆ”κ°€ν•˜λ €κ³  ν–ˆλŠ”λ°... μΆ”κ°€λœ κΈ°λŠ₯으둜 인해 μƒˆλ‘œμš΄ μ±…μž„κ³Ό 관심사가 λ°œμƒν•œ κ²ƒμœΌλ‘œ μ•„μ˜ˆ μƒˆ 클래슀(BettingCalculator)λ₯Ό λ§Œλ“œλŠ”κ²Œ 훨씬 κΉ”λ”ν•΄μ§€λŠ” 것 κ°™μ•„μš” !

μš°μ—¬κ³‘μ ˆ 끝에 κ°œμ„ μ΄ 됐고 아직도 λΆ€μ‘±ν•œκ²Œ λ§Žκ² μ§€λ§Œ μ΄μ „μ²˜λŸΌ ISPλ₯Ό μœ„λ°˜ν•˜λ˜ λ¬Έμ œλŠ” ν•΄κ²°μ™„λ£Œ λμŠ΅λ‹ˆλ‹€! κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ‘ πŸ‘

Copy link

@yenawee yenawee left a comment

Choose a reason for hiding this comment

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

μ•ˆλ…•ν•˜μ„Έμš” 이프!
2단계 잘 κ΅¬ν˜„ν•΄μ£Όμ…¨λ„€μš” πŸ‘ ν•΄μ£Όμ‹  μ§ˆλ¬Έλ“€λ„ λ‹€ κΉŠμ€ κ³ λ―Όμ†μ—μ„œ λ‚˜μ˜¨ κ²ƒμ΄λΌλŠ”κ²Œ λŠκ»΄μ‘Œμ–΄μš”.
μ½”λ©˜νŠΈ ν™•μΈλΆ€νƒλ“œλ €μš”~!

  1. README 에 μΆ”κ°€λœ κΈ°λŠ₯λ“€ μ •λ¦¬ν•΄μ£Όμ…¨μœΌλ©΄ μ’‹μ•˜μ„ κ±° κ°™μ•„μš”! 이번 PR 에 μΆ”κ°€λœ κΈ°λŠ₯듀이 λ§ŽκΈ°λ„ ν•˜κ³ , 특히 NonBetting λͺ¨λ“œκ°€ μΆ”κ°€λ˜μ—ˆλŠ”λ° μ½”λ“œ 리뷰 μ½”λ©˜νŠΈλ‚˜ μ½”λ“œλ§Œ μ½κ³ λŠ” 이 κΈ°λŠ₯이 μ§€κΈˆ μž‘λ™ν•˜λŠ”μ§€ μ•ˆν•˜λŠ”μ§€ νŒŒμ•…ν•˜λŠ”λ° μ‹œκ°„μ΄ μ’€ κ±Έλ €μ„œ λ¦¬λ“œλ―Έμ— μ •λ¦¬λ˜μ–΄ μžˆμ—ˆλ‹€λ©΄ μ’€ 더 μš©μ΄ν–ˆμ„ κ±° κ°™μ•„μš”.

  2. PlayerReader와 ResultReporter 두 μ „λž΅μ„ λ¬Άμ–΄μ„œ λͺ¨λ“œλ³„λ‘œ μ‘°ν•©ν•˜λŠ” 방식은 OCP λ₯Ό 잘 λ”°λ₯Έλ‹€κ³  μƒκ°λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ λͺ¨λ“œκ°€ μΆ”κ°€λ˜μ–΄λ„ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•  ν•„μš”κ°€ μ—†μœΌλ‹ˆκΉŒμš”! ν•˜μ§€λ§Œ ν˜„μž¬ GameMode μ—λŠ” View Logic, Domain Logic 이 μ„žμ—¬μžˆλ‹€κ³  λ΄μš”. 'μ–΄λ–€ Reader, report'λ₯Ό μ‚¬μš©ν•  것이냐'λ§Œμ„ μ •ν•˜λŠ” κ²ƒμœΌλ‘œ GameMode μ±…μž„μ˜ 경계λ₯Ό μ’ν˜€λ³΄λŠ” 것은 μ–΄λ–¨κΉŒμš”?

  3. NonBettingPlayerμ—κ²Œ calculateProfit()이 ν•„μš”ν–ˆλ˜ μ΄μœ λŠ” PlayerResultκ°€ 두 λͺ¨λ“œλ₯Ό 같은 νƒ€μž…μœΌλ‘œ 닀루렀 ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
    이프 μ˜κ²¬λŒ€λ‘œ μ œλ„ˆλ¦­μ„ μ‚¬μš©ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ§€λ§Œ 컨트둀러, GameMode 등이 μ œλ„€λ¦­μ— μ˜μ‘΄ν•˜κ²Œ λ˜μ„œ λ³΅μž‘μ„±μ΄ 증가할 수 μžˆλŠ” 단점이 있죠. μ•„λ‹ˆλ©΄ Player μΈν„°νŽ˜μ΄μŠ€ calculateProfit λ₯Ό μ œκ±°ν•˜κ³  λͺ¨λ“œλ³„ Result νƒ€μž…μ„ 뢄리할 μˆ˜λ„ μžˆμ§€λ§Œ μ½”λ“œ 양이 λ§Žμ•„μ§€μ£ . μ–΄λ–€ 방법을 νƒν•˜λ˜μ§€ νŠΈλ ˆμ΄λ“œ μ˜€ν”„λŠ” μžˆλ‹€κ³  μƒκ°ν•΄μš”.

  4. Model이 Viewλ₯Ό λͺ°λΌμ•Όν•œλ‹€λŠ” 원칙은 μœ νš¨ν•˜κ³  "닀이아λͺ¬λ“œ" 와 같은 값이 좜λ ₯κ³Ό μ—°κ΄€λ˜ μžˆλŠ” 값이긴 ν•˜μ§€λ§Œ ν˜„μž¬ κ΅¬μ‘°μ—μ„œ enumMapper λ₯Ό λ§Œλ“ λ‹€λ©΄ 저도 이프와 λ™μΌν•˜κ²Œ 'ꡳ이?' 싢을 κ±° κ°™μ•„μš”. ν˜Ήμ‹œ λ‹€κ΅­μ–΄ μ§€μ›μ΄λ‚˜ μ—¬λŸ¬ λ°©ν–₯으둜 좜λ ₯이 μ§€μ›λ˜μ•Ό ν•œλ‹€λ©΄ enumMapper κ°€ ν•„μš”ν•˜κ² μ§€λ§Œ ν˜„μž¬ "닀이아λͺ¬λ“œ" 값은 ꡳ이 좜λ ₯μ—λ§Œ κ΅­ν•œλœ 정보라기 λ³΄λ‹€λŠ” μΆ”κ°€ 도메인 μ •λ³΄λ‘œ 봐도 무방할 κ±° κ°™μ•„μš”.

@jihwankim128
Copy link
Author

@yenawee

  1. README 에 μΆ”κ°€λœ κΈ°λŠ₯λ“€ μ •λ¦¬ν•΄μ£Όμ…¨μœΌλ©΄ μ’‹μ•˜μ„ κ±° κ°™μ•„μš”! ...

아이고... γ… γ…  μŠ€ν… 2 κΈ°λŠ₯ κ΅¬ν˜„μ— λŒ€ν•œ README μ—…λ°μ΄νŠΈκ°€ μ „ν˜€ μ—†μ—ˆλ„€μš”..! λ‹€μŒλΆ€ν„°λŠ” 이 뢀뢄도 μ§‘μ€‘ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€ 😊

  1. PlayerReader와 ResultReporter 두 μ „λž΅μ„ λ¬Άμ–΄μ„œ λͺ¨λ“œλ³„λ‘œ...

#1104 (comment) ν•΄λ‹Ή μ½”λ©˜νŠΈμ—μ„œ λ‹΅λ³€λ“œλ¦° λ‚΄μš©μ΄λ„€μš”!! μ±…μž„μ˜ 경계λ₯Ό μ’ν˜€λ³΄λŠ” 것.. 였랜 μ‹œκ°„ κ³ λ―Όν–ˆλŠ”λ°, 핡심 ν‚€μ›Œλ“œκ°€ 이 μ½”λ©˜νŠΈμ— μžˆμ—ˆκ΅°μš”! κ°μ‚¬ν•©λ‹ˆλ‹€ 😊

  1. Model이 Viewλ₯Ό λͺ°λΌμ•Όν•œλ‹€λŠ” 원칙은 μœ νš¨ν•˜κ³  ...

μΆ”κ°€ 도메인 정보!! 이 경계λ₯Ό κ΅¬λΆ„ν•˜κΈ°κ°€ 정말 μ–΄λ €μ› λ˜ 것 κ°™μ•„μš”. μ œλ‚˜μ˜ μ½”λ©˜νŠΈ 덕뢄에 λ‹€κ΅­μ–΄ 지원 ν˜Ήμ€ μ—¬λŸ¬ λ°©ν–₯ 좜λ ₯κ³Ό 같이 닀양성이 μžˆμ§€ μ•Šμ€ 이상 μΆ”κ°€ 도메인 μ •λ³΄λ‘œ 봐도 λœλ‹€λŠ” 기쀀이 μƒκ²Όμ–΄μš”. κ°μ‚¬ν•©λ‹ˆλ‹€ πŸ˜„πŸ˜„

public Map<BettingPlayer, Profit> calculateProfits(PlayerResult playerResult) {
Map<BettingPlayer, Profit> profits = new LinkedHashMap<>();
playerResult.result().forEach((player, status) -> {
if (player instanceof BettingPlayer bettingPlayer) {
Copy link

Choose a reason for hiding this comment

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

instanceof μ‚¬μš© μ§€μ–‘ν•΄λ³Όμˆ˜ μžˆμ„κΉŒμš”?

Copy link

@yenawee yenawee left a comment

Choose a reason for hiding this comment

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

μ•ˆλ…•ν•˜μ„Έμš” 이프!
Player κ΄€λ ¨ 계측이 많이 κΉ”λ”ν•΄μ‘Œμ–΄μš”! πŸ‘

그런데 ν•˜λ‚˜ κΌ­ 짚고 λ„˜μ–΄κ°€κ³  싢은 뢀뢄이 μžˆμ–΄μ„œ μ½”λ©˜νŠΈ λ‚¨κ²¨μš”! 확인 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€

@jihwankim128
Copy link
Author

jihwankim128 commented Mar 15, 2026

@yenawee
μ œλ‚˜, instanceofλ₯Ό μ§€μ–‘ν•΄μ•Ό ν•˜λŠ” μ΄μœ μ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.

instanceofλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” 상속 및 κ΅¬ν˜„ ν΄λž˜μŠ€μ— λŒ€ν•΄ ꡬ체적인 정보가 ν•„μš”ν•  λ•Œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.
그런데 abstract둜 좔상화가 잘 된 경우 instanceofλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€λŠ” 것을 μ•Œκ²Œ λμŠ΅λ‹ˆλ‹€.

그런데 μ§€κΈˆ instanceofλ₯Ό μ‚¬μš©ν–ˆλ‹€λŠ” 것은 좔상화가 μ œλŒ€λ‘œ λ˜μ§€ μ•Šμ•˜λ‹€λŠ” μ‹ ν˜Έλ‘œ λ°›μ•„λ“€μ—¬μ‘ŒμŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ ꡬ쑰상 μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 1개의 κΈ°λŠ₯을 μΆ”μƒν™”ν•˜μžλ‹ˆ ISPλ‚˜ LSPλ₯Ό μœ„λ°˜ν•˜κ²Œ 되고...
κ·Έλž˜μ„œ instanceofλ₯Ό ν™œμš©ν•˜λŠ” 방법밖에 λ– μ˜€λ₯΄μ§€ μ•Šλ”κ΅°μš”...

μ–΄λ–»κ²Œ ν•΄κ²°ν•΄μ•Ό λ˜λ‚˜ κ³„μ†ν•΄μ„œ κ³ λ―Όν–ˆλŠ”λ°, PR에 μ ν˜€μžˆλ˜ 2번 질문처럼 μ œλ„€λ¦­μ„ ν™œμš©ν•˜λŠ”κ²Œ 정닡이라고 λŠκ»΄μ‘ŒμŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ μ œλ„€λ¦­μ„ 톡해 μΆ”κ°€ κ°œμ„ μ„ ν•˜λ©΄μ„œ 'λ³΅μž‘λ„κ°€ μ˜¬λΌκ°„κ²Œ μ•„λ‹Œκ°€..?'라고 생각이 λ“€μ—ˆμ§€λ§Œ, 였히렀 κ΅¬ν˜„μ„ λ§ˆμΉ˜κ³ λ‚˜λ‹ˆ νƒ€μž… μ•ˆμ •μ„±μ΄λΌλŠ” μž₯점과 GameModeμ—μ„œ κ³ λ―Όν•˜λ˜ λ¬Έμ œλ„ ν•΄κ²°λμŠ΅λ‹ˆλ‹€.

사싀 GameModeμ—μ„œ λͺ¨λ“œμ— 따라 λ‹€λ₯Έ κ΅¬ν˜„μ²΄λ‘œ κ°ˆμ•„λΌμšΈ 수 μžˆλ‹€λŠ” 걱정이 μžˆμ—ˆμ–΄μš”..

public class GameMode<T extends Player> {

    private final PlayerReader<T> playerReader;
    private final ResultReporter<T> resultReporter;

    private GameMode(PlayerReader<T> playerReader, ResultReporter<T> resultReporter) {
        this.playerReader = playerReader;
        this.resultReporter = resultReporter;
    }

    public static GameMode<BettingPlayer> toBettingMode() {
        return new GameMode<>(new BettingPlayerReader(), new BettingResultReporter());
    }

    public static GameMode<Player> toNonBettingMode() {
        return new GameMode<>(new NonBettingPlayerReader(), new NonBettingResultReporter());
    }
    ...
}

ν˜„μž¬ μ½”λ“œλŠ” μ œλ„€λ¦­μ„ μ‚¬μš©ν•œ μ½”λ“œμž…λ‹ˆλ‹€.
μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” λ² νŒ… λͺ¨λ“œμ—μ„œ playerReader에 new NonBettingPlayerReader()을 μΆ”κ°€ν•  수 μžˆκΈ°λ•Œλ¬Έμ—, μ •μ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ‘œ λͺ…ν™•νžˆ ν‘œν˜„ν•˜κ³ μž ν–ˆλŠ”λ°... μ œλ„€λ¦­μ„ ν™œμš©ν•˜λ‹ˆκΉŒ κ΄€λ ¨ κ΅¬ν˜„μ²΄κ°€ μ•„λ‹ˆλ©΄ 컴파일 μ‹œμ μ—μ„œ μ£Όμž…μ‘°μ°¨ μ•ˆλ˜λ”λΌκ΅¬μš” γ…Žγ…Ž..

image

κ·Έλž˜μ„œ 이 κ²½ν—˜μ„ 톡해 μžμ‹ ν΄λž˜μŠ€μ—μ„œ κΈ°λŠ₯적으둜 ν™•μž₯이 ν•„μš”ν•œ 경우 μ œλ„€λ¦­μ„ 톡해 νƒ€μž… μ•ˆμ „μ„±, λ‹€ν˜•μ„± 관리λ₯Ό ν•˜λ©΄ λœλ‹€λŠ” κ°œλ…μ΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€ ☺️

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