[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ๋ฌํค ๋ฏธ์ ์ ์ถํฉ๋๋ค.#237
[๐ ์ฌ์ดํด1 - ๋ฏธ์
(๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ๋ฌํค ๋ฏธ์
์ ์ถํฉ๋๋ค.#237Jiihyun wants to merge 68 commits intowoowacourse:jiihyunfrom
Conversation
Position ๊ฐ์ฒด ์์ฑ ์ ํ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ, ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ๋ฅผ ๊ฒ์ฆํ๋ ์์ธ ํ ์คํธ๋ฅผ ์์ฑ ๋ฐ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค.
- ํ๊ณผ ์ด ์ฐจ์ด ๊ณ์ฐ ํ ์คํธ ์ถ๊ฐ
- ์์ข์ฐ๋ง ๊ฐ๋ฅ (ํ์ง ๊ตฌํx) - ํ๋ง๋ฒ ํ ์คํธ ์ถ๊ฐ
- ๋ณด๋ ์ด๊ธฐํ ํ ์คํธ ์ถ๊ฐ - ์ด๊ธฐํ ์ ๋ต ๊ตฌํ
- ์์ฐจ๋ฆผ ํ ์คํธ ์ถ๊ฐ
- ๊ธฐ์กด Piece ํ ์คํธ ์ ๊ฑฐ
- ์ฐจ ํ๋ง๋ฒ ํ ์คํธ ์ถ๊ฐ - Position ์์น 1์นธ ์ด๋ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๋ง ํ๋ง๋ฒ ํ ์คํธ ์ถ๊ฐ
- ์ ํ๋ง๋ฒ ํ ์คํธ ์ถ๊ฐ - DirectionInformation ๊ฐ ๊ฐ์ฒด ์ถ๊ฐ
- ๊ฒฝ๋ก ์ ๊ธฐ๋ฌผ ์๋ ์กฐ๊ฑด ํ์ธํ๋ ํ ์คํธ ์ถ๊ฐ
- ๊ฒฝ๋ก ์ ๊ธฐ๋ฌผ์ด 1๊ฐ ์๋ ์กฐ๊ฑด ํ์ธํ๋ ํ ์คํธ ์ถ๊ฐ
- ๊ธฐ๋ฌผ ์ด๋ ๊ฒ์ฆ ๊ธฐ๋ฅ ํ ์คํธ ์ถ๊ฐ
- ๊ธฐ๋ฌผ ์ด๋ ๊ธฐ๋ฅ ํ ์คํธ ์ถ๊ฐ
| public interface BoardChecker { | ||
|
|
||
| boolean hasPieceAt(Position position); | ||
|
|
||
| boolean isSameCampPieceAt(Position position, Camp camp); | ||
|
|
||
| boolean hasSamePieceRuleAt(Position position, PieceRule pieceRule); | ||
| } |
There was a problem hiding this comment.
[๐ด Must] Board์ Piece ์์กด์ฑ ๋ถ๋ฆฌ ๋ฐฉ์์ ๋ํ ๊ณ ๋ฏผ
Piece๊ฐ Board์ ์ง์ ์์กดํ์ง ์๋๋ก ํ๊ธฐ ์ํด BoardChecker ์ธํฐํ์ด์ค๋ฅผ ๋์
ํ์ต๋๋ค.
Board ๊ตฌํ์ฒด๋ getter, move ๋ฑ piece์ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์๋ ๊ธฐ๋ฅ์ ๋ํ ๊ถํ์ ๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ฐ๋ผ์ Piece๊ฐ ์ด๋์ ์ํด ๋ณด๋์์ ํ์ธํด์ผ ํ๋ ๊ธฐ๋ฅ๋ค๋ง ๋ชจ์ BoardChecker ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๊ณ , Piece๋ ์ด ํ์
์ ํตํด์๋ง ๋ณด๋๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
Piece๊ฐ Board์ ํ์ํ ๊ธฐ๋ฅ์๋ง ์์กดํ๋๋ก ์ ํํ๋ ค๋ ์๋๋ก ์ค๊ณํ ํ์ฌ ๋ฐฉ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค!
๊ฐ์ฒด ๊ฐ ์์กด์ฑ์ ์ค์ด๊ธฐ ์ํ ์ ์ ํ ์ถ์ํ๋ผ๊ณ ๋ณด์๋์? ์๋๋ฉด ๊ณผ๋ํ ๋ถ๋ฆฌ๋ผ๊ณ ์๊ฐํ์๋์?
There was a problem hiding this comment.
ํ์ฌ ๊ตฌ์กฐ์์๋ ๋ฐํ์์ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์์ ์ฅ์น๋ก ์ปดํ์ผํ์์ ์กฐํ๋ง ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ํจ๋ถ๋ก ๋ด๋ถ ์ํ๋ฅผ ์์ ํ์ง ๋ชปํ๊ฒ ๋ง์๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์ ํ ๊ฐ๋ค์. ์ต๊ณ ๋ก ์ข์๊ฑด ์ํ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉํฅ์ผ ๊ฒ ๊ฐ์๋ฐ ์๊ตฌ์ฌํญ์ ์ ์ ํ ๊ตฌํํ๋ ค๋ฉด ์ฝ์ง ์์ ๊ฒ ๊ฐ๋ค์.
| public static Map<Position, Piece> init(ElephantSetting hanChoice, ElephantSetting choChoice) { | ||
| Map<Position, Piece> board = new HashMap<>(); | ||
|
|
||
| for (InitialPiecePlacement piece : values()) { | ||
| board.put(new Position(piece.row, piece.column), new Piece(piece.pieceRule, piece.camp)); | ||
| } | ||
|
|
||
| board.putAll(hanChoice.createElephantOrder(Camp.HAN)); | ||
| board.putAll(choChoice.createElephantOrder(Camp.CHO)); | ||
| return board; | ||
| } |
There was a problem hiding this comment.
[๐ข Optional] ๋๋ผ์ ๋ฐ๋ฅธ ์์ฐจ๋ฆผ ํ์ ์์ ์ฑ์ ๋ํ ๊ณ ๋ฏผ
์ฅ๊ธฐ์์ ์/๋ง ๋ฐฐ์น ๋ฐฉ์์ ํํํ๊ธฐ ์ํด BoardInitializer์ InitialPiecePlacement์์ ElephantSetting์ enum์ผ๋ก ์ ์ํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
๋ค๋ง ์ด ๊ตฌ์กฐ์์๋ HAN๊ณผ CHO์ ๋งค๊ฐ๋ณ์ ์์๊ฐ ์๋ชป ์์ฌ ๋ค์ด๊ฐ๋๋ผ๋, ํ์ ์ด ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ๋จ๊ณ์์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ค๋ ์ ์ด ๊ณ ๋ฏผ์ด ๋์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋๋ผ์ ๋ฐ๋ผ ํ์
์ ๋ถ๋ฆฌํ์ฌ ํ์
์์ ์ฑ์ ๊ฐํํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํ์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ ๊ฒฝ์ฐ, ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๊ณ ์ผ๋ถ ์ค๋ณต ์ฝ๋๊ฐ ์๊ธธ ์ ์๋ค๊ณ ํ๋จํด, ํ์ฌ enum ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ธฐ๋ก ํ์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
์ด์ ๊ฐ์ ์ํฉ์์ ๊ฐ๋ฐ์๊ฐ ๋งค๊ฐ๋ณ์ ์์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ ์ ๋ฅผ ๋๊ธฐ๋ณด๋ค, ํ์
์์ค์์ ๋ ๊ฐํ๊ฒ ์ ์ฝ์ ๋๋ ์ค๊ณ๊ฐ ๋ ๋ฐ๋์งํ์ง ๊ถ๊ธํฉ๋๋ค.
์๋๋ฉด ํ์ฌ์ฒ๋ผ ๊ตฌ์กฐ์ ๋จ์ํจ์ ์ ์งํ๋ฉด์, ๋ด๋ถ ๊ฒ์ฆ ๋ก์ง์ด๋ ํ
์คํธ๋ก ๋ณด์ํ๋ ์ ๊ทผ์ด ๋ ์ค์ฉ์ ์ธ์ง์ ๋ํด ๋ฒ ๋ฃจ์ค์ ์๊ฒฌ์ด ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
์ ๋ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ๋จ์ํ๊ฒํ๊ณ ํ ์คํธ๋ก ๋ณด์ํ ๊ฒ ๊ฐ๋ค์. ํ ์คํธ ์ฝ๋๋ฅผ ์ ์์ฑํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๋ฏ์ด ๋๋ฉ์ธ ๊ท์น์ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค~
There was a problem hiding this comment.
์ค!! ํ
์คํธ๋ฅผ ํ์ฉํ ์ ์๋ค๋ ์๊ฐ์ ํ์ง ๋ชปํ๋ค์.
์์ผ๋ก ๋น์ทํ ์ํฉ์ด ์๊ธด๋ค๋ฉด ๊ตฌ์กฐ๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ธฐ๋ณด๋ค๋, ํ
์คํธ ์ฝ๋๋ฅผ ๋ ๊ผผ๊ผผํ ์์ฑํ๋ ๋ฐฉํฅ์ ๋จผ์ ๊ณ ๋ฏผํด๋ณด๊ฒ ์ต๋๋ค!
| @Override | ||
| public Map<Position, Piece> initialize() { | ||
| return InitialPiecePlacement.init(hanElephantSetting, choElephantSetting); | ||
| } |
There was a problem hiding this comment.
[โช๏ธ Curious] BoardInitializer ์ถ์ํ์ ํ์์ฑ์ ๋ํ ๊ณ ๋ฏผ
ํ์ฌ Board ํด๋์ค๋ BoardInitializer๋ฅผ ์ฃผ์
๋ฐ์ ๋ด๋ถ์์ ์ฅ๊ธฐํ์ ์ด๊ธฐํํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค.
BoardInitializer๋ ์ฅ๊ธฐํ ์ด๊ธฐํ๋ฅผ ๋ด๋นํ๋ ์ธํฐํ์ด์ค๋ก, ํนํ ํ
์คํธ ์ฝ๋์์ ๊ธฐ๋ฌผ ์์น ์ด๋ํ๋ ๋ฉ์๋ ํธ์ถ ์์ด ์ํ๋ ์ฅ๊ธฐํ ์ํ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋๋ก ํ๊ธฐ ์ํด ๋์
ํ์ต๋๋ค.
์ดํ ์ค์ ๊ฒ์ ๋ก์ง์ ๊ตฌํํ๋ฉด์ ์ด๊ธฐ ๋ฐฐ์น ๊ท์น์ ๊ด๋ฆฌํ๋ InitialPiecePlacement๋ฅผ ๋ณ๋๋ก ๋ง๋ค๊ฒ ๋์๊ณ , StandardBoardInitializer๋ ์ฅ๊ธฐํ์ ์ด๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น๋ฅผ ์ง์ ์์ฑํ๊ธฐ๋ณด๋ค๋ InitialPiecePlacement๋ฅผ ํธ์ถํ๋ ์ญํ ์ ํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์ด๋ก ์ธํด StandardBoardInitializer๊ฐ ์ค์ง์ ์ธ ๋ก์ง์ ์ํํ๊ธฐ๋ณด๋ค๋ InitialPiecePlacement๋ฅผ ํธ์ถํ๋ ๋จ์ ์์ ์ญํ ์ ๊ฐ๊น์ด ์ํ๊ฐ ๋์์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
- ํ์ฌ์ฒ๋ผ
Board์ด๊ธฐํ๋ฅผ ์ํ ์ธํฐํ์ด์ค(BoardInitializer)๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ ์ ํ ์ค๊ณ์ผ๊น์?
์๋๋ฉดBoardInitializer๋ฅผ ์ ๊ฑฐํ๊ณBoard์ ์์ฑ์ ๋งค๊ฐ๋ณ์๋ก Map์ ์ ๋ฌํ๋ ๋ฐฉ์์ด ๋ ๋จ์ํ๊ณ ๋ช ํํ ๊ตฌ์กฐ์ผ๊น์?
There was a problem hiding this comment.
์์ง Board๋ฅผ ์ด๊ธฐํํ๋ ๋ก์ง์ด ๋ณต์กํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก ์ธํฐํ์ด์ค๊น์ง ๋ง๋ค์ด๊ฐ๋ฉฐ ๊ตฌํํ ํ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. Board์์ Map์ผ๋ก ์ ๋ฌ ๋ฐ๋ ๋ฐฉ์์ด ๋ ๊น๋ํ ๊ฒ ๊ฐ๋ค์.
There was a problem hiding this comment.
๋์ํฉ๋๋ค!
ํ์ฌ BoardInitializer๋ ํน๋ณํ ์ญํ ์์ด Map์ ๊ฐ์ธ๊ณ ๋ง ์๊ธฐ ๋๋ฌธ์, ์ธํฐํ์ด์ค๋ฅผ ์ ๊ฑฐํ์ฌ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๊ณ Board๋ Map์ ์ ๋ฌ ๋ฐ๋๋ก ๋ฆฌํฉํ ๋ง ํ์์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
๋ค๋ง Map์ Board ์์ฑ ์์ ์ ์ง์ ์ฃผ์
๋ฐ๊ฒ ๋๋ฉด, ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ธ๋ถ์ ๋๋ฌ๋ ์บก์ํ๊ฐ ์ฝํด์ง๋ ๊ฒ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค!!
BoardInitializer๋ฅผ ๊ฒฐ๊ตญ ์ ํํ ์ด์ ๋ ์ฌ๊ธฐ์ ์์์ต๋๋ค. ๋ง์ฝ ๋ณด๋์ ๋ด๋ถ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ธ๋ถ์๋ BoardInitializer๋ง ๋
ธ์ถ๋๊ธฐ ๋๋ฌธ์, ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋๋ผ๋ ํด๋น ํด๋์ค๋ง ์์ ํ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค.
|
|
||
| public interface MoveCondition { | ||
|
|
||
| void checkPath(List<Position> path, Camp camp, BoardChecker board, PieceRule pieceRule); |
There was a problem hiding this comment.
[๐ด Must] ๊ณตํต ์ธํฐํ์ด์ค์ ํน์ ๊ตฌํ์ฒด ์ ์ฉ ์ธ์์ ๋ํ ๊ณ ๋ฏผ (MoveCondition์ PieceRule ์ธ์)
MoveCondition ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ EmptyCondition, OnePieceExistsCondition ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
EmptyCondition์์๋PieceRule์ ์ฌ์ฉํ์ง ์์ต๋๋ค.OnePieceExistsCondition์์๋ ๊ฐ์ ์ข ๋ฅ์ ๊ธฐ๋ฌผ์ธ์ง ๊ฒ์ฌํ๊ธฐ ์ํดPieceRule์ด ํ์ํฉ๋๋ค.
์ฒ์์๋ ์ธํฐํ์ด์ค์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ๋งค๊ฐ๋ณ์๋ง ์ ์งํ๊ณ ์ถ์ด, ํน์ ๊ตฌํ์ฒด์์๋ง ์ฌ์ฉํ๋ ์ธ์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉํฅ์ ๊ณ ๋ฏผํ์ต๋๋ค.
PieceRule์ ์ธํฐํ์ด์ค ๋ฉ์๋์ ์ธ์์์ ์ ๊ฑฐํ๊ณ , OnePieceExistsCondition์ด ๋ด๋ถ ํ๋๋ก PieceRule์ ๊ฐ์ง๋๋ก ํ๋ ๋ฐฉ์์
๋๋ค.
๋ค๋ง ์ด ๊ฒฝ์ฐ OnePieceExistsCondition์ ์์ฑํ ๋ PieceRule์ ํจ๊ป ์ฃผ์
ํด์ผ ํ๋๋ฐ, ํ์ฌ ๊ตฌ์กฐ์์๋ enum ์ด๊ธฐํ ์์ ๋ฌธ์ ๋ก ์๊ธฐ ์์ ์ ์ธ์๋ก ๋๊ธฐ๋ ํํ๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ๋ค ๋ณด๋ฉด ์ผ๋ถ ๊ตฌํ์ฒด์์๋ง ์ฌ์ฉํ๋ ์ธ์๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ์ด๋ฐ ์ํฉ์ ์ด๋ป๊ฒ ํ๋จํ๊ณ ํด๊ฒฐํ์๋์?
๊ตฌ์กฐ ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จ๋๋๋ผ๋ ์ผ๋ถ ๊ตฌํ์ฒด์์๋ง ์ฌ์ฉํ๋ ๋งค๊ฐ๋ณ์๋ผ๋ฉด ์ธํฐํ์ด์ค์์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ง๋์ง,
์ผ๋ถ ๊ตฌํ์ฒด๋ง ์ฌ์ฉํ๋๋ผ๋ ์ธํฐํ์ด์ค ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ๋๋ ๊ฒ์ด ์ ์ฒด ๊ตฌ์กฐ์ ์ฅ์ ์ด ๋ ํฌ๋ค๊ณ ํ๋จํ๊ธฐ์ ๊ทธ๋๋ก ์ ์งํ๋๊ฒ ์ข์์ง ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
๊ฐ๋ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค๋ก ์์ ๊ฐ๋ ์ ๋ฌถ๋ค๋ณด๋ฉด ์ง๊ธ์ฒ๋ผ ํน์ ์ผ์ด์ค์๋ง ํ์ํ ๋งค๊ฐ๋ณ์๊ฐ ์๊ธฐ๊ธฐ๋ ํฉ๋๋ค. ๊ฐ์ธ์ ํ๋จ์ ๋ฐ๋ผ ์ ์งํ ์ง ๋ง์ง๋ฅผ ์ ํ ํ ๋ฐ, ์ ๋ ์ต๋ํ ๋ถํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ๊ณ ๋ฏผํด๋ณด๊ธด ํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ ํ์ฌ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํด ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง ์์๊น ์ถ์ต๋๋ค. ๋ค๋ฅธ ๊ณณ์ ํผ๋๋ฐฑ์ ๋จ๊ฒจ๋์ง๋ง MoveCondition๊ณผ MoveStrategy๋ฅผ ํฉ์น๊ณ PieceRule์ด๋ผ๋ enum์ด ์๋ Piece๋ฅผ ์์๋ฐ์ ํ์ ํด๋์ค๋ก ๊ตฌํํ๋ฉด ๋์ง ์์๊น ์ถ์ต๋๋ค.
There was a problem hiding this comment.
์์ ๊ตฌ์กฐ๋ฅผ ๋ ์ถ์ฒํ์๋ ์ฃผ๋ ์ด์ ๋, ์์์ ํตํด ์ป์ ์ ์๋ ์ค๊ณ์ ์ด์ ์ ๋ํด์ ์กฐ๊ธ ๋ ์กฐ์ธ์ ๊ตฌํ ์ ์์๊น์?
์์์ ์ฌ์ฉํ๋ฉด piece ํด๋์ค์ camp์ pieceRule๋ฅผ ๋๊ณ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ผ๊น์??!
์ ๋ ์ฅ๊ธฐ๋ ๊ธฐ๋ฌผ์ ์ข ๋ฅ์ ๊ฐ ๊ธฐ๋ฌผ์ ํ๋ง๋ฒ์ด ๋ณํ์ง ์๋ ์ ์ ์ธ ๋๋ฉ์ธ์ด๊ธฐ ๋๋ฌธ์, Enum์ ํ์ฉํ์ฌ "์ด๋ค ํ์ ์ ์ด๋ค ์ ๋ต์ ๊ฐ์ง๋ค"๋ฅผ ๋ฏธ๋ฆฌ ์ธํ ํด ๋๋ฉด ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ํ ๊ณณ์ผ๋ก ๋ชจ์์ ธ ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค!
| public record CampDto(String camp) { | ||
|
|
||
| public static CampDto from(Camp camp) { | ||
| return new CampDto(CampFormatter.format(camp)); | ||
| } |
There was a problem hiding this comment.
[โช๏ธ Curious] DTO์ ์ญํ ์ ๋ํ ๊ณ ๋ฏผ
DTO๊ฐ ๋จ์ํ ํ๋์ ๊ฐ์ ๊ฐ์ธ๋ ๊ตฌ์กฐ๋ผ๋ฉด, ๊ณผ์ฐ DTO๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์๋ฏธ ์๋ ์ค๊ณ์ธ์ง์ ๋ํ ๊ณ ๋ฏผ์ด ๋ค์์ต๋๋ค.
DTO๋ ๋ณดํต Domain๊ณผ View ์ฌ์ด์์ ์์ถฉ ์ญํ (์ฐ๊ณจ ๊ฐ์ ์ญํ )์ ํ๋ค๊ณ ์ดํดํ๊ณ ์์ต๋๋ค.
View์ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ DTO๋ง ์์ ํ๋ฉด ๋์ด Domain๊น์ง ๋ณ๊ฒฝ์ ์ํฅ์ด ์ ํ๋๋ ๊ฒ์ ๋ง์์ค ์ ์๊ธฐ์, ๋ ๊ณ์ธต ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ์ ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ค๋ง ํ์ฌ ์ํฉ์์๋ View์์ Camp ๋๋ฉ์ธ์ ๊ฐ ํ๋๋ง ๊ทธ๋๋ก ํ์๋ก ํ๋ ์ํ๋ผ์, DTO๊ฐ ์ค์ง์ ์ธ ์ญํ ์ ํ๊ธฐ๋ณด๋ค๋ ๋จ์ํ ๊ฐ์ ํ ๋ฒ ๋ ๊ฐ์ธ๋ ๊ตฌ์กฐ๊ฐ ๋์ด ๋ถํ์ํ ํด๋์ค๋ง ์ถ๊ฐ๋๊ณ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ ๊ฒ์ ์๋์ง ๊ณ ๋ฏผ์ด ๋์์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
- View์์ Domain ๊ฐ ํ๋๋ง ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ณ์ธต ๋ถ๋ฆฌ๋ฅผ ์ํด DTO๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ข์์ง,
์๋๋ฉด ํ์ฌ ๋จ๊ณ์์๋ DTO ์์ด Domain ๊ฐ์ ์ง์ ์ ๋ฌํ๋ ๊ตฌ์กฐ๊ฐ ๋ ๋จ์ํ๊ณ ์ ์ ํ ์ ํ์ธ์ง ๊ถ๊ธํฉ๋๋ค. - Piece์์๋ DTO๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ํฉ์ด๋ผ, ํ์ฌ๋
CampDto์ ์ญํ ์ด ๋จ์ํ๋๋ผ๋ ์ผ๊ด์ฑ์ ์ํด DTO๋ฅผ ์ ์งํ๋ ๊ฒ์ด ๋์์ง๋ ๊ณ ๋ฏผ์ด ๋ฉ๋๋ค.
ํํธ์ผ๋ก๋ ์ง๊ธ์ ๊ฐ์ด ํ๋๋ฟ์ด์ง๋ง, ์ดํ View์์ ํ์ํ ๊ฐ์ด ๋์ด๋ DTO๊ฐ ์์ฐ์ค๋ฝ๊ฒ ํ์ฅ๋ ๊ฐ๋ฅ์ฑ๋ ์์ง ์์๊น๋ผ๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
์ด์ฒ๋ผ ํ์ฌ์ ๋จ์ํจ๊ณผ ๋ฏธ๋ ํ์ฅ ๊ฐ๋ฅ์ฑ ์ฌ์ด์์ DTO๋ฅผ ์ ์งํ ์ง ํ๋จํ๋ ๊ธฐ์ค์ด ์๋ค๋ฉด ์กฐ์ธ ๋ถํ๋๋ฆฝ๋๋ค!
There was a problem hiding this comment.
DTO๋ ๋ทฐ ๊ณ์ธต์ธ๊ฐ์? ๋๋ฉ์ธ ๊ณ์ธต์ธ๊ฐ์? ์๋๋ฉด ๋๊ฐ์ ๊ณ์ธต์ ํฌํจ๋์ง ์์ ํ์์ง๋์ธ๊ฐ์? ๊ฐ์ธ์ ์ผ๋ก DTO ์์ฒด๋ฅผ ๋ ๋ฒจ1์์๋ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธํ๋ผ๊ฐ ๋ณต์กํ์ง ์์ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ DTO๋ฅผ ๋ ๋งํผ ๋ฐ์ดํฐ ์ ์ก์ด ๋ณต์กํ์ง ์์์์. ์ฌํํ๊ฒ ๋๋ฉ์ธ์ ์ ๋ฌํด๋ ๋๋ค๊ณ ์๊ฐํด์. GPT์๊ฒ ํ๋ฒ DTO๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ์ง๋ฅผ ๋ฌผ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
There was a problem hiding this comment.
DTO๋ ๋ทฐ์ ๋๋ฉ์ธ ์ฌ์ด์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ์ ์งํ๊ณ , ๋ทฐ ๋ณ๊ฒฝ์ด ๋๋ฉ์ธ๊น์ง ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ณดํธํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ณด๋๋ฅผ ์ถ๋ ฅํ ๋๋ ๋๋ฉ์ธ์ ๋ชจ๋ ๊ฐ์ ์ ๋ฌํ๊ธฐ๋ณด๋ค๋ ํ์ํ ๊ฐ๋ง ์ ๋ฌํ๊ธฐ ์ํด DTO๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ค๋ง camp๋ ๊ฐ์ด ๊ทธ๋๋ก ์ ๋ฌ๋์ด๋ ๋์ง๋ง, ๊ตฌ์กฐ์ ํต์ผ์ฑ์ ์ํด DTO๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
ํ์ง๋ง ๋จ์ํ ํต์ผ์ฑ์ ๋ง์ถ๊ธฐ ์ํด Camp โ CampDto์ ๊ฐ์ ๋ถํ์ํ ๋ณํ ๋ก์ง์ ์ถ๊ฐํ๋ฉด, ์ฝ๋๊ฐ ๋์ด๋๊ณ ์ ์ง๋ณด์๊ฐ ๋ณต์กํด์ ธ ์ฅ์ ๋ณด๋ค๋ ๋จ์ ์ด ๋ ํด ๊ฒ ๊ฐ๋ค์!!
๋ฐ๋ผ์ CampDto๋ฅผ ์ ๊ฑฐํ์์ต๋๋ค!!
| import janggi.domain.piece.PieceRule; | ||
| import java.util.HashMap; | ||
| import java.util.Map; | ||
|
|
There was a problem hiding this comment.
[โช๏ธ Curious] ์ด๊ธฐ ์ฅ๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น ๋ฐ์ดํฐ ์ฃผ์ ๋ฐฉ์: enum vs CSV
ํ์ฌ ์ฅ๊ธฐ์ ์ด๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น๋ฅผ ํํํ๊ธฐ ์ํด InitialPiecePlacement enum ๋ด๋ถ์ ๊ฐ ๊ธฐ๋ฌผ์ ์ด๊ธฐ ์์น ์ ๋ณด๋ฅผ ์์๋ก ์ ์ํด ๋์์ต๋๋ค.
์ด๊ธฐ ๋ฐฐ์น ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ CSV ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ์ด์ค๋ ๋ฐฉ์๋ ๊ณ ๋ คํ์ต๋๋ค. ๋ค๋ง ๋ ๋ฐฉ์์ ๋น๊ตํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ๊ด์ ์์ ๊ณ ๋ฏผํ๊ฒ ๋์์ต๋๋ค.
1. ์ค๋ฅ ๋ฐ๊ฒฌ ์์
๋ง์ฝ ๋ฐ์ดํฐ์ SOLDIER๋ฅผ SOLDER๋ก ์๋ชป ์์ฑํ๊ฑฐ๋ ์ขํ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฐ(99)์ ์
๋ ฅํ์ฌ ์คํ๊ฐ ๋ฐ์ํ๋ค๋ฉด, enum ๋ฐฉ์์ ๊ฒฝ์ฐ ํ์
๊ธฐ๋ฐ์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ํ์์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๋ฐ๋ฉด CSV ๋ฐฉ์์ ๋ฌธ์์ด ๊ธฐ๋ฐ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ํ์ฑํ๋ ๊ณผ์ ์์์ผ ์ค๋ฅ๊ฐ ๋๋ฌ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ์ฐจ์ด๊ฐ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ค๋ฅ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ ์ ์๋์ง๋ผ๋ ์ธก๋ฉด์์ ์๋ฏธ๊ฐ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.
2. ์ ์ฐ์ฑ๊ณผ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋น๋
enum ๋ฐฉ์์ ์ฝ๋์ ์ง์ ์ ์๋๋ ๋งํผ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์ฝ๋ ์์ ๊ณผ ์ฌ๋ฐฐํฌ๊ฐ ํ์ํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋ฉด CSV ๋ฐฉ์์ ์ธ๋ถ ํ์ผ๋ง ์์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ค๋ง ์ฅ๊ธฐ ๊ฒ์์ ๊ท์น์ ๊ณ ๋ คํ์ ๋, ๋๋ถ๋ถ์ ๊ธฐ๋ฌผ ์ด๊ธฐ ๋ฐฐ์น๋ ์๋ฐฑ ๋
๋์ ๊ฑฐ์ ๋ณํ์ง ์์ ๊ณ ์ ๋ ๊ท์น์ ๊ฐ๊น๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ์ค์ ๋ก๋ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋จํ์ต๋๋ค.
์ด๋ฌํ ํน์ฑ์ ๊ณ ๋ คํ์ ๋, ์ ์ฐ์ฑ ์ธก๋ฉด์์๋ enum์ด ๋ค์ ๋ถ๋ฆฌํ ์ ์์ง๋ง ์ปดํ์ผ ํ์ ์์ ์ฑ, ํ์ ์์ ์ฑ, IDE ์ง์ ๋ฑ์ ์ฅ์ ์ด ๋ ํฌ๋ค๊ณ ํ๋จํ์ฌ enum ๋ฐฉ์์ ์ ํํ์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
์ด๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น ๋ฐ์ดํฐ๋ฅผ enum์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์๊ณผ ์ธ๋ถ ๋ฐ์ดํฐ(CSV ๋ฑ)๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ์, ํน์ ๊ทธ ์ธ์ ๋ฐฉ์ ์ค ์ด๋ค ๋ฐฉ์์ด ์ข๋ค๊ณ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
๋ฌํค์ ์๊ฐ๊ณผ ๋์ผํ๊ฒ CSV๋ก ์ ์ฅํ๋๊ฑด ๊ณผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. enum์ผ๋ก ๊ด๋ฆฌํด๋ ์ถฉ๋ถํ ๊ฒ ๊ฐ์์.
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฌํค~ ๋ฆฌ๋ทฐ์ด ๋ฒ ๋ฃจ์ค์
๋๋ค.
๋จผ์ ํ
์คํธ ์ผ์ด์ค์ ์ฐ๊ด๋ ํผ๋๋ฐฑ ๋จ๊ฒจ๋๋ ธ์ต๋๋ค. ํ์ธ๋ถํ๋๋ ค์~
ํผ๋๋ฐฑ ๋ฐ์ ํ ๋ฆฌ๋ทฐ ์์ฒญ ๋ค์ ์ฃผ์๋ฉด ํ๋ก๋์
์ฝ๋ ์์ฃผ๋ก ํผ๋๋ฐฑ ๋จ๊ฒจ๋๋ฆด๊ฒ์.
๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ํ๋ก๋์
์ฝ๋ ๋ฆฌ๋ทฐ ๋ ๋ต๋ณ๋๋ฆฌ๊ฒ ์ต๋๋ค~
| public static ElephantSetting findElephantSettingBy(String command) { | ||
| return Arrays.stream(values()) | ||
| .filter(element -> element.command.equals(command)) | ||
| .findFirst() | ||
| .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_ELEPHANT_SETTING.getMessage())); | ||
| } |
There was a problem hiding this comment.
ElephantSetting์ ์ฐพ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
There was a problem hiding this comment.
๋ฐ์ํ์์ต๋๋ค!!
test: ElephantSetting ํ
์คํธ ์ถ๊ฐ
| public int calculateColDirection() { | ||
| if (colDifference == 0) { | ||
| return 0; | ||
| } | ||
| return colDifference / Math.abs(colDifference); | ||
| } |
There was a problem hiding this comment.
colDifference๊ฐ 0์ธ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
There was a problem hiding this comment.
difference ๊ฐ์ ๋ฐ๋ฅธ ๋ฉ์๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํ์ฌ ๊ฒ์ฆํ์์ต๋๋ค!
| if ((absRowDifference != MIN_ABS_DELTA || absColDifference != MAX_ABS_DELTA) | ||
| && (absRowDifference != MAX_ABS_DELTA || absColDifference != MIN_ABS_DELTA)) { | ||
| throw new IllegalArgumentException(ExceptionMessage.INVALID_HORSE_MOVE.getMessage()); | ||
| } |
There was a problem hiding this comment.
absColDifference != MIN_ABS_DELTA ๋ง true์ธ ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
There was a problem hiding this comment.
์ค ๊ทธ๋ ๋ค์,,๋ฐ์ํ์์ต๋๋ค!
| public Camp next() { | ||
| if (this == CHO) { | ||
| return HAN; | ||
| } | ||
| return CHO; | ||
| } |
There was a problem hiding this comment.
Camp๋ฅผ ์ ํํ๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ต๋๋ค~
There was a problem hiding this comment.
๋ฐ์ํ์์ต๋๋ค!
| @Test | ||
| void ํ_์๋ง์๋ง_์ด_๋ง์๋ง์_์ผ๋ก_๋ณด๋๋ฅผ_์ด๊ธฐํํ๋ค() { | ||
| // given | ||
| BoardInitializer initializer = new StandardBoardInitializer( | ||
| ElephantSetting.LEFT_ELEPHANT, ElephantSetting.RIGHT_ELEPHANT); | ||
| Map<Position, Piece> expectedBoard = createExpectedBoard(); | ||
| expectedBoard.putAll(createChoLeftHanRightBoard()); | ||
| // when | ||
| Map<Position, Piece> board = initializer.initialize(); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(board).hasSize(32); | ||
| assertSoftly.assertThat(board).isEqualTo(expectedBoard); | ||
| }); | ||
| } |
There was a problem hiding this comment.
์๊ณผ ๋ง์ ์ธํ ์ ํ ์คํธํ๋ ์ผ์ด์ค์ธ๋ฐ ์/๋ง ์ธํ ์ ํ๋ createChoLefHanRightBoard๋ ํ ์คํธ ์ฝ๋ ์์์ ๊ตฌํ๋ ๋ก์ง์ด๋ค์. StandardBoardInitializerTest๋ ํ ์คํธ ์ฝ๋๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํ ํ ์คํธ ์ผ์ด์ค์ผ๊น์?
There was a problem hiding this comment.
ํด๋น ํ
์คํธ๋ ํ
์คํธ ์ฝ๋๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํ ์ผ์ด์ค๋ผ๊ธฐ๋ณด๋ค๋, ํ๋ก๋์
์ฝ๋์ธ initializer.initialize()์ ๊ฒฐ๊ณผ๊ฐ ์ ๊ฐ ๊ธฐ๋ํ ๊ฐ๊ณผ ์ผ์นํ๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํ ์๋๋ก ์์ฑํ์ต๋๋ค. ๊ทธ๋์ ๊ธฐ๋๊ฐ์ createChoLeftHanRightBoard()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ํตํด ์์ฑํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
๊ธฐ๋๊ฐ์ ๋ณ๋์ ๋ฉ์๋๋ก ๊ตฌ์ฑํ๊ธฐ๋ณด๋ค๋,
ํ
์คํธ ์ฝ๋์์ ์ง์ ํ๋์ฝ๋ฉ ํํ๋ก ๋ช
์์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค๋ ์๋ฏธ์์ ๋จ๊ฒจ์ฃผ์ ๋ฆฌ๋ทฐ์ผ๊น์?
There was a problem hiding this comment.
์ ๋น๊ต๋ฅผ ์ํด์ expectedBoard์ ์ง์ ๋ฃ์ด์ค๊ฑฐ๊ตฐ์. ํ ์คํธ ์ฝ๋๋ฅผ ์๋ชป ๋ดค๋ค์~
|
|
||
| @ParameterizedTest | ||
| @MethodSource("createPositionsAndPath") | ||
| void ์ฐจ์_ํฌ๋_ํ_๋ฐฉํฅ์ผ๋ก๋ง_1์นธ_์ด์_์ด๋_ํ _์_์๋ค(Position source, Position destination, int size, List<Position> expectedPath) { |
There was a problem hiding this comment.
MultiStepStraightStrategy๋ ๋ง๊ทธ๋๋ก ์ง์ ์ผ๋ก ์ฌ๋ฌ์นธ ์ด๋ํ๋ ๊ฒ๊ณผ ์ฐ๊ด๋ ๋ก์ฐํ ๋ ๋ฒจ์ ํด๋์ค ๊ฐ์ต๋๋ค. ์ฐจ์ ํฌ๋ผ๋ ์ถ์ํ๋ ๊ฐ๋ ์ ์ ํ์๊ฐ ์์ ๊ฒ ๊ฐ์์. ํ ์คํธ ์ผ์ด์ค ๋ช ์ ํ ์คํธ ๋์์์ ๋์ผํ ์ถ์ํ ์์ค์ผ๋ก ์์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค~
There was a problem hiding this comment.
MultiStepStraightStrategy๋ ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ ์ง์ ์ผ๋ก ์ฌ๋ฌ ์นธ ์ด๋ํ๋ ๊ท์น๋ง์ ๋ด๋นํ๋๋ก ์ถ์ํํ์๊ธฐ์, ํ
์คํธ ๋ช
์ ํฌ&์ฐจ์ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฌผ ๋ช
์ด ๋ค์ด๊ฐ๋ค๋ฉด ์ถ์ํ ์์ค์ด ๋ง์ง ์๊ฒ ๋๋๊ตฐ์!!
MultiStepStraightStrategTest, ๊ทธ๋ฆฌ๊ณ SingleStepStraightStrategyTest ๋ ํจ๊ป ๋์ผํ ์ถ์ํ ์์ค์ด ๋๋๋ก ๋ฉ์๋๋ช
๋ณ๊ฒฝํ์์ต๋๋ค!
refactor: MultiStepStraightStrategyTest, SingleStepStraightStrategyTeโฆ
|
|
||
| @ParameterizedTest | ||
| @MethodSource("successMovePositions") | ||
| void ๊ถ๊ณผ_์ฌ๋_์ํ์ข์ฐ_1์นธ_์ด๋ํ๋ค(Position source, Position destination) { |
There was a problem hiding this comment.
์ฌ๊ธฐ๋ ์ข ๋ ์ถ์ํ๋ ๊ฐ๋ ์ด ์๋ ๋ก์ฐํ ๋ ๋ฒจ์ SingleStepStraightStrategy์๋ง ์ง์คํ๋ ํ ์คํธ ์ผ์ด์ค ๋ช ์ผ๋ก ์์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
|
|
||
| class SoldierStrategyTest { | ||
|
|
||
| private final MoveStrategy strategy = new SoldierStrategy(); |
There was a problem hiding this comment.
Strategy์ ์ฐ๊ด๋ ํ ์คํธ์ฝ๋๋ค์ ๊ณ์ ์ดํด๋ณด๋ ์ถ์ํ ์์ค์ด ๋ค๋ค ๋ค๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค. ์, ๋ง, ๋ณ์ ๋ํ ๋์ ์ถ์ํ ์์ค์ Strategy์ ์ถ์ํ ์์ค์ด ์กฐ๊ธ ๋ฎ์ ๋จ์ ์ง์ ํน์ ํ์นธ ์ด๋์ ๋ํ Strategy๊ฐ ๊ฐ์ ์ถ์ํ ์์ค์ผ๋ก ๋ค๋ฃจ๋ค๋ณด๋ ์ด์ํ ์๊ฐ์ด ๋๋ค์. Strategy์ ์ฐ๊ด๋ ์ถ์ํ ์์ค์ ๋์ผํ๊ฒ ๋ง์ถ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์์~
| @Test | ||
| void ์ด๋๋ผ_์ฐจ๋ก๊ฐ_๋๋๋ฉด_ํ๋๋ผ_์ฐจ๋ก๊ฐ_๋๋ค() { | ||
| // given | ||
| Turn turn = new Turn(); | ||
| Camp firstTurn = turn.currentTurn(); | ||
| // when | ||
| turn.finishTurn(); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(firstTurn).isEqualTo(Camp.CHO); | ||
| assertSoftly.assertThat(turn.currentTurn()).isEqualTo(Camp.HAN); | ||
| }); | ||
| } |
There was a problem hiding this comment.
ํ ์คํธ ์ผ์ด์ค ๋ช ๊ณผ ์ค์ ํ ์คํธ ์ฝ๋๊ฐ ๋ค๋ฅธ ๊ฒ ๊ฐ๋ค์~
There was a problem hiding this comment.
ํด๋น ํ
์คํธ์์ finishTurn() ํธ์ถ ํ ์ฐจ๋ก๊ฐ CHO โ HAN์ผ๋ก ๋ณ๊ฒฝ๋๋ ํ๋ฆ์ ๊ฒ์ฆํ๋ ค๋ ๋ชฉ์ ์ด์๊ณ ,
์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฒ์ turn ์งํ ์์๋ ํ์ฌ ์ฐจ๋ก๊ฐ CHO์ด๊ณ , ์ดํ turn์ด ๋๋๋ฉด ํ์ฌ ์ฐจ๋ก๊ฐ HAN์ด ๋๋์ง ํจ๊ป ๊ฒ์ฆํ๋๋ก ์์ฑํ์ต๋๋ค.
๋ฐ๋ผ์ ์ ๋ ํ
์คํธ๋ช
์ด ์ค์ ์ฝ๋๋ฅผ ์ ํํํ๋ค๊ณ ์๊ฐํ๋๋ฐ,
์ด๋๋ถ๋ถ์์ ํ
์คํธ๋ช
๊ณผ ์ค์ ํ
์คํธ ์ฝ๋๊ฐ ๋ค๋ฅด๋ค๊ณ ๋๋ผ์
จ๋์ง ์กฐ๊ธ ๋ ์์ธํ ๋ง์ํด ์ฃผ์ค ์ ์์๊น์?!
There was a problem hiding this comment.
์ ์ ๊ฐ ์๋ชป ๋ดค์๋ค์! ํ ์คํธ ๋ช ์ ๋ง๊ฒ ์ ์์ฑํ์ จ์ต๋๋ค.
| class PieceTest { | ||
|
|
||
| @Test | ||
| void ๊ฐ์_๋ฃฐ์ด_์ ์ฉ๋๋_๊ธฐ๋ฌผ์ธ์ง_ํ์ธํ๋ค() { |
There was a problem hiding this comment.
๊ฐ์ ๋ฃฐ์ด๋ผ๋ ํํ์ด ์ ๋งคํ ๊ฒ ๊ฐ์ต๋๋ค. ํฌ์๋ง ํด๋นํ๋ ๋ด์ฉ์ด๋ค๋ณด๋ ์ข ๋ ํฌ์ ์ฐ๊ด๋ ํ ์คํธ ์ผ์ด์ค๋ก ์ด๋ฆ์ ์์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
There was a problem hiding this comment.
ํด๋น ํ
์คํธ๋ ํฌ(CANNON)์ ๋ง์ถฐ์ง ๋์์ ๊ฒ์ฆํ๊ธฐ๋ณด๋ค๋, ๋์ผํ PieceRule์ ๊ฐ์ง๋ ๊ธฐ๋ฌผ์ธ์ง ํ์ธํ๋ ๋ฉ์๋์ ๋์์ ๊ฒ์ฆํ๋ ๊ฒ์ด ๋ชฉ์ ์ด์์ต๋๋ค.
๋ฐ๋ผ์ ํฌ๋ ๋จ์ํ ์์๋ก ์ฌ์ฉ๋ ๊ฒ์ด๊ธฐ์, ํน์ ๊ธฐ๋ฌผ์ ์ข
์๋ ์๋ฏธ๋ณด๋ค๋ ๋ฉ์๋์ ์ญํ ์ด ๋๋ฌ๋๋๋ก ์กฐ๊ธ ๋ ์ถ์ํ๋ ํ
์คํธ ์ผ์ด์ค ๋ช
์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค! (๊ฐ์_์ ๋ต_๋ฐ_์ด๋_์กฐ๊ฑด์ด_์ ์ฉ๋๋_๊ธฐ๋ฌผ์ธ์ง_ํ์ธํ๋ค())
โฆst ํ ์คํธ ๋ช ์ถ์ํ
There was a problem hiding this comment.
๋ฆฌ๋ทฐ ๊ฐ์ฌํฉ๋๋ค ๋ฒ ๋ฃจ์ค!!
TDD๋ฅผ ์งํํ๋ฉฐ ํ
์คํธ ์ฝ๋๋ฅผ ์ถฉ๋ถํ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ๋์น ๋ถ๋ถ์ด ๊ฝค ์์๋ค์..
๋ง์ํด์ฃผ์ ๋ถ๋ถ์ ๋ณด์ํ์ฌ ๋ฐ์ํ์ต๋๋ค.
์ด๋ฒ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ํ ์คํธ ์ฝ๋์์๋ ์ถ์ํ ์์ค์ ๋ง๋ ๋ฉ์๋ ์ด๋ฆ ์ง๋ ๊ฒ๊ณผ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํด๋ณผ ์ ์์์ต๋๋ค. ํ ์คํธ ์ฝ๋ ์ญ์ ํ๋ก๋์ ์ฝ๋๋งํผ์ด๋ ์ ์ง๋ณด์๊ฐ ์ค์ํ๊ณ ์ด์์๋ ๋ฌธ์๋ก์์ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์, ๋์ฑ ์ ๊ฒฝ ์จ์ผ ํ๋ค๋ ์ ์ ๋ฐฐ์ธ ์ ์์์ต๋๋ค!
ํ๋ง๋ฒ ์ ๋ต๋ง๋ค ์ถ์ํ ์์ค์ด ๋ค๋ฅธ ๋ถ๋ถ(๊ด๋ จ ์ฝ๋ฉํธ 2๊ฐ)์,,,์กฐ๊ธ ๋ ์๊ฐ์ด ํ์ํ์ฌ, ํ ์คํธ ์ฝ๋ ๊ด๋ จ ํผ๋๋ฐฑ ๋จผ์ ๋ฐ์ ํ ๋ฆฌ๋ทฐ ์์ฒญ ๋๋ ธ์ต๋๋ค!!
| @Test | ||
| void ํ_์๋ง์๋ง_์ด_๋ง์๋ง์_์ผ๋ก_๋ณด๋๋ฅผ_์ด๊ธฐํํ๋ค() { | ||
| // given | ||
| BoardInitializer initializer = new StandardBoardInitializer( | ||
| ElephantSetting.LEFT_ELEPHANT, ElephantSetting.RIGHT_ELEPHANT); | ||
| Map<Position, Piece> expectedBoard = createExpectedBoard(); | ||
| expectedBoard.putAll(createChoLeftHanRightBoard()); | ||
| // when | ||
| Map<Position, Piece> board = initializer.initialize(); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(board).hasSize(32); | ||
| assertSoftly.assertThat(board).isEqualTo(expectedBoard); | ||
| }); | ||
| } |
There was a problem hiding this comment.
ํด๋น ํ
์คํธ๋ ํ
์คํธ ์ฝ๋๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํ ์ผ์ด์ค๋ผ๊ธฐ๋ณด๋ค๋, ํ๋ก๋์
์ฝ๋์ธ initializer.initialize()์ ๊ฒฐ๊ณผ๊ฐ ์ ๊ฐ ๊ธฐ๋ํ ๊ฐ๊ณผ ์ผ์นํ๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํ ์๋๋ก ์์ฑํ์ต๋๋ค. ๊ทธ๋์ ๊ธฐ๋๊ฐ์ createChoLeftHanRightBoard()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ํตํด ์์ฑํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
[์ง๋ฌธ ๐๐ปโโ๏ธ]
๊ธฐ๋๊ฐ์ ๋ณ๋์ ๋ฉ์๋๋ก ๊ตฌ์ฑํ๊ธฐ๋ณด๋ค๋,
ํ
์คํธ ์ฝ๋์์ ์ง์ ํ๋์ฝ๋ฉ ํํ๋ก ๋ช
์์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ๋ ์ ์ ํ๋ค๋ ์๋ฏธ์์ ๋จ๊ฒจ์ฃผ์ ๋ฆฌ๋ทฐ์ผ๊น์?
| @Test | ||
| void ์ด๋ํ๋ ค๋_๊ฒฝ๋ก์_๊ธฐ๋ฌผ์ด_์กด์ฌํ๋ฉด_์์ธ๊ฐ_๋ฐ์ํ๋ค() { | ||
| //given | ||
| List<Position> path = List.of( | ||
| new Position(0, 0), | ||
| new Position(0, 1), | ||
| new Position(0, 2), | ||
| new Position(0, 3), | ||
| new Position(0, 4), | ||
| new Position(0, 5) | ||
| ); | ||
| Camp camp = Camp.HAN; | ||
|
|
||
| BoardInitializer boardInitializer = new EmptyConditionTestBoardInitializer(); | ||
| Board board = new Board(boardInitializer); | ||
| //when & then | ||
| assertThatThrownBy(() -> condition.checkPath(path, camp, board, PieceRule.CHARIOT)) | ||
| .isInstanceOf(IllegalArgumentException.class) | ||
| .hasMessage(ExceptionMessage.PATH_NOT_EMPTY.getMessage()); | ||
| } |
There was a problem hiding this comment.
๋์ํฉ๋๋ค!
๊ธฐ์กด์๋ EmptyConditionTestBoardInitializer๋ผ๋ ํ
์คํธ ์ ์ฉ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ณ , ๋ณด๋ ๋ฐ์ดํฐ๊ฐ ํด๋น ํด๋์ค ๋ด๋ถ์ ์ ์๋์ด ์์ด ํ
์คํธ ์ฝ๋๋ง ๋ด์๋ ๊ฒฝ๋ก์ ๊ธฐ๋ฌผ์ด ์กด์ฌํ๋ ์ํฉ์ธ์ง ๋ฐ๋ก ํ์
ํ๊ธฐ ์ด๋ ค์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ํด๋น ํด๋์ค๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋ค๋ฅผ ์ฌ์ฉํด ๋ณด๋ ์ด๊ธฐ ์ํ๋ฅผ ํ
์คํธ ์ฝ๋์์ ์ง์ ์ ์ํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ ๊ฒฝ๋ก ์ค๊ฐ์ ๊ธฐ๋ฌผ์ด ๋ฐฐ์น๋ ์ํฉ์ด ํ
์คํธ ์ฝ๋์์ ๋ฐ๋ก ๋๋ฌ๋ ์กฐ๊ธ ๋ ์ฝ๊ธฐ ์ฌ์์ง ๊ฒ ๊ฐ๋ค์!!
| List<Position> path = strategy.findPath(source, destination, Camp.HAN); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(path).hasSize(expectedPath.size()); | ||
| assertSoftly.assertThat(path).containsExactlyElementsOf(expectedPath); | ||
| }); |
There was a problem hiding this comment.
๊ทธ๋ ๋ค์!
destination์ ๋ํ ์ ๋ณด๊ฐ expectedPath ๋ง์ง๋ง์ ์์นํด ์์ผ๋ฏ๋ก
destination์ expectedPath์ ๋ง์ง๋ง ๊ฐ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด ์ค๋ณต ์ฝ๋๋ ์ ๊ฑฐํ๊ณ , ๋ฐ์ดํฐ๋ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค!
๊ด๋ จํ์ฌ MultiStepStraightStrategyTest, HorseStrategyTest๋ ์ค๋ณต๋ ์ ๋ณด๋ฅผ ๋๊ธฐ์ง ์๋๋ก ์์ ํ์์ต๋๋ค!
|
|
||
| @ParameterizedTest | ||
| @MethodSource("createPositionsAndPath") | ||
| void ์ฐจ์_ํฌ๋_ํ_๋ฐฉํฅ์ผ๋ก๋ง_1์นธ_์ด์_์ด๋_ํ _์_์๋ค(Position source, Position destination, int size, List<Position> expectedPath) { |
There was a problem hiding this comment.
MultiStepStraightStrategy๋ ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ ์ง์ ์ผ๋ก ์ฌ๋ฌ ์นธ ์ด๋ํ๋ ๊ท์น๋ง์ ๋ด๋นํ๋๋ก ์ถ์ํํ์๊ธฐ์, ํ
์คํธ ๋ช
์ ํฌ&์ฐจ์ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฌผ ๋ช
์ด ๋ค์ด๊ฐ๋ค๋ฉด ์ถ์ํ ์์ค์ด ๋ง์ง ์๊ฒ ๋๋๊ตฐ์!!
MultiStepStraightStrategTest, ๊ทธ๋ฆฌ๊ณ SingleStepStraightStrategyTest ๋ ํจ๊ป ๋์ผํ ์ถ์ํ ์์ค์ด ๋๋๋ก ๋ฉ์๋๋ช
๋ณ๊ฒฝํ์์ต๋๋ค!
refactor: MultiStepStraightStrategyTest, SingleStepStraightStrategyTeโฆ
| @Test | ||
| void ์ด๋๋ผ_์ฐจ๋ก๊ฐ_๋๋๋ฉด_ํ๋๋ผ_์ฐจ๋ก๊ฐ_๋๋ค() { | ||
| // given | ||
| Turn turn = new Turn(); | ||
| Camp firstTurn = turn.currentTurn(); | ||
| // when | ||
| turn.finishTurn(); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(firstTurn).isEqualTo(Camp.CHO); | ||
| assertSoftly.assertThat(turn.currentTurn()).isEqualTo(Camp.HAN); | ||
| }); | ||
| } |
There was a problem hiding this comment.
ํด๋น ํ
์คํธ์์ finishTurn() ํธ์ถ ํ ์ฐจ๋ก๊ฐ CHO โ HAN์ผ๋ก ๋ณ๊ฒฝ๋๋ ํ๋ฆ์ ๊ฒ์ฆํ๋ ค๋ ๋ชฉ์ ์ด์๊ณ ,
์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฒ์ turn ์งํ ์์๋ ํ์ฌ ์ฐจ๋ก๊ฐ CHO์ด๊ณ , ์ดํ turn์ด ๋๋๋ฉด ํ์ฌ ์ฐจ๋ก๊ฐ HAN์ด ๋๋์ง ํจ๊ป ๊ฒ์ฆํ๋๋ก ์์ฑํ์ต๋๋ค.
๋ฐ๋ผ์ ์ ๋ ํ
์คํธ๋ช
์ด ์ค์ ์ฝ๋๋ฅผ ์ ํํํ๋ค๊ณ ์๊ฐํ๋๋ฐ,
์ด๋๋ถ๋ถ์์ ํ
์คํธ๋ช
๊ณผ ์ค์ ํ
์คํธ ์ฝ๋๊ฐ ๋ค๋ฅด๋ค๊ณ ๋๋ผ์
จ๋์ง ์กฐ๊ธ ๋ ์์ธํ ๋ง์ํด ์ฃผ์ค ์ ์์๊น์?!
| class PieceTest { | ||
|
|
||
| @Test | ||
| void ๊ฐ์_๋ฃฐ์ด_์ ์ฉ๋๋_๊ธฐ๋ฌผ์ธ์ง_ํ์ธํ๋ค() { |
There was a problem hiding this comment.
ํด๋น ํ
์คํธ๋ ํฌ(CANNON)์ ๋ง์ถฐ์ง ๋์์ ๊ฒ์ฆํ๊ธฐ๋ณด๋ค๋, ๋์ผํ PieceRule์ ๊ฐ์ง๋ ๊ธฐ๋ฌผ์ธ์ง ํ์ธํ๋ ๋ฉ์๋์ ๋์์ ๊ฒ์ฆํ๋ ๊ฒ์ด ๋ชฉ์ ์ด์์ต๋๋ค.
๋ฐ๋ผ์ ํฌ๋ ๋จ์ํ ์์๋ก ์ฌ์ฉ๋ ๊ฒ์ด๊ธฐ์, ํน์ ๊ธฐ๋ฌผ์ ์ข
์๋ ์๋ฏธ๋ณด๋ค๋ ๋ฉ์๋์ ์ญํ ์ด ๋๋ฌ๋๋๋ก ์กฐ๊ธ ๋ ์ถ์ํ๋ ํ
์คํธ ์ผ์ด์ค ๋ช
์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค! (๊ฐ์_์ ๋ต_๋ฐ_์ด๋_์กฐ๊ฑด์ด_์ ์ฉ๋๋_๊ธฐ๋ฌผ์ธ์ง_ํ์ธํ๋ค())
| public static ElephantSetting findElephantSettingBy(String command) { | ||
| return Arrays.stream(values()) | ||
| .filter(element -> element.command.equals(command)) | ||
| .findFirst() | ||
| .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INVALID_ELEPHANT_SETTING.getMessage())); | ||
| } |
There was a problem hiding this comment.
๋ฐ์ํ์์ต๋๋ค!!
test: ElephantSetting ํ
์คํธ ์ถ๊ฐ
| public int calculateColDirection() { | ||
| if (colDifference == 0) { | ||
| return 0; | ||
| } | ||
| return colDifference / Math.abs(colDifference); | ||
| } |
There was a problem hiding this comment.
difference ๊ฐ์ ๋ฐ๋ฅธ ๋ฉ์๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํ์ฌ ๊ฒ์ฆํ์์ต๋๋ค!
| if ((absRowDifference != MIN_ABS_DELTA || absColDifference != MAX_ABS_DELTA) | ||
| && (absRowDifference != MAX_ABS_DELTA || absColDifference != MIN_ABS_DELTA)) { | ||
| throw new IllegalArgumentException(ExceptionMessage.INVALID_HORSE_MOVE.getMessage()); | ||
| } |
There was a problem hiding this comment.
์ค ๊ทธ๋ ๋ค์,,๋ฐ์ํ์์ต๋๋ค!
| public Camp next() { | ||
| if (this == CHO) { | ||
| return HAN; | ||
| } | ||
| return CHO; | ||
| } |
There was a problem hiding this comment.
๋ฐ์ํ์์ต๋๋ค!
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฌํค~
ํ
์คํธ ์ฝ๋ ์ชฝ ํผ๋๋ฐฑ์ ์ ๋ฐ์ํด์ฃผ์
จ๋ค์. ํ๋ก๋์
์ฝ๋ ์์ฃผ๋ก ํผ๋๋ฐฑ ๋จ๊ฒจ๋๋ ธ์ผ๋ ํ์ธ๋ถํ๋๋ ค์~
| public static Position from(List<Integer> rawPosition) { | ||
| validatePositionSize(rawPosition); | ||
| return new Position(rawPosition.get(0), rawPosition.get(1)); | ||
| } | ||
|
|
||
| private static void validatePositionSize(List<Integer> position) { | ||
| if (position.size() != POSITION_SIZE) { | ||
| throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT_FORMAT.getMessage()); | ||
| } | ||
| } |
There was a problem hiding this comment.
Position์ ์์ฑํ ๋ size๋ฅผ ๊ฒ์ฆํ๋ ํ ์คํธ๊ฐ ์๋ค์~
There was a problem hiding this comment.
์ถ๊ฐํ์์ต๋๋ค!!
refactor: Position format ํ
์คํธ ์ถ๊ฐ
There was a problem hiding this comment.
์ ์์ ์ผ๋ก ์์ฑํ๋ ํ ์คํธ ์ผ์ด์ค๋ ์๋ค์~
|
|
||
| private void validateElephantMovement(DirectionInformation directionInfo) { | ||
| if ((directionInfo.calculateAbsRowDifference() != MIN_ABS_DELTA | ||
| || directionInfo.calculateAbsColDifference() != MAX_ABS_DELTA) |
There was a problem hiding this comment.
directionInfo.calculateAbsColDiffernce() != MAX_ABS_DELTA๊ฐ false์ธ ํ
์คํธ ์ผ์ด์ค๊ฐ ์๋ค์~
| public void placeOn(Map<Position, Piece> board) { | ||
| board.put(position, piece); | ||
| } |
There was a problem hiding this comment.
์ถ๋ ฅ ์ธ์์ ๋ํด ์์๋์? ํด๋ฆฐ ์ฝ๋ ๊ด์ ์์ ์ถ๋ ฅ ์ธ์๊ฐ ์ด๋ค ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ตํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค~
There was a problem hiding this comment.
[ ์ง๋ฌธ ๐๐ปโโ๏ธ]
์ถ๋ ฅ ์ธ์์ ๋ฌธ์ ์ ์ด ํ์ฌ board๋ฅผ ์ธ์๋ก ๋ฐ์ board๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ์ง๊ด์ ์ด์ง ์๊ณ ์ด์ํ๊ฒ ๋๊ปด์ง๋ ๊ฒ์ผ๊น์??
InitialPiecePlacement์ ๊ฐ๋ค์ ๊ฐ์ ธ์ฌ ๋ ๊ฒํฐ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ค๊ณ ์์ ๊ฐ์ ํํ๊ฐ ๋์๋๋ฐ, ์๋์ ๊ฐ์ด ๋ฆฌํฉํ ๋ง ํ์ฌ ํด๊ฒฐํ์ต๋๋ค!
public static Board initialize(ElephantFormation hanFormation, ElephantFormation choFormation) {
Map<Position, Piece> board = new HashMap<>();
for (InitialPiecePlacement placement : values()) {
board.put(placement.position, placement.piece);
}
board.putAll(hanFormation.placeElephantSetUpPieces());
board.putAll(choFormation.placeElephantSetUpPieces());
return new Board(board);
}There was a problem hiding this comment.
์ถ๋ ฅ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์๋ก ์ ๋ฌํ๋ ๋ชจ๋ ๋ฉ์๋์ ๋ด๋ถ๋ฅผ ํ๋ํ๋๋ฅผ ํ์ธํ๋ฉฐ ๋ณ๊ฒฝ์ ์ ์ฐพ์์ผํ๋ ์ฝ๋ ๋ถ์์ด ์ด๋ ค์์ง ์ ์์ต๋๋ค. ์ ์์ ํ์ จ์ด์~
| import janggi.domain.piece.PieceRule; | ||
| import java.util.HashMap; | ||
| import java.util.Map; | ||
|
|
There was a problem hiding this comment.
๋ฌํค์ ์๊ฐ๊ณผ ๋์ผํ๊ฒ CSV๋ก ์ ์ฅํ๋๊ฑด ๊ณผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. enum์ผ๋ก ๊ด๋ฆฌํด๋ ์ถฉ๋ถํ ๊ฒ ๊ฐ์์.
| @Override | ||
| public Map<Position, Piece> initialize() { | ||
| return InitialPiecePlacement.init(hanElephantSetting, choElephantSetting); | ||
| } |
There was a problem hiding this comment.
์์ง Board๋ฅผ ์ด๊ธฐํํ๋ ๋ก์ง์ด ๋ณต์กํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก ์ธํฐํ์ด์ค๊น์ง ๋ง๋ค์ด๊ฐ๋ฉฐ ๊ตฌํํ ํ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. Board์์ Map์ผ๋ก ์ ๋ฌ ๋ฐ๋ ๋ฐฉ์์ด ๋ ๊น๋ํ ๊ฒ ๊ฐ๋ค์.
| public static Map<Position, Piece> init(ElephantSetting hanChoice, ElephantSetting choChoice) { | ||
| Map<Position, Piece> board = new HashMap<>(); | ||
|
|
||
| for (InitialPiecePlacement piece : values()) { | ||
| board.put(new Position(piece.row, piece.column), new Piece(piece.pieceRule, piece.camp)); | ||
| } | ||
|
|
||
| board.putAll(hanChoice.createElephantOrder(Camp.HAN)); | ||
| board.putAll(choChoice.createElephantOrder(Camp.CHO)); | ||
| return board; | ||
| } |
There was a problem hiding this comment.
์ ๋ผ๋ฉด ๊ตฌ์กฐ๋ฅผ ๋จ์ํ๊ฒํ๊ณ ํ ์คํธ๋ก ๋ณด์ํ ๊ฒ ๊ฐ๋ค์. ํ ์คํธ ์ฝ๋๋ฅผ ์ ์์ฑํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๋ฏ์ด ๋๋ฉ์ธ ๊ท์น์ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค~
| @Test | ||
| void ์ด๋๋ผ_์ฐจ๋ก๊ฐ_๋๋๋ฉด_ํ๋๋ผ_์ฐจ๋ก๊ฐ_๋๋ค() { | ||
| // given | ||
| Turn turn = new Turn(); | ||
| Camp firstTurn = turn.currentTurn(); | ||
| // when | ||
| turn.finishTurn(); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(firstTurn).isEqualTo(Camp.CHO); | ||
| assertSoftly.assertThat(turn.currentTurn()).isEqualTo(Camp.HAN); | ||
| }); | ||
| } |
There was a problem hiding this comment.
์ ์ ๊ฐ ์๋ชป ๋ดค์๋ค์! ํ ์คํธ ๋ช ์ ๋ง๊ฒ ์ ์์ฑํ์ จ์ต๋๋ค.
| @Test | ||
| void ํ_์๋ง์๋ง_์ด_๋ง์๋ง์_์ผ๋ก_๋ณด๋๋ฅผ_์ด๊ธฐํํ๋ค() { | ||
| // given | ||
| BoardInitializer initializer = new StandardBoardInitializer( | ||
| ElephantSetting.LEFT_ELEPHANT, ElephantSetting.RIGHT_ELEPHANT); | ||
| Map<Position, Piece> expectedBoard = createExpectedBoard(); | ||
| expectedBoard.putAll(createChoLeftHanRightBoard()); | ||
| // when | ||
| Map<Position, Piece> board = initializer.initialize(); | ||
| // then | ||
| SoftAssertions.assertSoftly(assertSoftly -> { | ||
| assertSoftly.assertThat(board).hasSize(32); | ||
| assertSoftly.assertThat(board).isEqualTo(expectedBoard); | ||
| }); | ||
| } |
There was a problem hiding this comment.
์ ๋น๊ต๋ฅผ ์ํด์ expectedBoard์ ์ง์ ๋ฃ์ด์ค๊ฑฐ๊ตฐ์. ํ ์คํธ ์ฝ๋๋ฅผ ์๋ชป ๋ดค๋ค์~
| public record CampDto(String camp) { | ||
|
|
||
| public static CampDto from(Camp camp) { | ||
| return new CampDto(CampFormatter.format(camp)); | ||
| } |
There was a problem hiding this comment.
DTO๋ ๋ทฐ ๊ณ์ธต์ธ๊ฐ์? ๋๋ฉ์ธ ๊ณ์ธต์ธ๊ฐ์? ์๋๋ฉด ๋๊ฐ์ ๊ณ์ธต์ ํฌํจ๋์ง ์์ ํ์์ง๋์ธ๊ฐ์? ๊ฐ์ธ์ ์ผ๋ก DTO ์์ฒด๋ฅผ ๋ ๋ฒจ1์์๋ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธํ๋ผ๊ฐ ๋ณต์กํ์ง ์์ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ DTO๋ฅผ ๋ ๋งํผ ๋ฐ์ดํฐ ์ ์ก์ด ๋ณต์กํ์ง ์์์์. ์ฌํํ๊ฒ ๋๋ฉ์ธ์ ์ ๋ฌํด๋ ๋๋ค๊ณ ์๊ฐํด์. GPT์๊ฒ ํ๋ฒ DTO๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ์ง๋ฅผ ๋ฌผ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
|
|
||
| public interface MoveCondition { | ||
|
|
||
| void checkPath(List<Position> path, Camp camp, BoardChecker board, PieceRule pieceRule); |
There was a problem hiding this comment.
๊ฐ๋ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค๋ก ์์ ๊ฐ๋ ์ ๋ฌถ๋ค๋ณด๋ฉด ์ง๊ธ์ฒ๋ผ ํน์ ์ผ์ด์ค์๋ง ํ์ํ ๋งค๊ฐ๋ณ์๊ฐ ์๊ธฐ๊ธฐ๋ ํฉ๋๋ค. ๊ฐ์ธ์ ํ๋จ์ ๋ฐ๋ผ ์ ์งํ ์ง ๋ง์ง๋ฅผ ์ ํ ํ ๋ฐ, ์ ๋ ์ต๋ํ ๋ถํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ์ง ์๋ ๋ฐฉํฅ์ผ๋ก ๊ณ ๋ฏผํด๋ณด๊ธด ํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ ํ์ฌ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํด ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง ์์๊น ์ถ์ต๋๋ค. ๋ค๋ฅธ ๊ณณ์ ํผ๋๋ฐฑ์ ๋จ๊ฒจ๋์ง๋ง MoveCondition๊ณผ MoveStrategy๋ฅผ ํฉ์น๊ณ PieceRule์ด๋ผ๋ enum์ด ์๋ Piece๋ฅผ ์์๋ฐ์ ํ์ ํด๋์ค๋ก ๊ตฌํํ๋ฉด ๋์ง ์์๊น ์ถ์ต๋๋ค.
Jiihyun
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฒ ๋ฃจ์ค!
๋ฐ์์ ์์ค์๋ ๊ผผ๊ผผํ๊ฒ ๋ฆฌ๋ทฐํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ณ ์ถ์ํ ๊ตฌ์กฐ๋ฅผ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ์๋ํด๋ณด์์ต๋๋ค.
๋ฆฌ๋ทฐ ๋๋ถ์ ๋ก์ง์ด ์ด์ ๋ณด๋ค ๊น๋ํด์ก์ง๋ง, ์์ผ๋ก ์๋ก์ด ๊ธฐ๋ฌผ์ด ์ถ๊ฐ๋๊ฑฐ๋ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋ ๋ OCP๊ฐ ์ ์ง์ผ์ง ์ ์์์ง๋ ์ฌ์ ํ ๊ณ ๋ฏผ๋๋ ๋ถ๋ถ์
๋๋ค.
์ถ์ํ ์ค๊ณ ๊ด๋ จํด์ ๋ฆฌ๋ทฐ ๋ฐ ์กฐ์ธ ๋ ๋จ๊ฒจ์ฃผ์๋ฉด, ์ด๋ฒ์๋ ์ด์ฌํ ๊ณต๋ถํ์ฌ ๋ฐ์ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!๐๐ปโโ๏ธ
| public static Position from(List<Integer> rawPosition) { | ||
| validatePositionSize(rawPosition); | ||
| return new Position(rawPosition.get(0), rawPosition.get(1)); | ||
| } | ||
|
|
||
| private static void validatePositionSize(List<Integer> position) { | ||
| if (position.size() != POSITION_SIZE) { | ||
| throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT_FORMAT.getMessage()); | ||
| } | ||
| } |
There was a problem hiding this comment.
์ถ๊ฐํ์์ต๋๋ค!!
refactor: Position format ํ
์คํธ ์ถ๊ฐ
| public static Map<Position, Piece> init(ElephantSetting hanChoice, ElephantSetting choChoice) { | ||
| Map<Position, Piece> board = new HashMap<>(); | ||
|
|
||
| for (InitialPiecePlacement piece : values()) { | ||
| board.put(new Position(piece.row, piece.column), new Piece(piece.pieceRule, piece.camp)); | ||
| } | ||
|
|
||
| board.putAll(hanChoice.createElephantOrder(Camp.HAN)); | ||
| board.putAll(choChoice.createElephantOrder(Camp.CHO)); | ||
| return board; | ||
| } |
There was a problem hiding this comment.
์ค!! ํ
์คํธ๋ฅผ ํ์ฉํ ์ ์๋ค๋ ์๊ฐ์ ํ์ง ๋ชปํ๋ค์.
์์ผ๋ก ๋น์ทํ ์ํฉ์ด ์๊ธด๋ค๋ฉด ๊ตฌ์กฐ๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ธฐ๋ณด๋ค๋, ํ
์คํธ ์ฝ๋๋ฅผ ๋ ๊ผผ๊ผผํ ์์ฑํ๋ ๋ฐฉํฅ์ ๋จผ์ ๊ณ ๋ฏผํด๋ณด๊ฒ ์ต๋๋ค!
|
|
||
| public interface MoveCondition { | ||
|
|
||
| void checkPath(List<Position> path, Camp camp, BoardChecker board, PieceRule pieceRule); |
There was a problem hiding this comment.
์์ ๊ตฌ์กฐ๋ฅผ ๋ ์ถ์ฒํ์๋ ์ฃผ๋ ์ด์ ๋, ์์์ ํตํด ์ป์ ์ ์๋ ์ค๊ณ์ ์ด์ ์ ๋ํด์ ์กฐ๊ธ ๋ ์กฐ์ธ์ ๊ตฌํ ์ ์์๊น์?
์์์ ์ฌ์ฉํ๋ฉด piece ํด๋์ค์ camp์ pieceRule๋ฅผ ๋๊ณ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ผ๊น์??!
์ ๋ ์ฅ๊ธฐ๋ ๊ธฐ๋ฌผ์ ์ข ๋ฅ์ ๊ฐ ๊ธฐ๋ฌผ์ ํ๋ง๋ฒ์ด ๋ณํ์ง ์๋ ์ ์ ์ธ ๋๋ฉ์ธ์ด๊ธฐ ๋๋ฌธ์, Enum์ ํ์ฉํ์ฌ "์ด๋ค ํ์ ์ ์ด๋ค ์ ๋ต์ ๊ฐ์ง๋ค"๋ฅผ ๋ฏธ๋ฆฌ ์ธํ ํด ๋๋ฉด ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ํ ๊ณณ์ผ๋ก ๋ชจ์์ ธ ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค!
| public record CampDto(String camp) { | ||
|
|
||
| public static CampDto from(Camp camp) { | ||
| return new CampDto(CampFormatter.format(camp)); | ||
| } |
There was a problem hiding this comment.
DTO๋ ๋ทฐ์ ๋๋ฉ์ธ ์ฌ์ด์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ์ ์งํ๊ณ , ๋ทฐ ๋ณ๊ฒฝ์ด ๋๋ฉ์ธ๊น์ง ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ณดํธํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ณด๋๋ฅผ ์ถ๋ ฅํ ๋๋ ๋๋ฉ์ธ์ ๋ชจ๋ ๊ฐ์ ์ ๋ฌํ๊ธฐ๋ณด๋ค๋ ํ์ํ ๊ฐ๋ง ์ ๋ฌํ๊ธฐ ์ํด DTO๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ค๋ง camp๋ ๊ฐ์ด ๊ทธ๋๋ก ์ ๋ฌ๋์ด๋ ๋์ง๋ง, ๊ตฌ์กฐ์ ํต์ผ์ฑ์ ์ํด DTO๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
ํ์ง๋ง ๋จ์ํ ํต์ผ์ฑ์ ๋ง์ถ๊ธฐ ์ํด Camp โ CampDto์ ๊ฐ์ ๋ถํ์ํ ๋ณํ ๋ก์ง์ ์ถ๊ฐํ๋ฉด, ์ฝ๋๊ฐ ๋์ด๋๊ณ ์ ์ง๋ณด์๊ฐ ๋ณต์กํด์ ธ ์ฅ์ ๋ณด๋ค๋ ๋จ์ ์ด ๋ ํด ๊ฒ ๊ฐ๋ค์!!
๋ฐ๋ผ์ CampDto๋ฅผ ์ ๊ฑฐํ์์ต๋๋ค!!
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ฌํค~
ํผ๋๋ฐฑ ๋ฐ์ํ๋๋ผ ๊ณ ์ํ์
จ์ต๋๋ค. ๋ช๊ฐ์ง ์ถ๊ฐ ํผ๋๋ฐฑ ๋จ๊ฒจ๋จ์ต๋๋ค. ํ์ธ๋ถํ๋๋ ค์~
| import janggi.domain.piece.PieceRule; | ||
| import java.util.List; | ||
|
|
||
| public class EmptySlidingRule extends SlidingRule { |
There was a problem hiding this comment.
์์ ๊ตฌ์กฐ๊ฐ ๋๋ฌด ๋ณต์กํด์ง๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋จ ์ค๋ณต ์ฝ๋๋ฅผ ๊ณ ๋ คํ์ง๋ง๊ณ ์ค๊ฐ ๋จ๊ณ์ธ SlidingRule์ ์ ๊ฑฐํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
| if (!board.hasPieceAt(position)) { | ||
| continue; | ||
| } |
There was a problem hiding this comment.
continue๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ์์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์. ์ ์ด ํ๋ฆ์ด ๋์ผํ์ง ์์ผ๋ฉด ์ฝ๋๋ฅผ ๋ถ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ชจ๋ ์์๊ฐ ๋์ผํ ํ๋ฆ์ ๊ฐ๋๋ก ํต์ผํด๋ณด์์ฃ .
| } | ||
|
|
||
| private void validateDistance(DirectionInformation direction) { | ||
| if (!direction.hasAbsDifferences(diagonalDistance, STRAIGHT_DISTANCE + diagonalDistance)) { |
There was a problem hiding this comment.
distance์ difference๋ฅผ ํต์ผํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค์.
| HORSE(new DiagonalStepRule(1)), | ||
| CANNON(new JumpingSlidingRule()), | ||
| GUARD(new SingleStepRule(false)), | ||
| ELEPHANT(new DiagonalStepRule(2)), |
There was a problem hiding this comment.
๋ง์ ์์ด 1์นธ ์ ์ง์ด๋ผ๋ ์กฐ๊ฑด์ด ํ์ฌ๋ ๋์ผํ์ง๋ง ํ ์ข ๋ฅ๋ง 2์นธ ์ ์ง์ผ๋ก ๋ฐ๋๋ฉด ์๋ก์ ์ํฅ์ ์ฃผ๋ ๋ณ๊ฒฝ์ ํด์ผํ๋ ๊ฒ ๊ฐ๋ค์. ์ด๋ป๊ฒ ํ๋ฉด ๊ฐ์ ํ ์ ์์์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
ํ์ด: @MODUGGAGI
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
์๋ ํ์ธ์ ๋ฒ ๋ฃจ์ค! ๋ฌํค๐ ๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฒ ์ฅ๊ธฐ ๋ฏธ์ ์ ๋๋ฉ์ธ ๊ท์น์ด ์๋นํ ๋ณต์กํ๋ค๊ณ ๋๊ผ์ต๋๋ค..!
์ด๋ก ์ธํด ์ฌ๋ฌ ๋ถ๊ธฐ๊ฐ ์๊ธฐ๋ฉด์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฑฐ๋ ์ฝ๋ ์ค๋ณต์ด ๋ฐ์ํ๋ ๋ถ๋ถ๋ค์ ์ต๋ํ ๋คํ์ฑ์ ํ์ฉํด ํด๊ฒฐํด๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
๋ํ ์ฌ๋ฌ ํด๋์ค๋ก ์ฑ ์์ ๋ถ์ฐํ๋ค ๋ณด๋ ์ ์ฒด ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ค์์ง ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ฐ๋ผ์ ํด๋์ค์ ๋ฉ์๋ ์ด๋ฆ์ ์ ๊ฒฝ ์ฐ๊ธฐ, ๋ฉ์๋ ๋ถ๋ฆฌ ๋ฑ ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ด ์๋๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ต๋ํ ์ฝ๋์ ์ ์๋๋ฅผ ๋ด์ผ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
์๋๋ ๋ฏธ์ ์ ์งํํ๋ฉฐ ๊ณ ๋ฏผํ ๋ด์ฉ์ ๋๋ค!
์ง๋ฌธ์ด ์กฐํผ,,, ๋ง์ ๊ฒ ๊ฐ์ ์ค์๋ ํ๊ทธ๋ฅผ ํตํด ์ฐ์ ์์๋ฅผ ์ค์ ํด ๋ณด์์ต๋๋ค.
์ฐธ๊ณ ๋ถํ๋๋ฆฌ๋ฉฐ, 2์ฃผ ๊ฐ ์ ๋ถํ๋๋ฆฝ๋๋ค ๐
์ง๋ฌธ ์ค์๋ ํ๊ทธ ๊ท์น
[๐ด Must][ 1. ์ฅ๊ธฐ ๊ธฐ๋ฌผ ์ค๊ณ ๋ฐฉ์: Piece ์์ vs ํ๋ง๋ฒ interface ]
์ฅ๊ธฐ ๊ธฐ๋ฌผ์ ์ค๊ณํ๋ ๊ณผ์ ์์
Piece๋ฅผ ์์๋ฐ๋ ๊ตฌ์กฐ๋ก ๊ตฌํํ ์ง, ํน์ ํ๋ง๋ฒ์ interface๋ก ๋ถ๋ฆฌํ์ฌ ์ ๋ต ํจํด์ผ๋ก ๊ตฌ์ฑํ ์ง์ ๋ํด ๊ณ ๋ฏผํ์ต๋๋ค.์ฒ์์๋ ๊ฐ ๊ธฐ๋ฌผ์ด
Piece๋ฅผ ์์๋ฐ์ ์์ ์ ์ด๋ ๊ท์น์ ์ง์ ๊ตฌํํ๋ ๋ฐฉ์์ ๋ ์ฌ๋ ธ์ต๋๋ค.์ด ๋ฐฉ์์ ๊ตฌ์กฐ๊ฐ ์ง๊ด์ ์ด๋ผ๋ ์ฅ์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, โ์ฐจ(Chariot)๋ ๊ธฐ๋ฌผ(Piece)์ ํ ์ข ๋ฅ์ด๋ฉฐ ์์ ์ ์ด๋ ๋ก์ง์ ๊ฐ์ง๋คโ๋ ๊ด๊ณ๊ฐ ์ฝ๋์์๋ ์์ฐ์ค๋ฝ๊ฒ ๋๋ฌ๋๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ฝ๋ค๊ณ ๋๊ผ์ต๋๋ค.
๋ค๋ง ์ฅ๊ธฐ์ ์ด๋ ๊ท์น์ ์ดํด๋ณด๋ฉด์ ์ผ๋ถ ๊ธฐ๋ฌผ๋ค์ด ์ด๋ ๊ท์น์ ๋ถ๋ถ์ ์ผ๋ก ๊ณต์ ํ๋ค๋ ์ ์ด ์ ๊ฒฝ ์ฐ์์ต๋๋ค.
์๋ฅผ ๋ค์ด,
์ด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ์์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ๊ฒฝ์ฐ,
Chariot(์ฐจ)์ Cannon(ํฌ) ํด๋์ค ๋ด๋ถ์์ ์ง์ง ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ก์ง์ด ์ค๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ํ๋ง๋ฒ์
MoveStrategy์ ๊ฐ์ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๊ณ , ๊ธฐ๋ฌผ์ด ์ด๋ฅผ ์กฐํฉํ๋ ์ ๋ต ํจํด ๊ตฌ์กฐ๋ ๊ตฌํํ์์ต๋๋ค.์ด ๋ฐฉ์์์๋ ์ด๋ ๊ท์น์ ์กฐํฉ ๊ฐ๋ฅํ ๋จ์๋ก ๋ถ๋ฆฌํ ์ ์๊ธฐ์, ์ฐจ์ ํฌ์ฒ๋ผ ์ง์ง ์ด๋์ด๋ผ๋ ๊ณตํต ํ๋ง๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์กด์ฌํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฆฌ๋ทฐ ์์ฒญ ํฌ์ธํธ
ํํธ์ผ๋ก๋ ์ง์ ์ด๋๊ณผ ๊ฐ์ ๊ท์น์ด ์ผ๋ถ ๊ธฐ๋ฌผ์์ ๋์ผํ๊ฒ ๋ํ๋๋๋ผ๋, ์ด๋ฅผ ๋ฐ๋์ ์ฝ๋ ์ค๋ณต ๋ฌธ์ ๋ก ๋ด์ผ ํ๋์ง์ ๋ํด ๊ณ ๋ฏผ์ด ๋์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฐจ์ ํฌ๋ ๋ชจ๋ ์ง์ ์ด๋์ ํ์ง๋ง, ๋๋ฉ์ธ ๊ด์ ์์๋ ๊ฐ ๊ธฐ๋ฌผ์ด ๋ ๋ฆฝ์ ์ธ ์ด๋ ๊ท์น์ ๊ฐ์ง๋ค๊ณ ๋ณผ ์๋ ์์ต๋๋ค. ๋ํ ์ฐจ์ ์ด๋ ๊ท์น์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ํฌ์ ๊ท์น์ด ํจ๊ป ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ ๋ฎ๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์ค๋ณต ์ฝ๋๋ผ๊ณ ๋ณผ ์ ์์๊น์ ๋ํ ์๋ฌธ์ด ๋ค์์ต๋๋ค.
๋ํ ์ ๊ฐ ์์์ ์ฌ์ฉํ ๋ ๊ธฐ์ค์ผ๋ก ์ผ๋ ์กฐ๊ฑด๋ค์ ๊ณ ๋ คํ์ ๋, ์ฅ๊ธฐ ๊ธฐ๋ฌผ ๊ด๋ จ ์ํ์ ํ๋๋ค์ด ์์ ์ฌ์ฉ ์กฐ๊ฑด์ ํฌ๊ฒ ์ด๊ธ๋์ง๋ ์๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
์ ๊ฐ ์์์ ๊ณ ๋ คํ ์ ์๋ค๊ณ ์๊ฐํ๋ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์์ ํด๋์ค๊ฐ ์์์ ๊ณ ๋ คํด ์ค๊ณ๋ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด abstract ๋ฉ์๋๋ก ํ์ฅ ํฌ์ธํธ๋ฅผ ์ด์ด ๋๊ณ , final ๋ฉ์๋๋ก ๊ณตํต ๋ก์ง์ ์ ํํ๋ ๋ฑ ์์์ ์ ์ ๋ก ํ ๊ตฌ์กฐ๋ก ์ค๊ณ๋ ๊ฒฝ์ฐ์ ๋๋ค.
2. ์์ ํด๋์ค์ ๋ณ๊ฒฝ์ด ํ์ ํด๋์ค์ ํฐ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒฝ์ฐ
์์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ๋ด๋ถ ๊ตฌํ์ด ์ผ๋ถ ๋ณ๊ฒฝ๋๋๋ผ๋, ํ์ ํด๋์ค๊ฐ super ํธ์ถ์ด๋ ๋ด๋ถ ์ํ์ ๊ฐํ๊ฒ ์์กดํ์ง ์์ ๋ณ๋์ ์์ ์์ด ์์ ์ ์ผ๋ก ๋์ํ ์ ์๋ ๊ตฌ์กฐ๋ผ๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ์ ๋๋ค.
3. ํ์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ํ์ ์ผ๋ก ์นํํด๋ ์๋ฏธ๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์ ์ง๋๋ ๊ฒฝ์ฐ
๋ถ๋ชจ ํ์ ์ผ๋ก ์ฌ์ฉํ์ ๋ ํน์ ๋ฉ์๋๋ฅผ
UnsupportedOperationException์ผ๋ก ๋ง์์ผ ํ๊ฑฐ๋, ๋ถ๋ชจ ํด๋์ค๊ฐ ๋ณด์ฅํ ๋์์ ๊นจ๋จ๋ฆฌ์ง ์๋ ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋ค.ํ์ฌ ์ฅ๊ธฐ ๊ธฐ๋ฌผ ๊ตฌ์กฐ๊ฐ ์ ๊ธฐ์ค์ ํฌ๊ฒ ์๋ฐํ๋ค๊ณ ๋๊ปด์ง์ง๋ ์์์,
๊ฐ ๊ธฐ๋ฌผ์ด
Piece๋ฅผ ์์๋ฐ๊ณ ๊ฐ ํด๋์ค์์ ํ๋ง๋ฒ์ ์ง์ ๊ตฌํํ๋ ๊ตฌ์กฐ๋ ์ถฉ๋ถํ ๊ฐ๋ฅํ์ง ์์๊น?๋ผ๋ ์๊ฐ๋ ๊ฐ์ง๊ณ ์์ต๋๋ค.๋ฐ๋ผ์ ๋ฒ ๋ฃจ์ค๊ป์๋ ์ด๋ค ๊ด์ ์์ ์ฅ๊ธฐ ๊ธฐ๋ฌผ์ ๋ํด ์์ ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ์ ๋ต ํจํด ๊ธฐ๋ฐ ๊ตฌ์กฐ ์ค ์ด๋ค ์ค๊ณ๋ฅผ ๋ ์ ํธํ์ค์ง ๊ถ๊ธํฉ๋๋ค!
[๐ข Optional][ 2. ๋คํ์ฑ ํ์ฉ ๊ธฐ์ค ]
๋คํ์ฑ์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๊ฒฐ๊ตญ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํจ์ด๋ผ๊ณ ์ดํดํ๊ณ ์์ต๋๋ค. ๋ค๋ง ๊ตฌํ์ ํ๋ค ๋ณด๋, ์์ง ๋ฐ์ํ์ง ์์ ๋ฏธ๋์ ํ์ฅ ๊ฐ๋ฅ์ฑ๊น์ง ๊ณ ๋ คํ๋ค ๋ณด๋ฉด ์ค๋ฒ ์์ง๋์ด๋ง์ด ๋๋ ๊ฒ์ ์๋์ง์ ๋ํ ๊ณ ๋ฏผ๋ ๋ค์์ต๋๋ค.
ํนํ โ์ด๋๊น์ง๋ฅผ ์ค๊ณ๋ก ๋๋นํ๊ณ , ์ด๋์๋ถํฐ๋ ๊ณ ๋ คํ์ง ์๊ณ ๊ตฌํํ๋ ๊ฒ์ด ์ข์์งโ ๊ทธ ์ ์ ํ ์ ์ ํ๋จํ๋ ๊ฒ์ด ์ด๋ ต๋ค๊ณ ๋๊ผ์ต๋๋ค.
๋ฆฌ๋ทฐ ์์ฒญ ํฌ์ธํธ
ํ์ฅ์ฑ์ ๊ณ ๋ คํ ์ค๊ณ์ ์ค๋ฒ ์์ง๋์ด๋ง ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ์ด๋ค ๊ธฐ์ค์ผ๋ก ํ๋จํ์๋์ง ๊ถ๊ธํฉ๋๋ค!
์ฝ๋ ๊ด๋ จ ์ง๋ฌธ์ ๋ฐ๋ก ์ฝ๋ฉํธ ๋จ๊ฒจ๋์์ต๋๋ค.
์ด ์ธ์๋ ์์ ๋กญ๊ฒ ํผ๋๋ฐฑ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๋ฆฌ๋ทฐ ์ ๋ถํ๋๋ฆฝ๋๋ค๐๐ปโโ๏ธ