[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ธ๋์ญ ๊ฒ์ ์คํ)] ์ํฐ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#956
Conversation
jurlring
left a comment
There was a problem hiding this comment.
์ํฐ ์๋ ํ์ธ์! ๋ธ๋์ญ ๋ฆฌ๋ทฐ๋ฅผ ๋งก๊ฒ๋ ์ฃผ๋์ ๋๋ค ๐ฐ ๋ฐ๊ฐ์์!
์ํฐ์ ์๊ฐ์ด ๊ถ๊ธํ ๋ถ๋ถ๊ณผ ์์ ํ๋ฉด ์ข์ ๋ถ๋ถ์ ์ฝ๋ฉํธ๋ก ๋จ๊ฒจ๋์์ด์.
์๊ฐ ๊ด์ฐฎ์ผ์ค ๋ ํ์ธํด์ฃผ์ธ์~
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ ๋ฏธ์
์์ ํ์ตํ๊ณ ์ถ์ผ์ ๊ฒ ๋ฌด์์ธ์ง ๊ถ๊ธํด์.
ํ์ตํด์ผํ ๊ฒ์ด ๋ฌด์์ธ์ง, ๋ด๊ฐ ๋ถ์กฑํ๊ฒ ๋ญ์ง ์ธ์งํ๋ ๊ฒ์ ๋๋ฌด๋๋ฌด ์ค์ํ๊ฑฐ๋ ์!
๋ฏธ์
์ด ๋๋๊ณ ์ ๊ฐ ํ์ธํ ๊ฒ์!
| import java.util.List; | ||
| import java.util.function.Supplier; | ||
|
|
||
| public class BlackjackController { |
There was a problem hiding this comment.
controller๊ฐ ์๋ง์ ๋ก์ง์ ํธ์ถํ๋ ์ญํ ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค!๐
์
์ถ๋ ฅ ๊ด๋ จํด์๋ InputView์ OutputView๋ฅผ ํธ์ถํ๊ณ , ์ ์ ํ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฒฝ์ฐ ์ฃผ๋ก Service๋ฅผ ํธ์ถํฉ๋๋ค.
๋ฌผ๋ก ์ง๊ธ์ Service๊ฐ ํ๋ ๋ฐ์ ์์ง๋ง, ์ถํ Service๊ฐ ๋์ด๋ ํ์ฅ์ฑ์ ๊ณ ๋ คํด์๋ ๋ถ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค!
์ง๊ธ๋ ์
์ถ๋ ฅ๊ณผ ๋น์ฆ๋์ค ๋ก์ง ์ค ์ด๋ ๋ก์ง์ ํธ์ถํ ์ง ์๋ดํด์ฃผ๋ ๋ค๋น๊ฒ์ด์
๊ฐ์ ์ญํ ์ ํ๊ณ ์๋ค๊ณ ์๊ฐํด์.
์ง๋ฌธ์ ์ฃผ์
์ ์๊ฐํด๋ดค๋๋ฐ Controller๊ฐ ์๋ค๋ฉด ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑํด์ผํ๋์ง ๊ฐ์ด ์ ์์ค๋ค์.๐ฅฒ
ํน์ Controller๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ์๋์?
There was a problem hiding this comment.
MVC ํจํด์ ๊ณ ๋ คํด์ Controller๋ฅผ ๋ง๋ค์ด์ฃผ์ ๊ฑธ๊น์?
ํจํด์ ๊ฐ๋ฐ์๋ค์ด ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ฒช์ผ๋ฉด์, ์ด๋ฐ ์ํฉ์์๋ ์ด๋ ๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค๋ ๊ฒฝํ์ด ์์ฌ ๋ง๋ค์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์. ๊ทธ๋์ ๊ตฌ์กฐ๊ฐ ์ด๋ ์ ๋ ์ ํํ๋์ด ์์ด ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์์ธกํ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ๋ ์๋ ๊ฒ ๊ฐ์์.
๊ทธ๋์ ์ด๋ฒ ๊ตฌํ์์ ์ MVC ํจํด์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ จ๋์ง ๊ถ๊ธํด์ ์ง๋ฌธ๋๋ ธ์ต๋๋ค ๐
๋ค๋ง Controller๋ผ๋ ํํ๊ฐ ์๋๋๋ผ๋ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์ํ ๊ฒ ๊ฐ์์.
ํจํด์ ์ฌ๋ฌ ๊ตฌํ ๋ฐฉ๋ฒ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๊ณ ์ํด์ผ ํ๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ํจ๊ป ๋ง์๋๋ฆฌ๊ณ ์ถ์์ด์~!
There was a problem hiding this comment.
์ถํ์ ์น๊ฐ๋ฐ๋ก ๊ฐ๋ฉด controller-service-domain ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์,
์์ ์๋ฐ์์๋ ๊ทธ ๊ณ์ธต๋ณ ์ญํ ์ ๋๋ ทํ๊ฒ ์ดํดํด๋ณด๊ณ ์ถ์ด์ controller-domain ๊ณ์ธต์ผ๋ก ์ฝ๋ ์์ฑ์ ํ์ต๋๋ค.
์์ํ ๋๋ service๊ฐ ๊ตณ์ด ํ์ํ์ง ์๋ค๊ณ ์๊ฐํ๋ ๊ฑฐ ๊ฐ์์.
๊ทผ๋ฐ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ controller์์ ๊ฐ์ฒด ์์ฑ์ด๋ dto ์์ฑ๊น์ง ์์ฌ๋ฒ๋ฆฌ๋ฉด ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ๊ณ ํด๋์ค๊ฐ ๋ฌด๊ฑฐ์์ ธ์
service์๊ฒ ์ด๋ฐ ์ค๊ฐ ์ญํ ์ ์ฑ
์์ ์ฎ๊ฒผ์ต๋๋ค.
์ฌ์ดํด 2๋ฅผ ์งํํ๋ฉด์ ๋๋ฉ์ธ ๊ตฌ์กฐ๋ฅผ ๋ค์ ์ฌ๊ตฌ์ฑํ๋๋ฐ, ๊ทธ ๊ฒฐ๊ณผ ์๋์ ๊ฐ์ด ์ฑ ์์ด ๋๋ ์ง ๊ฒ ๊ฐ์ต๋๋ค.
InputView : ์
๋ ฅ ์ฑ
์
OutputView: ์ถ๋ ฅ ์ฑ
์
Controller: ์
๋ ฅ, ์ถ๋ ฅ, service์ค ์ด๋ ๊ฒ์ ํธ์ถํ ์ง ๊ฒฐ์
Service: ๋๋ฉ์ธ์ ์์ฑํ๊ฑฐ๋ dto๋ฅผ ์์ฑ
Domain: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๋ค
์ฃผ๋ ํผ๋๋ฐฑ์ฒ๋ผ controller๊ฐ ๊ผญ ํ์ํ ๊ณผ์ ๋ ์๋์์ด์, ๋ ๋ค๋ฅธ ๋ฐฉ์์ ๊ตฌํ๋ ์ถ๊ฐ๋ก ์ฐพ์๋ณด๋๊ฒ ์ข์ ๊ฑฐ ๊ฐ๋ค์.
์ข ๋ ์ฐพ์๋ณด๊ณ ๊ณต๋ถํด๋ณด๊ฒ ์ต๋๋ค. ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค!
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public final class CardGenerator { |
There was a problem hiding this comment.
CardGenerator ํด๋์ค์ final์ ๋ถ์ด์ ์ด์ ๊ฐ ๊ถ๊ธํด์ :)
ํด๋์ค, ๋ฉ์๋, ํ๋์ ๊ฐ๊ฐ final์ ๋ถ์ผ ๋ ์ด๋ค ์๋ฏธ์ผ๊น์~?
๊ทธ๋ฆฌ๊ณ final์ด ์ ์กด์ฌํ๋์ง ์ํฐ์ ์๊ฐ๋ ๊ถ๊ธํด์ :)
There was a problem hiding this comment.
์ ํธ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์, ์์์ ๋ง๊ธฐ ์ํด์ final์ ์ฌ์ฉํ์ต๋๋ค.
์ ํธ ํด๋์ค๋ ๋ด๋ถ์ static ๋ฉ์๋๋ค๋ง ์๊ธฐ ๋๋ฌธ์, ์์์ด ํ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
final์ ์๋ฏธ
์๋ฐ docs ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ final์ ์๋ฏธ์ ๋ํด์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
-
ํด๋์ค final
ํด๋์ค ์์ฒด์ ์์์ ๋ง๋๋ค.
๊ฐ์ฒด์ ๋ถ๋ณ ์ํ๋ฅผ ์ ์งํ๋ค. -
๋ฉ์๋ final
์์๋ฐ์ ํด๋์ค์์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ง ์๊ฒ ๋ง๋๋ค.
์์ฑ์ ๋ฉ์๋์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก final๋ก ์ ์ํ์ฌ, ์ฌ์ ์๋๋ ๊ฒ์ ๋ง๋๋ค. -
ํ๋ final
ํ๋์ ์ํ๊ฐ ๋ถ๋ณํ๋๋ก ๋ง๋๋ค.
์ ๋ฆฌํ์๋ฉด, final์ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๊ณ ์บก์ํํ๊ธฐ ์ํด ์กด์ฌํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ธ๋ถ์์ ์ด ๊ฐ์ฒด์ ํ์
์ ๋ํ ์กฐ์์ ํ ์ ์์ด์, ์์ ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
| Cards cards = CardGenerator.generate(); | ||
| cards.shuffle(); |
There was a problem hiding this comment.
CardGenerator.generate๋ก Cards๊ฐ ๋์จ๋ค๋ฉด CardsGenerator๊ฐ ๋ ๋ง๋ ์๋ฏธ ์๋๊น์~?
๋ํ BlackjackService๊ฐ cards๋ฅผ shuffleํ๋ ์ฑ ์๊น์ง ๊ฐ์ ธ์ผํ๋ค๊ณ ์๊ฐํ์๋์ง ๊ถ๊ธํด์ :)
There was a problem hiding this comment.
ํผ๋๋ฐฑ ์ฃผ์ ๋๋ก CardsGenerator๊ฐ ๋ ์ ์ ํ ๊ฒ ๊ฐ๋ค์.
BlackjackService๊ฐ cards๋ฅผ shuffleํ๋ ๋ถ๋ถ๋ ํ์ด๋ ๋
ผ์ํ๋ ๋ถ๋ถ์ธ๋ฐ์
์ ๋ shuffle์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํด๋น ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ํ์ด์๊ฒ ์ ๋๋ก ์ค๋ช
ํ์ง ๋ชปํด์,
์ฐ์ ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ๋ชฉํ๋ก Service์ ์์ฑ ํ ๋ฆฌํฉํ ๋งํ๊ธฐ๋ก ํ์์ต๋๋ค.
ํผ๋๋ฐฑ ์ฃผ์ ๋๋ถ์ ๋ค์ ํ๋ฒ ๊ณ ๋ฏผํ๊ณ ๊ฒฐ๋ก ์ ๋ด๋ ค๋ดค์ต๋๋ค!
์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๋ฉด Service์ shuffle์ ๋ํ ์์กด์ฑ์ด ๋ฎ์์ง๊ณ , ์ธ๋ถ์์ shuffle ๊ฐ์ mocking ํด์ ๋ฃ์ด์ค ์ ์์ด ํ
์คํธ์ ์ฉ์ดํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ์์ ํ๋ค๋ฉด ์ธ๋ถ์์ ์์กด์ฑ ์ฃผ์
์ผ๋ก shuffle์ ์ธํฐํ์ด์ค๋ฅผ ๋ฃ์ด์ค ๊ฒ ๊ฐ์ต๋๋ค.
There was a problem hiding this comment.
์ธํฐํ์ด์ค ์ฌ์ฉ
shuffle์ ๋๋ค ์ถ์ถ์ฒ๋ผ ํต์ ํ ์ ์๋ ๊ฐ์ด๋ผ,
์ด ๊ฐ์ ํ ์คํธ์์ ํธํ๊ฒ ์กฐ์ํด์ฃผ๊ธฐ ์ํด CardsGenerator๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋๋ถ์, FakeShuffledCardsGenerator๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ์ ์ ๊ฐ ์ง์ ์์๋ฅผ ์กฐ์ํ ์ ์์์ต๋๋ค.
ํต์ ํ ์ ์๋ ๊ฐ์ ํ ์คํธ ํ ๋, ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ์ฃผ๋ก ํ๋์? ์๋๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ์๋์?
(์ฐธ๊ณ ํ ์คํธ ์ฝ๋ : BlackjackServiceTest์ ์ ํ_์นด๋_์์๋๋ก_๋ฐฐ๋ถ_์ ์_ํ ์คํธ())
๋ค ์์ธกํ ์ ์๋ ๊ฐ์ ํ ์คํธํ ๋๋ mockingํ๊ฑฐ๋, ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๊ธฐ๋ ํฉ๋๋ค :)
์ถ๊ฐ๋ก, ์ง๊ธ ์ธํฐํ์ด์ค์ ์ด๋ฅผ ์ด์ฉํ ํ ์คํธ ์ฝ๋๊ฐ ์ ๊ตฌํ๋์ด์๋์ง ๊ถ๊ธํฉ๋๋ค!
FakeShuffledCardsGenerator์์ ๊ณ ์ ๋ cards๋ง ๋์ฌ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณด์ด๋๋ฐ, FakeShuffledCardsGenerator์ ์ํ๋ฅผ ๊ฐ์ง๊ฒ ํ๊ณ , ์์ฑํ ๋๋ง๋ค ๋ฃ์ด์ฃผ๊ณ generateShuffledCards์์ ์๋ตํ๊ฒ ํด๋ ์ข์ ๊ฒ ๊ฐ์์~
There was a problem hiding this comment.
์ํ๋ฅผ ๊ฐ๊ฒํ๋ฉด ํ
์คํธ๋ง๋ค ๋ค๋ฅธ ์นด๋๋ก ๋ฃ์ด์ค ์ ์์ด์, ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ข๊ฒ ๋ค์!
๋ฐ์ํด๋ณด๊ฒ ์ต๋๋ค ๐
class FakeShuffledCardsGenerator implements CardsGenerator {
private final List<Card> cards;
public FakeShuffledCardsGenerator(List<Card> cards) {
this.cards = cards;
}
public Cards generate() {
return new Cards(cards);
}
}| if (retry >= MAX_RETRY) { | ||
| throw new IllegalStateException("์ ๋ ฅ ํ์๋ฅผ ์ด๊ณผํ์ต๋๋ค."); | ||
| } |
There was a problem hiding this comment.
์
๋ ฅ ํ์์ ๋ํ ์ ํ์ ๋๊ณ ์ด ํ์๋ฅผ ๋์ด๊ฐ๋ฉด ๊ฒ์์ด ์ข
๋ฃ๋๋๋ก ๊ตฌํํด์ฃผ์
จ๊ตฐ์!
์ฌ์ฉ์์ ๋จ์ ์ค์๋ก ๊ฒ์์ด ์ข
๋ฃ๋์ด ์ฌ์ฉ์์ ๋ถํธํจ์ ๊ฐ์ ํ ๋ถ๋ถ์ด๋ผ๊ณ ๋ณด์ด๋ค์! ๋ฉ์ ธ์! ๐ฏ
(๋ฐ์ํ์ง ์์๋ ๋จ) ๋ค๋ง ์๋น์ค ๊ฐ๋ฐ์๋ก์ ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ํฌ์ธํธ๋ ๋ช ํ๊น์ง ์ฌ์๋ํ๋ ๊ฒ์ด ์ข์๊น~? ์ ๋ํ ๋ถ๋ถ์ด์์. ๋ง๋ค๊ณ ์ข์ง๋ ์๊ณ ์ ๋ค๊ณ ์ข์ง๋ ์์ง์!
There was a problem hiding this comment.
๋ณดํต ๋น๋ฐ๋ฒํธ๋ 5ํ, 10ํ ๊ธฐ์ค์ผ๋ก ๋ง์ด ์ค์ ํ๋๋ฐ
๊ฒ์์ด๊ธฐ ๋๋ฌธ์ 5ํ๋ณด๋ค๋ 10ํ๊ฐ ์ ์ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค!
src/main/java/domain/Dealer.java
Outdated
| import java.util.ArrayList; | ||
| import java.util.List; |
There was a problem hiding this comment.
์ฌ๊ธฐ ๋ฟ๋ง์๋๋ผ, ์ ์ฒด์ ์ผ๋ก ์ฌ์ฉ๋์ง ์๋ import๊ฐ ์์ด์.
์ต๊ด์ ์ผ๋ก IDE์์ ์ ๊ณตํด์ฃผ๋ Code Reformat๋ฅผ ํ์ฉํ๋ฉด ์ข์์ :)
| public class Player { | ||
| private static final int ACE_ADDITIONAL_SCORE = 10; | ||
| private static final int ACE_ADDITION_NONE_SCORE = 0; | ||
| protected final List<Card> cards = new ArrayList<>(); |
There was a problem hiding this comment.
Cards๋ฅผ ์ฌ์ฉํ์ง ์์ผ์ ์ด์ ๊ฐ ์๋์?
There was a problem hiding this comment.
Player๊ฐ ์ถ๊ฐ๋ก ์นด๋๋ฅผ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ผ๊ธ ์ปฌ๋ ์ ์ธ Cards๋ณด๋ค๋ List๊ฐ ์ ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค!
There was a problem hiding this comment.
ํ ๊ทธ๋ผ ์ผ๊ธ์ปฌ๋ ์
์ ๋ง๋ ์๋ฏธ๊ฐ ์์ง ์์๊น์!?
Cards์๋ ์นด๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ๊ฒํ๋ฉด ์๋๋์?
There was a problem hiding this comment.
Cards๋ฅผ ์ ์ฒด ์นด๋ ๋ฌถ์์ด๋ผ ์๊ฐํด์ Player์์ ์ฌ์ฉํ์ง ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์ ์๊ฐํด๋ณด๋, ์ ์ฒด ์นด๋ ๋ฌถ์๊ณผ ํด๋ ์ด์ด๊ฐ ๊ฐ์ง ์นด๋ ๋ฌถ์์ ํ๋์ ์ฐจ์ด๊ฐ ์์ด์ ๋ฐ๋ก ๊ตฌ๋ถํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๊ฒ ๋ค์.
์ฌ์ดํด 2์์ Deck(์ ์ฒด ์นด๋)๊ณผ Cards(ํ๋ ์ด์ด ์์ ์นด๋)๋ก ๋ถ๋ฆฌํด์ ๊ตฌํํ๊ณ ,
ํ๋ ์ด์ด์์ Cards๋ผ๋ ์ผ๊ธ์ปฌ๋ ์
์ ์ฌ์ฉํ๋๋ก ์์ ํ๊ฒ ์ต๋๋ค.๐
src/main/java/domain/Player.java
Outdated
| return cards; | ||
| } | ||
|
|
||
| public int getCardCount() { |
There was a problem hiding this comment.
ํ ์คํธ์์๋ง ์ฌ์ฉ๋๋ ๋ฉ์๋๋ก ๋ณด์ฌ์.
There was a problem hiding this comment.
์ ๋ ํ
์คํธ๋ง์ ์ํด์ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ ๊ฒ์ ๋ํด ๊ณ ๋ฏผ์ ๋ง์ด ํ์์ต๋๋ค.
๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ๋ชปํ ์ํ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ, ์ถ๊ฐ๋ก ํ์๋ค๊ณผ ๋
ผ์๋ฅผ ํด๋ณด๊ณ ๋๋
ํ
์คํธ๋ง์ ์ํ ๋ฉ์๋๋ ์ต์ํ์ผ๋ก ํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๋ฉ์๋ ๋ณด๋ค๋ ์์ getCards ๋ฉ์๋๋ฅผ ์ด์ฉํด์ cards.size()๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด,
getCardCount()๋ ์ฌ์ฉํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค!
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class Dealer extends Player { |
There was a problem hiding this comment.
Dealer๊ฐ Player๋ฅผ ์์๋ฐ๋๋ก ๊ตฌํํ์ ์ด์ ๊ฐ ์๋์?
๋๋ฌ์ ํ๋ ์ด์ด๊ฐ is-a ๊ด๊ณ๋ผ๊ณ ์๊ฐํ์๋์ง ๊ถ๊ธํด์ :)
There was a problem hiding this comment.
์ด ๋ถ๋ถ์ ํ์ด์ ๊ณ ๋ฏผํ๋ ์ ์ด์์ต๋๋ค!
๋๋ฌ๋ ์ฌ์ค ํ๋ ์ด์ด๋ก๋ ์ญํ ์ ํ๊ณ ์์ด์, ๋๋ฌ์ ํ๋ ์ด์ด์ ํ๋์ด ๊ฒน์น๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๋ณธ์ธ์ ์นด๋๋ฅผ ์์ ํ๋ค.
- ๋ณธ์ธ ์นด๋์ ํฉ์ ๊ตฌํ๋ค.
ํ์ด๊ฐ ํ๋์ด ๊ฒน์น๋ค๋ฉด ์์์ ๋ฐ์์ ์ฌ์ฉํ์๊ณ ์ ์ํด์ฃผ์ด์, ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํด๋ณด์์ต๋๋ค.
์ฌ์ฉํด๋ณด๋ ์ค๋ณต ์ฝ๋๊ฐ ์์ด์ง๋ ์ฅ์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค๋ง, ๊ฐํ ๊ฒฐํฉ์ด ์๊ธฐ๊ณ , ํด๋์ค์ ์บก์ํ๊ฐ ๊นจ์ง ์ ์๋ค๋ ์ ์์, ์์ ๋์ ํด๋น ์ญํ ๋ง ๊ฐ์ง ํด๋์ค๋ก ์์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค!
There was a problem hiding this comment.
๋ค ๋ง์์ฃผ์ ๋๋ก ์ถ์ํด๋์ค๋ฅผ ์์ํ๋ ๊ฒ์ ๊ฒฐํฉ๋๊ฐ ์์ฒญ ๋์ ์์
์ด์์.
๊ทธ๋ ๋ค๋ณด๋ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ์์ ์ด ์ด๋ ต์ง์!
ํ๋ ์ด์ด๋ ์นด๋๋ฅผ ๊บผ๋ด๋ ํ์๋ฅผ ํ๋๋ฐ ์์๋ฐ๋ ๋๋ฌ๋ ๋ถํ์ํ ํ์์ธ๋ฐ ํ ์ ์๊ฒ ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ์
๋๋ฌ๊ฐ ๋ถํ์ํ ํ์๋ฅผ ํ ์ ์๊ฒ ์ด์ด๋๋๊ฒ ๋ง์๊น์?
There was a problem hiding this comment.
๋๋ฌ์๊ฒ ๋ถํ์ํ ํ์๋ ๋ง์๋๋ ๊ฒ์ด ์์ ์ ์ด๊ฒ ๋ค์. ๐
์์๋ฐ๋ ๊ฐ์ฒด๋ ํด๋น ํ๋์ ํ ์ ์๊ฒ private๋ก ์์ ํ๊ฒ ์ต๋๋ค!
| 4. if๋ฌธ ๋ถ๊ธฐ์ฒ๋ฆฌ์ ๋ํด ๊ฐ์ด๋๋ผ์ธ์ ์๊ณ ์ถ์ต๋๋ค. enum์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ๋ switch ์์ด ๊ตฌํํ๊ฒ ๋๋ฉด | ||
| if๋ฌธ์ด ์ฝ๋์ ๋ง์ด ๋์ค๊ฒ ๋๋ ๊ฒ์ ๊ฒฝํํ์ต๋๋ค. `values()`๋ฅผ ๊ธฐ๋ฐ์ผ๋ก for๋ฌธ์ ๋๋ ค ์ ์ฐํ๊ฒ ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ๋ ๊ทธ๋ ๊ฒ ํด๊ฒฐํ์ง๋ง, ์ด๋๋ ๋งค๋๋ฝ์ง ์๊ฒ | ||
| ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ์ด๋๋ ๋ค๋ฅธ ๋ฐฉํฅ์ด ์์์ง ๊ถ๊ธํฉ๋๋ค. |
There was a problem hiding this comment.
์ข์ ๊ณ ๋ฏผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค~! if๋ฅผ ์์ ํ ์์ ๋ ๊ฒ์ด ํญ์ ์ข์ ๋ฐฉํฅ์ ์๋๊ธฐ ๋๋ฌธ์, ์ํฉ์ ๋ฐ๋ผ ์ด๋ค ๋ฐฉ์์ด ๋ ์ ์ ํ์ง ๊ณ ๋ฏผํด ๋ณด๋ ๊ฒ์ด ์ค์ํด์!
enum์ ์ฌ์ฉํ ๋ switch ๋์ if๊ฐ ๋ง์์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ด๋๋ ์กฐ๊ฑด ๋ถ๊ธฐ ์์ฒด๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉํฅ์ด ์๋์ง ๋จผ์ ๊ณ ๋ฏผํด ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด enum์ ๊ฐ ์ํฉ์ ๋ง๋ ํ๋์ด๋ ๋ก์ง์ ํจ๊ป ๋์ด ๋ถ๊ธฐ๋ฅผ enum ๋ด๋ถ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ๋ ํ๋์ ๋ฐฉ์์ด ๋ ์ ์์ ๊ฒ ๊ฐ์์ :)
There was a problem hiding this comment.
enum ๋ด๋ถ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ ๋๋ฌด ์ข๋ค์!
์๊ฐํด๋ณด๋ ํ๋ฆฌ์ฝ์ค ๋์์ ์ฝ๋๋ฅผ ๊ตฌํํ ๋๋, enum์ผ๋ก ๋ง๋ ํ์ enum ๊ฐ์ ์ํํด์ ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋๊ฒ ์๊ฐ๋๋ค์. if๊ฐ ๋ง์์ง๋ ๊ฒ์ ๋ง์ ์ ์๊ณ , ์ฝ๋๋ ํจ์ฌ ๊น๋ํด์ง ๊ฒ ๊ฐ์ต๋๋ค.
ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค!
ParkJiYeoung8297
left a comment
There was a problem hiding this comment.
ํผ๋๋ฐฑ ์ฃผ์
์ ๋๋ฌด ๊ฐ์ฌํฉ๋๋ค! ๋ง์ด ์๊ฐํด๋ณผ ์ ์๋ ๋ฆฌ๋ทฐ์ฌ์ ๋๋ฌด ๋์๋์์ด์.
๋ด์ผ ๋๋จธ์ง ์ปค๋ฉํธ์๋ ๋ฆฌ๋ทฐ ๋ฌ๊ฒ ์ต๋๋ค.
| public final class GameConstant { | ||
| public static final int ADDITIONAL_THRESHOLD = 16; | ||
| public static final int GAME_OVER_THRESHOLD_SCORE = 21; | ||
| } |
There was a problem hiding this comment.
์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋ ์์์ ๊ฒฝ์ฐ ๋ฐ๋ก ๋บ๊ณ , ํด๋์ค ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์์์ ๊ฒฝ์ฐ ํด๋์ค ๋ด๋ถ์ ์์นํ๋๋ก ํ์ต๋๋ค.
- ๋ธ๋์ญ์ ์กฐ๊ฑด โ 21
- ๋๋ฌ๊ฐ ์นด๋๋ฅผ ๋ ๋ฐ๋ ์กฐ๊ฑด โ 16
์ง๊ธ ๋ฆฌ๋ทฐ ์ฃผ์ ๋ด์ฉ์ผ๋ก ๋ค์ ์๊ฐํด๋ณด๋, 2๋ฒ์ ๊ฒฝ์ฐ์๋ ๋๋ฌ์๊ฒ๋ง ํด๋นํ๊ธฐ ๋๋ฌธ์ ๋๋ฌ ํด๋์ค์ ๋๋๊ฒ ๋์๊ฑฐ ๊ฐ๋ค์.
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class Dealer extends Player { |
There was a problem hiding this comment.
์ด ๋ถ๋ถ์ ํ์ด์ ๊ณ ๋ฏผํ๋ ์ ์ด์์ต๋๋ค!
๋๋ฌ๋ ์ฌ์ค ํ๋ ์ด์ด๋ก๋ ์ญํ ์ ํ๊ณ ์์ด์, ๋๋ฌ์ ํ๋ ์ด์ด์ ํ๋์ด ๊ฒน์น๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๋ณธ์ธ์ ์นด๋๋ฅผ ์์ ํ๋ค.
- ๋ณธ์ธ ์นด๋์ ํฉ์ ๊ตฌํ๋ค.
ํ์ด๊ฐ ํ๋์ด ๊ฒน์น๋ค๋ฉด ์์์ ๋ฐ์์ ์ฌ์ฉํ์๊ณ ์ ์ํด์ฃผ์ด์, ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํด๋ณด์์ต๋๋ค.
์ฌ์ฉํด๋ณด๋ ์ค๋ณต ์ฝ๋๊ฐ ์์ด์ง๋ ์ฅ์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค๋ง, ๊ฐํ ๊ฒฐํฉ์ด ์๊ธฐ๊ณ , ํด๋์ค์ ์บก์ํ๊ฐ ๊นจ์ง ์ ์๋ค๋ ์ ์์, ์์ ๋์ ํด๋น ์ญํ ๋ง ๊ฐ์ง ํด๋์ค๋ก ์์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค!
| public class Player { | ||
| private static final int ACE_ADDITIONAL_SCORE = 10; | ||
| private static final int ACE_ADDITION_NONE_SCORE = 0; | ||
| protected final List<Card> cards = new ArrayList<>(); |
There was a problem hiding this comment.
Player๊ฐ ์ถ๊ฐ๋ก ์นด๋๋ฅผ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ผ๊ธ ์ปฌ๋ ์ ์ธ Cards๋ณด๋ค๋ List๊ฐ ์ ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค!
| } | ||
|
|
||
| private int calculateAceScore() { | ||
| if (!isAceExist() || calculateScore() > 11) { |
There was a problem hiding this comment.
11๋ ์์๋ก ๋๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!
์ซ์๋ ๋ฌธ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ฑฐ๋ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฐ์ ์์๋ก ๋ง๋ค๋ฉด,
๊ด๋ฆฌํ๊ธฐ๋ ์์ํ๊ณ ํ
์คํธ์์๋ ๋์ผํ ๊ฐ์ ์ฌ์ฉํ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
src/main/java/domain/Player.java
Outdated
| return cards; | ||
| } | ||
|
|
||
| public int getCardCount() { |
There was a problem hiding this comment.
์ ๋ ํ
์คํธ๋ง์ ์ํด์ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ ๊ฒ์ ๋ํด ๊ณ ๋ฏผ์ ๋ง์ด ํ์์ต๋๋ค.
๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ๋ชปํ ์ํ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ, ์ถ๊ฐ๋ก ํ์๋ค๊ณผ ๋
ผ์๋ฅผ ํด๋ณด๊ณ ๋๋
ํ
์คํธ๋ง์ ์ํ ๋ฉ์๋๋ ์ต์ํ์ผ๋ก ํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๋ฉ์๋ ๋ณด๋ค๋ ์์ getCards ๋ฉ์๋๋ฅผ ์ด์ฉํด์ cards.size()๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋ฉด,
getCardCount()๋ ์ฌ์ฉํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค!
| Cards cards = CardGenerator.generate(); | ||
| cards.shuffle(); |
There was a problem hiding this comment.
ํผ๋๋ฐฑ ์ฃผ์ ๋๋ก CardsGenerator๊ฐ ๋ ์ ์ ํ ๊ฒ ๊ฐ๋ค์.
BlackjackService๊ฐ cards๋ฅผ shuffleํ๋ ๋ถ๋ถ๋ ํ์ด๋ ๋
ผ์ํ๋ ๋ถ๋ถ์ธ๋ฐ์
์ ๋ shuffle์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํด๋น ์ฝ๋๋ฅผ ์์ฑํ ๋๋ ํ์ด์๊ฒ ์ ๋๋ก ์ค๋ช
ํ์ง ๋ชปํด์,
์ฐ์ ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ๋ชฉํ๋ก Service์ ์์ฑ ํ ๋ฆฌํฉํ ๋งํ๊ธฐ๋ก ํ์์ต๋๋ค.
ํผ๋๋ฐฑ ์ฃผ์ ๋๋ถ์ ๋ค์ ํ๋ฒ ๊ณ ๋ฏผํ๊ณ ๊ฒฐ๋ก ์ ๋ด๋ ค๋ดค์ต๋๋ค!
์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๋ฉด Service์ shuffle์ ๋ํ ์์กด์ฑ์ด ๋ฎ์์ง๊ณ , ์ธ๋ถ์์ shuffle ๊ฐ์ mocking ํด์ ๋ฃ์ด์ค ์ ์์ด ํ
์คํธ์ ์ฉ์ดํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ์์ ํ๋ค๋ฉด ์ธ๋ถ์์ ์์กด์ฑ ์ฃผ์
์ผ๋ก shuffle์ ์ธํฐํ์ด์ค๋ฅผ ๋ฃ์ด์ค ๊ฒ ๊ฐ์ต๋๋ค.
| import java.util.Map; | ||
|
|
||
| public class BlackjackResult { | ||
| private final Map<String, MatchCase> playerWinningMap = new HashMap<>(); |
There was a problem hiding this comment.
์ ๊ฐ ์ผ๊ธ ์ปฌ๋ ์ ์ ๋ํ ๊ฐ๋ ์ด ํ์คํ์ง ์์์ ์ฐพ์๋ดค๋๋ฐ, ์๋์ ๊ฐ์ด ๋์์ต๋๋ค.
์ผ๊ธ ์ปฌ๋ ์ (First Class Collection)์ ์ปฌ๋ ์ (List, Set, Map ๋ฑ)์ Wrappingํ๋ฉด์,
ํด๋น ์ปฌ๋ ์ ์ด์ธ์ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ฐ์ง์ง ์๋ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฐ์ ์ฝ๋ฉํธ ๋ฌ์์ฃผ์ ํด๋น ํด๋์ค๋ ๋ฐ์ ๋ค๋ฅธ ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ผ๊ธ ์ปฌ๋ ์
์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ ํ์ด๊ฐ ์ด ํด๋์ค๋ฅผ ๋ง๋ค์์ ๋๋ ๋จ์ ์ง๊ฒ์ฉ์ด๋ ๊ฒฐ๊ณผ ์ ์ฅ์ฉ์ผ๋ก ํด๋์ค๋ฅผ ๋ง๋ค์๋ ๊ฒ ๊ฐ์์.
์ง๋ฌธ ์ฃผ์ จ๋ ์ผ๊ธ ์ปฌ๋ ์ ์ ์ ์ฌ์ฉํด์ผํ๋์ง์ ๋ํด์๋ ์๋์ ๊ฐ์ด ์ ๋ฆฌํด๋ณด์์ต๋๋ค!
- ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ ๋ณด์ฅ (๋๋ ์บก์ํ)
- ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ ๋น์ฆ๋์ค์ ์ธ ๊ฒ์ฆ๊ณผ ํ๋์ ๋ฌถ์ด์ ํด๋์ค ๊ตฌ์ฑ ๊ฐ๋ฅ (์์ง์ฑ์ ๋์ฑ ํฅ์์์ผ์ค)
์ฐ์ ์ผ๊ธ ์ปฌ๋ ์
์ผ๋ก ํด๋์ค๋ฅผ ์์ฑํ๊ณ , ๋ด๋ถ์์ ์ถ๊ฐ, ์์ , ์ญ์ ๋ฑ์ private์ผ๋ก ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด
์ธ๋ถ์์๋ ์ถ๊ฐ, ์์ , ์ญ์ ๋ฑ์ ์ํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํด์ค๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ผ๊ธ ์ปฌ๋ ์
๋ด๋ถ์์๋ง ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋์ฑ ์บก์ํ์ ์ฉ์ดํด์ง๋๋ค.
List ์ ๊ฐ์ด ์นด๋ ํ๋๊ฐ ์๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ผ๋ก ๊ฒ์ฆ์ด๋ ํ๋์ ํ๊ณ ์ถ์ ๋,
์ผ๊ธ ์ปฌ๋ ์
์ ์ฌ์ฉํด์ ๋ด๋ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ์์ง์ฑ์๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํผ๋๋ฐฑ ์ฃผ์ ๋๋ถ์ ์ ๋ชฐ๋๋ ์ผ๊ธ ์ปฌ๋ ์
์ ๋ํด ์กฐ๊ธ์ด๋๋ง ์๊ฒ๋ ๊ฒ ๊ฐ์์. ๊ฐ์ฌํฉ๋๋ค!
ํน์ ๋ค๋ฅด๊ฒ ์๊ฐํ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ฆฌ๋ทฐ ๋ถํ๋๋ฆฝ๋๋ค.
| 4. if๋ฌธ ๋ถ๊ธฐ์ฒ๋ฆฌ์ ๋ํด ๊ฐ์ด๋๋ผ์ธ์ ์๊ณ ์ถ์ต๋๋ค. enum์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ๋ switch ์์ด ๊ตฌํํ๊ฒ ๋๋ฉด | ||
| if๋ฌธ์ด ์ฝ๋์ ๋ง์ด ๋์ค๊ฒ ๋๋ ๊ฒ์ ๊ฒฝํํ์ต๋๋ค. `values()`๋ฅผ ๊ธฐ๋ฐ์ผ๋ก for๋ฌธ์ ๋๋ ค ์ ์ฐํ๊ฒ ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ๋ ๊ทธ๋ ๊ฒ ํด๊ฒฐํ์ง๋ง, ์ด๋๋ ๋งค๋๋ฝ์ง ์๊ฒ | ||
| ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ์ด๋๋ ๋ค๋ฅธ ๋ฐฉํฅ์ด ์์์ง ๊ถ๊ธํฉ๋๋ค. |
There was a problem hiding this comment.
enum ๋ด๋ถ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ ๋๋ฌด ์ข๋ค์!
์๊ฐํด๋ณด๋ ํ๋ฆฌ์ฝ์ค ๋์์ ์ฝ๋๋ฅผ ๊ตฌํํ ๋๋, enum์ผ๋ก ๋ง๋ ํ์ enum ๊ฐ์ ์ํํด์ ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋๊ฒ ์๊ฐ๋๋ค์. if๊ฐ ๋ง์์ง๋ ๊ฒ์ ๋ง์ ์ ์๊ณ , ์ฝ๋๋ ํจ์ฌ ๊น๋ํด์ง ๊ฒ ๊ฐ์ต๋๋ค.
ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค!
src/main/java/view/OutputView.java
Outdated
| public static void displayMatchResult(BlackjackResultDto resultDto) { | ||
| System.out.printf("## ์ต์ข ์นํจ\n๋๋ฌ: %d์น %dํจ\n", resultDto.winCount(), resultDto.loseCount()); | ||
| Map<String, MatchCase> resultMap = resultDto.matchResultMap(); | ||
| for (String playerName : resultMap.keySet()) { |
There was a problem hiding this comment.
entrySet()์ ์ฌ์ฉํ๋ฉด ํค์ ๊ฐ์ ๋์์ ๊ฐ๊ณ ์ฌ ์ ์๊ตฐ์! ๊ฐ์ฌํฉ๋๋ค.
| return input.equals("y"); | ||
| } | ||
|
|
||
| private String readInput(List<Validator> validators) { |
There was a problem hiding this comment.
์ ๋ ฅ๊ฐ ๊ฒ์ฌ์์ ๊ฒ์ฆ์ ์ฌ๋ฌ ๊ฐ ํ ์๋ ์์ด์, ์ข ๋ ์์ ๋กญ๊ฒ ํ๊ธฐ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Validator๋ฅผ ์ธํฐํ์ด์ค๋ก ๊ตฌํํด์ผ, Validator ๋ฌถ์์ ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ถ๊ฐํ ์ ์์ด์
String input = readInput(List.of(
Validator::validateNotBlank,
Validator::validateChoice
));Consumer๋ฅผ ์ด์ฉํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง,
"List<Validator> validators"๊ฐ "List<Consumer> validators"์ ๊ฐ์ด ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ธฐ๋ ํ๊ณ ,
๊ฒ์ฆ์ด๋ผ๋ ์๋ฏธ์ Validator๋ฅผ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋จํ์ต๋๋ค.
๊ฐ๋ฒผ์ด ๊ฒ์ฆ์ ๊ฒฝ์ฐ ๋ง์ํด์ฃผ์ ๋๋ก static ๊ฒ์ฆ ์ฝ๋๋ก ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค! ๐
์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ์ ์ฌํญ
์ง๋ฌธ
public static final int ADDITIONAL_THRESHOLD = 16;
|
|
์๋
ํ์ธ์ ์ฃผ๋. ์ปค๋ฉํธ์ ๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ๋ํด์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
์ด๋ฒ ๋ฏธ์
์์๋ ํ
์คํธ์ ๋ํด์ ๊ฐ์กฐํ๋ ๊ฒ ๊ฐ์์, ํ
์คํธ์ ๋ํด ์ง์คํด๋ณด๊ณ ์ถ์ด์. ์ฌ์ดํด 2๊น์ง ํ๋ฉด์ ์๋์ ์ง๋ฌธ์ ์ ์ ๋๋ฆ๋๋ก ๋ต์ ๋ด๋ ค๋ณด๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค!
|
jurlring
left a comment
There was a problem hiding this comment.
์ํฐ ์๋
ํ์ธ์!
์์ ํ ๋ถ๋ถ๊ณผ ์ฌ์ญค๋ณด๊ณ ์ถ์ ๋ถ๋ถ ์ฝ๋ฉํธ๋ก ๋จ๊ฒจ๋์์ต๋๋ค~!
๋ค์ ์ฌ์ดํด์์ ๋ฐ์์ฃผ์ธ์ :)
|
|
||
| import java.util.Objects; | ||
|
|
||
| public class Card { |
There was a problem hiding this comment.
record์ ๋ํด์ ์์๋์~? ํ์ตํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์ :)
There was a problem hiding this comment.
์ ๋ Card๋ฅผ ๋๋ฉ์ธ ๋ชจ๋ธ๋ก ์๊ฐํ๊ณ record๋ฅผ ์ฌ์ฉํ์ง ์์๋๋ฐ,
๋ค์๋ณด๋ ๋๋ฉ์ธ ๋ชจ๋ธ ๋ด์์ VO์ ๊ฐ์ ์ฑ๊ฒฉ์ ๋๊ณ ์๋ค์.
์ง๊ธ๊น์ง record๋ Dto์์๋ง ์ฌ์ฉํ์๋๋ฐ, VO์์๋ ์ฌ์ฉํ๋ค๋ ์ ์ ๋ฐฐ์ธ ์ ์์์ต๋๋ค!
[Record ์ ๋ฆฌ]
- ๋ชจ๋ ํ๋๊ฐ private final๋ก ์ ์ธ๋์ด ๋ถ๋ณ ๊ฐ์ฒด์ด๋ค. (setter ์ ๊ณต X)
- equals(), hashcode()๋ฑ์ ์๋์ ๋ง๋ค์ด์ค์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
- Dto, Vo ๋ฑ์์ ๋ถ๋ณ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋, ์ฌ์ฉ๋ ์ ์๋ค.
| import java.util.List; | ||
| import java.util.function.Supplier; | ||
|
|
||
| public class BlackjackController { |
There was a problem hiding this comment.
MVC ํจํด์ ๊ณ ๋ คํด์ Controller๋ฅผ ๋ง๋ค์ด์ฃผ์ ๊ฑธ๊น์?
ํจํด์ ๊ฐ๋ฐ์๋ค์ด ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ฒช์ผ๋ฉด์, ์ด๋ฐ ์ํฉ์์๋ ์ด๋ ๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค๋ ๊ฒฝํ์ด ์์ฌ ๋ง๋ค์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์. ๊ทธ๋์ ๊ตฌ์กฐ๊ฐ ์ด๋ ์ ๋ ์ ํํ๋์ด ์์ด ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ์์ธกํ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ๋ ์๋ ๊ฒ ๊ฐ์์.
๊ทธ๋์ ์ด๋ฒ ๊ตฌํ์์ ์ MVC ํจํด์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ จ๋์ง ๊ถ๊ธํด์ ์ง๋ฌธ๋๋ ธ์ต๋๋ค ๐
๋ค๋ง Controller๋ผ๋ ํํ๊ฐ ์๋๋๋ผ๋ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์ํ ๊ฒ ๊ฐ์์.
ํจํด์ ์ฌ๋ฌ ๊ตฌํ ๋ฐฉ๋ฒ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๊ณ ์ํด์ผ ํ๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ํจ๊ป ๋ง์๋๋ฆฌ๊ณ ์ถ์์ด์~!
| Cards cards = CardGenerator.generate(); | ||
| cards.shuffle(); |
There was a problem hiding this comment.
์ธํฐํ์ด์ค ์ฌ์ฉ
shuffle์ ๋๋ค ์ถ์ถ์ฒ๋ผ ํต์ ํ ์ ์๋ ๊ฐ์ด๋ผ,
์ด ๊ฐ์ ํ ์คํธ์์ ํธํ๊ฒ ์กฐ์ํด์ฃผ๊ธฐ ์ํด CardsGenerator๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋๋ถ์, FakeShuffledCardsGenerator๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ์ ์ ๊ฐ ์ง์ ์์๋ฅผ ์กฐ์ํ ์ ์์์ต๋๋ค.
ํต์ ํ ์ ์๋ ๊ฐ์ ํ ์คํธ ํ ๋, ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ์ฃผ๋ก ํ๋์? ์๋๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ์๋์?
(์ฐธ๊ณ ํ ์คํธ ์ฝ๋ : BlackjackServiceTest์ ์ ํ_์นด๋_์์๋๋ก_๋ฐฐ๋ถ_์ ์_ํ ์คํธ())
๋ค ์์ธกํ ์ ์๋ ๊ฐ์ ํ ์คํธํ ๋๋ mockingํ๊ฑฐ๋, ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๊ธฐ๋ ํฉ๋๋ค :)
์ถ๊ฐ๋ก, ์ง๊ธ ์ธํฐํ์ด์ค์ ์ด๋ฅผ ์ด์ฉํ ํ ์คํธ ์ฝ๋๊ฐ ์ ๊ตฌํ๋์ด์๋์ง ๊ถ๊ธํฉ๋๋ค!
FakeShuffledCardsGenerator์์ ๊ณ ์ ๋ cards๋ง ๋์ฌ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณด์ด๋๋ฐ, FakeShuffledCardsGenerator์ ์ํ๋ฅผ ๊ฐ์ง๊ฒ ํ๊ณ , ์์ฑํ ๋๋ง๋ค ๋ฃ์ด์ฃผ๊ณ generateShuffledCards์์ ์๋ตํ๊ฒ ํด๋ ์ข์ ๊ฒ ๊ฐ์์~
| 2. SOLID ์ธก๋ฉด์์ ๊ฐ์ ํ ์ฌํญ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. | ||
| ํนํ SRP ๋ฉด์์, ํ๋์ ์ฑ ์์ผ๋ก ๋ฉ์๋๊ฐ ์ ๊ตฌ์ฑ๋์ด์๋์ง ํผ๋๋ฐฑ ๋ฐ๊ณ ์ถ์ต๋๋ค. | ||
|
|
||
| 3. inputView์ OutputView๋ฅผ ์ ํธ๋ก ํ๋ ๊ฒ์ด ์ข์์ง, ์ธ์คํด์ค๋ก ํ๋ ๊ฒ์ด ์ข์ ์ง ๊ถ๊ธํฉ๋๋ค. |
There was a problem hiding this comment.
์๋น์ค๋ ๋๋ฉ์ธ์์ ์ธ์คํด์ค ๊ฐ์ฒด๋ก ๋๋ฉด ๊ฒฐ๊ตญ ๋์ผํ ๊ฑฐ๋ผ ๊ณ์ธต๊ฐ์ ๋ถ๋ฆฌ๊ฐ ๋ ๋ช
ํํ๋ค๋ ์ดํด๋ฅผ ๋ชปํ์ด์!
๋ ๋ฐฉ๋ฒ์ค์ ์ ๋ต์ ์์ง๋ง ๊ณ์ธต๋ง๋ค ๊ตฌํ์ ํต์ผํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค :)
์์ผ๋ก ์ด๋ค ๊ณ์ธต์ด๋ ์ ์ ๋์ด์งํ
๋ฐ, ๊ตฌํ ๋ฐฉ๋ฒ์ด ์ ๊ฐ๊ฐ์ด๋ฉด ๊ฐ๋ฐํ ๋๋ ์ด๋ค ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ผํ ์ง ๊ณ ๋ฏผ๋๊ณ ์ฝ์๋๋ ์ข ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ ๊ฒ ๊ฐ์์~~
์ ๋ต์ด ์๋ ๋ฌธ์ ๋ค์ ์ปจ๋ฒค์
์ ์ก๊ณ ํต์ผํ๋๊ฒ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์์ง๋ค๊ณ ์๊ฐํด์!
| - private์ธ ๋ฉ์๋ ํ ์คํธ๋ฅผ ์ํด์, ์ต์ข ๊ฒฐ๊ณผ dto๋ฅผ ๋น๊ตํด์ ๊ฐ์ ์ ์ผ๋ก private ๋ฉ์๋๋ฅผ ๊ฒ์ฆํ์ต๋๋ค. | ||
| ํ๋๋ง์ ๋ฉ์๋๊ฐ ์๋๋ผ ์ฌ๋ฌ private ๋ฉ์๋๋ฅผ ๊ฑฐ์น ๊ฒฐ๊ณผ์ธ๋ฐ, ์ต์ข dto๋ก ๊ฒ์ฆํ๋ ๋ฐฉ์์ด ํด๋น ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ค๊ณ ๋ณผ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. |
There was a problem hiding this comment.
๊ฐ์ฒด์ ๊ผญ ํด์ผํ๋ ํ์๋ฅผ public์ผ๋ก ๋๊ณ , ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ๋ฉ์๋ ๋ถ๋ฆฌ ํ๋ ๊ฒ์ด ๋์ ๋ private๋ก ๋ถ๋ฆฌํ๊ณ ์์ด์ :)
| public class Player { | ||
| private static final int ACE_ADDITIONAL_SCORE = 10; | ||
| private static final int ACE_ADDITION_NONE_SCORE = 0; | ||
| protected final List<Card> cards = new ArrayList<>(); |
There was a problem hiding this comment.
ํ ๊ทธ๋ผ ์ผ๊ธ์ปฌ๋ ์
์ ๋ง๋ ์๋ฏธ๊ฐ ์์ง ์์๊น์!?
Cards์๋ ์นด๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ๊ฒํ๋ฉด ์๋๋์?
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class Dealer extends Player { |
There was a problem hiding this comment.
๋ค ๋ง์์ฃผ์ ๋๋ก ์ถ์ํด๋์ค๋ฅผ ์์ํ๋ ๊ฒ์ ๊ฒฐํฉ๋๊ฐ ์์ฒญ ๋์ ์์
์ด์์.
๊ทธ๋ ๋ค๋ณด๋ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ์์ ์ด ์ด๋ ต์ง์!
ํ๋ ์ด์ด๋ ์นด๋๋ฅผ ๊บผ๋ด๋ ํ์๋ฅผ ํ๋๋ฐ ์์๋ฐ๋ ๋๋ฌ๋ ๋ถํ์ํ ํ์์ธ๋ฐ ํ ์ ์๊ฒ ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ์
๋๋ฌ๊ฐ ๋ถํ์ํ ํ์๋ฅผ ํ ์ ์๊ฒ ์ด์ด๋๋๊ฒ ๋ง์๊น์?
| public CardContentDto toCardContentDto() { | ||
| return new CardContentDto(this.name, this.cards); | ||
| } |
There was a problem hiding this comment.
๋๋ฉ์ธ์ด DTO๋ฅผ ์์๋ ๋ ๊น์? ๋๋ฉ์ธ๊ณผ DTO์ ๋ํด์ ๊ฐ๊ฐ ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํด์
There was a problem hiding this comment.
ํผ๋๋ฐฑ ์ฃผ์ ์ ํ๋ฒ ์๊ฐํด๋ณด๋, ๋๋ฉ์ธ์์ DTO๋ฅผ ๋ชจ๋ฅด๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!
DTO๋ ์ ์ก ๊ฐ์ฒด์ด๋ฉฐ, ๋ณ๊ฒฝ์ด ๋น๋ฒํ ์ ์์ต๋๋ค. (ex. ๊ณ ๊ฐ์ ์์ฒญ์ผ๋ก ์นด๋ ๊ทธ๋ฆผ ๊ฐ๋ ์ถ๊ฐ๋ก ๋ณด๋ด์ค์ผํ๋ค๋ฉด, dto๊ฐ ๋ณ๊ฒฝ๋๋ค.)
๊ทธ์ ๋ฐํด, ๋๋ฉ์ธ์ ์ต๋ํ ์บก์ํ๋์ด์๊ณ , ๋ณ๊ฒฝ์ ์ํฅ์ด ์ ์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
dto๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค, ๋๋ฉ์ธ์ ์์ ํด์ค์ผํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ ๊ฒ ๊ฐ์์.
๋๋ฉ์ธ์์๋ ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ , ์๋น์ค์์ dto๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๋ํด ์ฃผ๋๋ ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค!
| } | ||
|
|
||
| private int calculateAceScore() { | ||
| if (!isAceExist() || calculateScore() > 11) { |
There was a problem hiding this comment.
๋ฐ์์ด ๋์ง ์์ ๊ฒ ๊ฐ์์ ๐ฟ
| return action.get(); | ||
| } catch (IllegalArgumentException e) { | ||
| retry++; | ||
| System.out.println(e.getMessage()); |
There was a problem hiding this comment.
์ถ๋ ฅ๊ณผ ๊ด๋ จ๋ ํ์๋ฅผ controller ๊ฐ ํ๊ณ ์๋ค์ ๐ฟ
There was a problem hiding this comment.
OutputView์ ์ฑ ์์ธ๋ฐ, Controller๊ฐ ํ๊ณ ์๋ค์.๐ ์์ ํ๊ฒ ์ต๋๋ค!

๋ธ๋์ญ
์ฒดํฌ ๋ฆฌ์คํธ
์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
ํ๋๋ง์ ๋ฉ์๋๊ฐ ์๋๋ผ ์ฌ๋ฌ private ๋ฉ์๋๋ฅผ ๊ฑฐ์น ๊ฒฐ๊ณผ์ธ๋ฐ, ์ต์ข dto๋ก ๊ฒ์ฆํ๋ ๋ฐฉ์์ด ํด๋น ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ค๊ณ ๋ณผ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
SOLID ์ธก๋ฉด์์ ๊ฐ์ ํ ์ฌํญ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํนํ SRP ๋ฉด์์, ํ๋์ ์ฑ ์์ผ๋ก ๋ฉ์๋๊ฐ ์ ๊ตฌ์ฑ๋์ด์๋์ง ํผ๋๋ฐฑ ๋ฐ๊ณ ์ถ์ต๋๋ค.
inputView์ OutputView๋ฅผ ์ ํธ๋ก ํ๋ ๊ฒ์ด ์ข์์ง, ์ธ์คํด์ค๋ก ํ๋ ๊ฒ์ด ์ข์ ์ง ๊ถ๊ธํฉ๋๋ค.
if๋ฌธ ๋ถ๊ธฐ์ฒ๋ฆฌ์ ๋ํด ๊ฐ์ด๋๋ผ์ธ์ ์๊ณ ์ถ์ต๋๋ค. enum์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ๋ switch ์์ด ๊ตฌํํ๊ฒ ๋๋ฉด
if๋ฌธ์ด ์ฝ๋์ ๋ง์ด ๋์ค๊ฒ ๋๋ ๊ฒ์ ๊ฒฝํํ์ต๋๋ค.
values()๋ฅผ ๊ธฐ๋ฐ์ผ๋ก for๋ฌธ์ ๋๋ ค ์ ์ฐํ๊ฒ ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ๋ ๊ทธ๋ ๊ฒ ํด๊ฒฐํ์ง๋ง, ์ด๋๋ ๋งค๋๋ฝ์ง ์๊ฒํด๊ฒฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ์ด๋๋ ๋ค๋ฅธ ๋ฐฉํฅ์ด ์์์ง ๊ถ๊ธํฉ๋๋ค.
๊ตฌํ ๋ด์ฉ
ํ์ ์๊ตฌ ์ฌํญ ์ฒดํฌ๋ฆฌ์คํธ
์ถ๊ฐ๋ก ์ ์ํ ์ ์ฝ ์ฌํญ
๊ธฐ๋ฅ ๋ชฉ๋ก
ํ์ดํ๋ก๊ทธ๋๋ฐ ์ฌ์ ํ์ต
๋ฏธ์ ์ค ํ ์ผ
๋ฏธ์ ์ค ๊ธฐ๋ก
ํ์ ๊ธฐ๋ก:
์ ์ฉํ ๊ท์น : ๋ค์ค ์ฑ ์
์ฒ์ ๊ตฌํํ ๋, ์ฐ์ ๊ธฐ๋ฅ์ ๋จผ์ ๊ตฌํํ๋ ๊ฒ์ ์ด์ ์ ๋์๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ Controller์ run ๋ฉ์๋์ ๋ชจ๋ ๋ก์ง์ ์ง์ค๋์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋๋ฉ์ธ ์์ฑ๊ณผ ์ด๊ธฐ ์ค์ ์ ๊ดํ ๊ธฐ๋ฅ๋ค์ service ์ฝ๋์ ๋ถ๋ฆฌํ์๋ค.
ํ ์คํธ ์์ฑ์ด ์ด๋ ค์ ๋ ๊ณณ : ์ผ๊ธ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ฉด์ Cards์ ๊ธธ์ด๋ฅผ ํ ์คํธํ๊ธฐ ์ด๋ ค์ ๋ค.
๋งํ ์๊ฐ :
๊ณตํต๋๋ ๋ฉ์๋๋ฅผ ๋ชจ์ ํ๋์ ํด๋์ค๋ฅผ ๋ฐ๋ก ๊ตฌํํ๊ธฐ vs Player์ ๊ตฌํ ํ ์์๋ฐ์์ ์ฌ์ฉํ๊ธฐ
โ Player์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ Dealer๊ฐ ์ด๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ๋๋ก ํ์๋ค.
main์์ ์์ฑ ํ service ํ๋๋ก ๋๊ธฐ vs service ๋ฉ์๋ ๋ด์์ ์์ฑํ๊ธฐ
โ ํ๋๋ก ๋์ง ์๊ณ Service ๋ฉ์๋ ๋ด์์ ์์ฑํด์ Controller๋ก ๋๊ฒจ์ฃผ์๋ค.
shuffle์ ํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ฒ์ฆํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํด์,
์นด๋ ์ฌ์ด์ฆ ๋น๊ต๋ฅผ ํตํด ์ํ๋ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์๋์ง ํ ์คํธํ์๋ค.
์์. 1) ์นด๋ ์์ฑ ํ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์นด๋ 52์ฅ์ด ์์ฑ 2) ํ๋ ์ด์ด์ ๋๋ฌ๊ฐ ์ด๊ธฐ์ 2์ฅ์ฉ ๋๋ ๋ฐ์๋์ง
๋ฏธ์ ์๋ฃ ์กฐ๊ฑด
๊ธฐ๋ก
์ฒ์์ controller์์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ชจ์ฌ์์ด์ ๊ธฐ๋ฅ ๋ณ๋ก ํ ์คํธ๊ฐ ์ด๋ ค์ ๋ค
๊ณ ๋ฏผํ๋ ์
InputView,OutputView์ ํธ ํด๋์ค ์๋๋ฉด, ์ธ์คํด์ค ํด๋์ค๋ก?์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ์ ์ฌํญ (260311 ์ถ๊ฐ)
โ ์ธํฐํ์ด์ค ์ฌ์ฉ, ์ธ๋ถ์์ ์ธ์คํด์ค๋ฅผ ์ฃผ์ ํ๊ฒ๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด
ํ ์คํธ ์ ShuffledCardsGenerator๋ฅผ FakeShuffledCardsGenerator๋ก ๋์ฒดํด์
shuffle ๊ฐ์ ์กฐ์๊ฐ๋ฅํ๋๋ก ํจ.
์ง๋ฌธ
Dealer ํด๋์ค์ ๋ ์๋์ ์์์ ๊ฒฝ์ฐ outputView์์ Dealer.ADDITIONAL_THRESHOLD๋ผ๊ณ ์ฌ์ฉํด๋ ๋ ๊น์?
์บก์ํ์ ๊ด์ ์ผ๋ก Dealer ๋ด๋ถ๋ก ์ฎ๊ธด๊ฑด๋ฐ outputView์์ ์ฌ์ฉํ๋ฉด ์๋๋๋ก ์๋ํ๊ฒ ๋ง๋ ์ถ์ด์์.
์ฑ ์๋ง Dealer์๊ฒ ํ ๋นํ๊ณ , ์ฌ์ฉ์ ์ด์ฒํผ ์์์ฌ์ OutputView์์ ์ฌ์ฉํด๋ ์๊ด์์๊น์?
์ธํฐํ์ด์ค ์ฌ์ฉ
shuffle์ ๋๋ค ์ถ์ถ์ฒ๋ผ ํต์ ํ ์ ์๋ ๊ฐ์ด๋ผ,
์ด ๊ฐ์ ํ ์คํธ์์ ํธํ๊ฒ ์กฐ์ํด์ฃผ๊ธฐ ์ํด CardsGenerator๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋๋ถ์, FakeShuffledCardsGenerator๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ์ ์ ๊ฐ ์ง์ ์์๋ฅผ ์กฐ์ํ ์ ์์์ต๋๋ค.
ํต์ ํ ์ ์๋ ๊ฐ์ ํ ์คํธ ํ ๋, ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ์ฃผ๋ก ํ๋์? ์๋๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ์๋์?
์ถ๊ฐ๋ก, ์ง๊ธ ์ธํฐํ์ด์ค์ ์ด๋ฅผ ์ด์ฉํ ํ ์คํธ ์ฝ๋๊ฐ ์ ๊ตฌํ๋์ด์๋์ง ๊ถ๊ธํฉ๋๋ค!
(์ฐธ๊ณ ํ ์คํธ ์ฝ๋ : BlackjackServiceTest์ ์ ํ_์นด๋_์์๋๋ก_๋ฐฐ๋ถ_์ ์_ํ ์คํธ())
๋ ์ถ๊ฐํด์ผํ ํ ์คํธ๊ฐ ์์์ง ๊ถ๊ธํฉ๋๋ค.