[π μ¬μ΄ν΄2 - λ―Έμ (λΈλμ λ² ν )] μ΄ν λ―Έμ μ μΆν©λλ€.#1104
[π μ¬μ΄ν΄2 - λ―Έμ
(λΈλμ λ² ν
)] μ΄ν λ―Έμ
μ μΆν©λλ€.#1104jihwankim128 wants to merge 24 commits intowoowacourse:jihwankim128from
Conversation
* λ² ν /λ―Έλ² ν μ νμ μ©μ΄νλλ‘ κ°μ
| public Player(String name) { | ||
| super(name); | ||
| } | ||
| public interface Player { |
There was a problem hiding this comment.
νμ¬ νμ κ³μΈ΅ ꡬ쑰λ₯Ό 보면:
Participant (abstract class)
βββ Dealer
βββ BettingPlayer implements Player
βββ NonBettingPlayer implements Player
Player (interface)
βββ BettingPlayer
βββ NonBettingPlayer
Player , Participant κ° μ€λ³΅ μ€λ²λ‘λκ° λ°μνλλ°μ.
drawOneCard(), printCardByPlayerWithScore() μ΄ λ λ©μλλ μμ ν λμΌν μ½λμ
λλ€.
calculateProfit() νλλ₯Ό μ μΈνλ©΄ Player μΈν°νμ΄μ€λ Participantλ₯Ό κ·Έλλ‘ λ³΅μ¬ν κ²μΌλ‘ 보μ¬μ.
μ€λ²λ‘λλ λ©μλκ° λμΌν λμμ νκ³ μλ€λ©΄, νμ κ³μΈ΅ μ€κ³λ₯Ό λ€μ κ³ λ €ν΄λ³Ό νμμ±μ΄ 보μ¬μ.
There was a problem hiding this comment.
리뷰 κ°μ¬ν©λλ€! κ΄λ ¨λ μμ μ μμ νμ΅λλ€!
ν΄λΉ λ¬Έμ λ₯Ό κ³ λ―Όνλ©΄μ ꡬ쑰μ μΈ κ°μ μ΄ λ€μ΄κ°μ΅λλ€! κ·Έλ¬λ μμ°μ€λ½κ² 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λ₯Ό μλ°νλ λ¬Έμ λ ν΄κ²°μλ£ λμ΅λλ€! κ°μ¬ν©λλ€ π π
yenawee
left a comment
There was a problem hiding this comment.
μλ
νμΈμ μ΄ν!
2λ¨κ³ μ ꡬνν΄μ£Όμ
¨λ€μ π ν΄μ£Όμ μ§λ¬Έλ€λ λ€ κΉμ κ³ λ―Όμμμ λμ¨ κ²μ΄λΌλκ² λκ»΄μ‘μ΄μ.
μ½λ©νΈ νμΈλΆνλλ €μ~!
-
README μ μΆκ°λ κΈ°λ₯λ€ μ 리ν΄μ£Όμ ¨μΌλ©΄ μ’μμ κ±° κ°μμ! μ΄λ² PR μ μΆκ°λ κΈ°λ₯λ€μ΄ λ§κΈ°λ νκ³ , νΉν NonBetting λͺ¨λκ° μΆκ°λμλλ° μ½λ 리뷰 μ½λ©νΈλ μ½λλ§ μ½κ³ λ μ΄ κΈ°λ₯μ΄ μ§κΈ μλνλμ§ μνλμ§ νμ νλλ° μκ°μ΄ μ’ κ±Έλ €μ 리λλ―Έμ μ 리λμ΄ μμλ€λ©΄ μ’ λ μ©μ΄νμ κ±° κ°μμ.
-
PlayerReaderμ ResultReporter λ μ λ΅μ λ¬Άμ΄μ λͺ¨λλ³λ‘ μ‘°ν©νλ λ°©μμ OCP λ₯Ό μ λ°λ₯Έλ€κ³ μκ°λ©λλ€. μλ‘μ΄ λͺ¨λκ° μΆκ°λμ΄λ κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½ν νμκ° μμΌλκΉμ! νμ§λ§ νμ¬ GameMode μλ View Logic, Domain Logic μ΄ μμ¬μλ€κ³ λ΄μ. 'μ΄λ€ Reader, report'λ₯Ό μ¬μ©ν κ²μ΄λ'λ§μ μ νλ κ²μΌλ‘ GameMode μ± μμ κ²½κ³λ₯Ό μ’ν보λ κ²μ μ΄λ¨κΉμ?
-
NonBettingPlayerμκ² calculateProfit()μ΄ νμνλ μ΄μ λ PlayerResultκ° λ λͺ¨λλ₯Ό κ°μ νμ μΌλ‘ λ€λ£¨λ € νκΈ° λλ¬Έμ λλ€.
μ΄ν μ견λλ‘ μ λλ¦μ μ¬μ©νλ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ§λ§ 컨νΈλ‘€λ¬, GameMode λ±μ΄ μ λ€λ¦μ μμ‘΄νκ² λμ 볡μ‘μ±μ΄ μ¦κ°ν μ μλ λ¨μ μ΄ μμ£ . μλλ©΄ Player μΈν°νμ΄μ€ calculateProfit λ₯Ό μ κ±°νκ³ λͺ¨λλ³ Result νμ μ λΆλ¦¬ν μλ μμ§λ§ μ½λ μμ΄ λ§μμ§μ£ . μ΄λ€ λ°©λ²μ ννλμ§ νΈλ μ΄λ μ€νλ μλ€κ³ μκ°ν΄μ. -
Modelμ΄ Viewλ₯Ό λͺ°λΌμΌνλ€λ μμΉμ μ ν¨νκ³ "λ€μ΄μλͺ¬λ" μ κ°μ κ°μ΄ μΆλ ₯κ³Ό μ°κ΄λ μλ κ°μ΄κΈ΄ νμ§λ§ νμ¬ κ΅¬μ‘°μμ enumMapper λ₯Ό λ§λ λ€λ©΄ μ λ μ΄νμ λμΌνκ² 'κ΅³μ΄?' μΆμ κ±° κ°μμ. νΉμ λ€κ΅μ΄ μ§μμ΄λ μ¬λ¬ λ°©ν₯μΌλ‘ μΆλ ₯μ΄ μ§μλμΌ νλ€λ©΄ enumMapper κ° νμνκ² μ§λ§ νμ¬ "λ€μ΄μλͺ¬λ" κ°μ κ΅³μ΄ μΆλ ₯μλ§ κ΅νλ μ 보λΌκΈ° 보λ€λ μΆκ° λλ©μΈ μ λ³΄λ‘ λ΄λ 무방ν κ±° κ°μμ.
* Participant(abstract) β Player(class) β BettingPlayer κ³μΈ΅μΌλ‘ λ¨μν * Player μΈν°νμ΄μ€μ Participant κ° μ€λ³΅ λ©μλ μ μΈ μ κ±° * calculateProfitμ BettingPlayerλ‘ μ΄λνμ¬ ISP μλ° ν΄μ
μμ΄κ³ ... γ γ μ€ν 2 κΈ°λ₯ ꡬνμ λν README μ λ°μ΄νΈκ° μ ν μμλ€μ..! λ€μλΆν°λ μ΄ λΆλΆλ μ§μ€ν΄λ³΄κ² μ΅λλ€. κ°μ¬ν©λλ€ π
#1104 (comment) ν΄λΉ μ½λ©νΈμμ λ΅λ³λλ¦° λ΄μ©μ΄λ€μ!! μ± μμ κ²½κ³λ₯Ό μ’ν보λ κ².. μ€λ μκ° κ³ λ―Όνλλ°, ν΅μ¬ ν€μλκ° μ΄ μ½λ©νΈμ μμκ΅°μ! κ°μ¬ν©λλ€ π
μΆκ° λλ©μΈ μ 보!! μ΄ κ²½κ³λ₯Ό ꡬλΆνκΈ°κ° μ λ§ μ΄λ €μ λ κ² κ°μμ. μ λμ μ½λ©νΈ λλΆμ |
| public Map<BettingPlayer, Profit> calculateProfits(PlayerResult playerResult) { | ||
| Map<BettingPlayer, Profit> profits = new LinkedHashMap<>(); | ||
| playerResult.result().forEach((player, status) -> { | ||
| if (player instanceof BettingPlayer bettingPlayer) { |
There was a problem hiding this comment.
instanceof μ¬μ© μ§μν΄λ³Όμ μμκΉμ?
|
@yenawee instanceofλ₯Ό μ¬μ©νλ κ²½μ°λ μμ λ° κ΅¬ν ν΄λμ€μ λν΄ κ΅¬μ²΄μ μΈ μ λ³΄κ° νμν λ μ¬μ©νκ² λ©λλ€. κ·Έλ°λ° μ§κΈ instanceofλ₯Ό μ¬μ©νλ€λ κ²μ μΆμνκ° μ λλ‘ λμ§ μμλ€λ μ νΈλ‘ λ°μλ€μ¬μ‘μ΅λλ€. μ΄λ»κ² ν΄κ²°ν΄μΌ λλ κ³μν΄μ κ³ λ―Όνλλ°, PRμ μ νμλ 2λ² μ§λ¬Έμ²λΌ μ λ€λ¦μ νμ©νλκ² μ λ΅μ΄λΌκ³ λκ»΄μ‘μ΅λλ€. μ¬μ€ 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());
}
...
}νμ¬ μ½λλ μ λ€λ¦μ μ¬μ©ν μ½λμ
λλ€.
κ·Έλμ μ΄ κ²½νμ ν΅ν΄ μμ ν΄λμ€μμ κΈ°λ₯μ μΌλ‘ νμ₯μ΄ νμν κ²½μ° μ λ€λ¦μ ν΅ν΄ νμ
μμ μ±, λ€νμ± κ΄λ¦¬λ₯Ό νλ©΄ λλ€λ κ°λ
μ΄ μκ²Όμ΅λλ€. κ°μ¬ν©λλ€ |

μλ‘
μλ νμΈμ μ λ! μ¬μ΄ν΄ 1μ μ΄μ΄ μ¬μ΄ν΄ 2 μ§ν μλ£νμ΅λλ€.
μ¬μ΄ν΄ 2λ₯Ό μ§ννλ©΄μ μ½λμ μ λ§ λ§μ λ³νκ° λ°μνλ€μ π€£
μ°μ 리뷰 μꡬ μ¬νμ μμ±νκΈ° μ , μ κ° μλνλ λ°λ₯Ό κ°λ΅νκ²λλ§ μ λ¬νλ €κ³ ν©λλ€!
μ¬μ΄ν΄ 2μμ λ² ν κΈ°λ₯μ΄ μΆκ°λλ©΄μ ν΄λΌμ΄μΈνΈκ° λ―Έλ² ν λΈλμ μν μλ μλ€λ μ μ λ₯Ό λκ³ λ¦¬ν©ν λ§μ μ§ννμ΅λλ€.
μ¬κΈ°μ μΆκ°λ κΈ°λ₯μ
λΈλμ νμΈ κΈ°λ₯ μΆκ°,λ² ν κΈ°λ₯ μΆκ°μ λμ΄κ³ , κ·Έ μΈμλ λͺ¨λ 리ν©ν λ§μ μ§ννμ΅λλ€!μ κ° μν κ²μ
GameMode(BlackJackApplication μμ μμ )λ§ λ³κ²½νλ©΄ λ―Έλ² ν κΈ°λ₯μΌλ‘ μ νλλ κ²μ λλ€.νμ¬ ν¬λ§μ¬νμ μΆ©μ‘±μ΄ λμΌλ ꡬ쑰 μ λ§μ‘±νμ§ λͺ»νλ λΆλΆμ΄ λ§μ΄ λκ»΄μ Έμ νΌλλ°±μ λ°κ³ μΆμ΅λλ€ π₯π₯
(μκ°μ΄ λΆμ‘±ν΄μ λ κ°μ νμ§ λͺ»νκ³ , μ°μ μ PRμ λ¨κΉλλ€... Step1μμ λ°λ¦° κ² λλ¬Έμ Step2μ μ°¨μ§μ΄ μκ²Όλ€μ γ )
κ·Έλ¦¬κ³ μ¬μ΄ν΄ 2μΈ λ§νΌ λμ νκ² νΌλλ°±ν΄μ£Όμλ©΄ μ μ±μ₯μ μ λ§ ν° λμμ΄ λ κ² κ°μμ!
μ²΄ν¬ λ¦¬μ€νΈ
testλ₯Ό μ€ννμ λ, λͺ¨λ ν μ€νΈκ° μ μμ μΌλ‘ ν΅κ³Όνλμ?μ΄λ€ λΆλΆμ μ§μ€νμ¬ λ¦¬λ·°ν΄μΌ ν κΉμ?
1. Controller λΆλ¦¬ ꡬ쑰μ λν νΌλλ°±
Betting, NonBettingμ μ λ ₯λ°λ νμκ³Ό μΆλ ₯νλ νμλΆν° λ¬λκΈ° λλ¬Έμ κ° κ° Readerμ ResultReporterλ‘ κ΅¬λΆ νμ΅λλ€.
BettingPlayerReaderμμλBettingPlayerλ₯Ό μμ±νλλ‘ νκ³ ,NonBettingPlayerReaderμμλNonBettingPlayerλ₯Ό μμ±νλλ‘ νμ΅λλ€.μ΄λ κ² μ€κ³ν μ΄μ λ μ΄λ―Έ ꡬνλ 2κ°μ§ λͺ¨λμμ λͺ¨λ λ³κ²½μ΄ μ½λλ‘, GameModeμμ
toBettingMode(),toNonBettingMode()λ₯Ό ν΅ν΄ κ°λ¨ν κ²μμ λ³κ²½νκΈ° μν΄ μ€κ³νμ΅λλ€.2. ISP μμΉ λ―Έμ€μμμ λ°μν κΆκΈμ¦
λ―Έλ² ν , λ² ν μ λν νλ μ΄μ΄λ₯Ό ꡬλΆνλ €λ€ λ³΄λ NonBettingPlayer, BettingPlayerλ‘ κ΅¬λΆνκ² λμ΅λλ€.
κ·Έλ¦¬κ³ PlayerλΌλ interfaceλ‘ μΆμνν΄μ κ΄λ¦¬νλλ°, μ΄λ¬λ SOLID μ€ ISPμμ λ²μ΄λ κ² κ°μ΅λλ€.
NonBettingPlayerμμλ
calculateProfit()λ©μλκ° νμμλλ°, PlayerResultμμ 곡ν΅μ μΌλ‘ μ²λ¦¬νλ €λ€λ³΄λ default methodλ₯Ό μμ±νκ² λμ΅λλ€.μ€λ μΌμ μ λ§μΉ ν μ§κΈκΉμ§, μ΄ μ§λ¬Έμ κ³μν΄μ μκ°ν΄λ΄€λλ° μ λλ¦ νΉμ μ λλ¦ νμ₯
Players<T>,Players<T extends Player>λ₯Ό νμ©ν΄ λ³Ό μ μμ κ² κ°μμ΅λλ€. λ€λ§ ControllerμμλΆν° Playersλ₯Ό μ¬μ©νλκΉ Controller λν Genericμ μμ‘΄νκ² λλλ°, μ΄κ±΄ ꡬ쑰μ λ¬Έμ μΈμ§... νΉμ λ λμ λ°©λ²μ΄ μλμ§ κ΅μ₯ν κΆκΈν΄μ‘μ΅λλ€.3. Enumμμ μΆλ ₯ μ°κ΄ μ 보 μ κ±°
κΈ°μ‘΄ Enumμμλ μΆλ ₯μ λν μ 보λ₯Ό λ€κ³ μμμ΅λλ€.
μ¬κΈ°μ μ λ model ν¨ν€μ§μμλ viewμ λν μμ‘΄μ±μ΄ μμ΄μΌ MVCμ λ§λ μ€κ³λΌκ³ μκ°μ΄ λ€μμ΅λλ€.
κ·Έλμ
shapeλ³μλ₯Ό μμ κ³ , Viewμμ μ§μ Enumμ λν μΆλ ₯ κ²°κ³Όλ₯Ό λ§€ννλλ‘ νλλ°μ...μ΅μ’ μ μΌλ‘ Viewλ κ°μ κ³μΈ΅μ μλ EnumMapperλ₯Ό ν΅ν΄ μ 보λ₯Ό μΆλ ₯νλλ‘ μμ νμ΅λλ€.
κ²°κ³Όλ₯Ό λ§μ£ΌνλκΉ κΈ°μ‘΄ Enumμμ κ°λ¨νκ² μ²λ¦¬ν μ μλ κ²μ, Viewμμ ν΄λμ€ νλλ₯Ό λ λ§λ€λ©΄μ 'κ΅³μ΄?' λΌλ μκ°λ λ€λλΌκ΅¬μ... γ γ γ κ·Έλλ μ λλ μ΄λ»κ² μκ°νμλμ§ κΆκΈν΄μ ν λ² μ μ©ν΄λ΄€μ΅λλ€...
μ¬μκ³ μΆμ λ΄μ©μ λ§μ§λ§μ μμ±ν΄λ²λ Έλλ°, μ λμ κ²½νμ ν λλ‘ Modelμμ Viewμ λν μμ‘΄μ΄ μλ κ΅¬μ‘°κ° κ·Έλλ μ’λ€ vs Modelμ Viewμ λν μ΅μνμ μμ‘΄μ μ€νλ € μ’μ μ μλ€μ λν΄ μ΄λ»κ² μκ°νμλμ§ μ μ μμκΉμ?
4. κ·Έ μΈ
κ·Έ μΈ μ 체μ μΌλ‘λ μμ λ‘μ΄ νΌλλ°±μ μ£Όμλ©΄ μ λ§ κ°μ¬νκ² μ΅λλ€..!