[๐ ์ฌ์ดํด1 - ๋ฏธ์ (๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ํ ๋ฆฌ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#243
[๐ ์ฌ์ดํด1 - ๋ฏธ์
(๋ณด๋ ์ด๊ธฐํ + ๊ธฐ๋ฌผ ์ด๋)] ํ
๋ฆฌ ๋ฏธ์
์ ์ถํฉ๋๋ค.#243Yeji-Kim-Erica wants to merge 45 commits intowoowacourse:yeji-kim-ericafrom
Conversation
- ์ ๋ ฅ ๊ฒ์ฆ ๋ฐ ์์ธ ์ฒ๋ฆฌ - ์ ๋ ฅ์ด ์ ์๊ฐ ์๋ ๊ฒฝ์ฐ - ์ ๋ ฅ๊ฐ์ ๋งคํ๋๋ ์ ๋ต ํจํด์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ - ์ ๋ต ํจํด ์๋ณ ๋ผ๋ฒจ ์ถ๊ฐ
- ๋๋ฉ์ธ ํจํค์ง ๋ถ๋ฆฌ
- isSameSide ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ ํ์ ์ Side ์์ Piece๋ก ์์
- BoardAssembler์๊ฒ ์ ๋ฌ๋ฐ์ 2์ฐจ์ ๋ฐฐ์ด ์ ๋ณด๋ฅผ ์กฐํฉํด Board ๊ฐ์ฒด๋ฅผ ์์ฑํจ - Board์ Map<Location, Piece> ๋ด์ฉ์ 2์ฐจ์ List ํํ๋ก ๋ฐํํจ
- ์ฅ๊ธฐ ๊ธฐ๋ฌผ์ ๊ธฐ๋ฌผ๋ช ํ๋๋ฅผ ์ถ๊ฐํจ - ํ(Side)์ ํ๋ช ํ๋๋ฅผ ์ถ๊ฐํจ - ๊ฐ ํ์ ์ฅ๊ธฐ ์ด๊ธฐํ ์ ๋ต์ ์ ํํ ์ ์๋๋ก ํ๋ฆ์ ์์ ํจ
์ ํ์ ๊ธฐ๋ฌผ๋ช ์ ๋ชจ๋ ํํํ ์ ์๋๋ก ํด๋์ค๋ช ์ Jol ์์ JolByeong์ผ๋ก ๋ณ๊ฒฝํจ
- ๊ธฐ๋ฌผ ์ด๋ ๊ท์น์ ์ฃผ์ ๊ฒ์ ๊ท์น์ผ๋ก ์ถ๊ฐ
- readInteger๋ฅผ readInt๋ก ๋ณ๊ฒฝ: Integer๋ ์ฐธ์กฐ ํ์ ํด๋์ค๋ช ์ผ๋ก, input ๊ฐ์ผ๋ก null์ด ๋ค์ด์ฌ ์ ์๋ค๋ ์๋ฏธ๋ฅผ ๋ดํฌํ ์ ์์ผ๋ฏ๋ก ๋ฉ์๋์ ์ค์ ๋ฐํ ํ์ ์ธ int๋ก ์์ ํจ
- ์ด๋ํ ๊ธฐ๋ฌผ์ ์์น๋ฅผ ์ ๋ ฅ๋ฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ - ๊ธฐ๋ฌผ์ ์ด๋์ํฌ ์์น๋ฅผ ์ ๋ ฅ๋ฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํจ
- ํ๋ก๋์ ํด๋์ค ํจํค์ง ๊ตฌ์กฐ์ ๋์ผํ๋๋ก ํ ์คํธ ํด๋์ค์ ํจํค์ง ๊ฒฝ๋ก ์์
- ๊ธฐ๋ฌผ์ ์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ขํ์ ๋ํด์ค ๊ฐ์ ์๋ ค์ฃผ๋ Direction ํด๋์ค ์ถ๊ฐ - ๊ธฐ๋ฌผ์ด ํน์ ์์น๋ก ์ด๋ํ๊ธฐ ์ํด ์ง๋์ณ์ผ ํ๋ ๊ฒฝ๋ก์ Location ๋ชฉ๋ก์ ์๋ ค์ฃผ๋ Route ํด๋์ค ์ถ๊ฐ - Piece ์ถ์ ํด๋์ค์ calculateRoute ์ถ์ ๋ฉ์๋ ์ถ๊ฐ - ์กธ๋ณ ๊ธฐ๋ฌผ์ ์ด๋ ๊ท์น์ ์ ์ฉํ ๊ธฐ๋ฌผ ์ด๋ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๋ง์ ์์ ํ์ ๊ด๊ณ ์์ด ๊ฒฝ๋ก ๊ณ์ฐ์ด ๊ฐ๋ฅํ๋ฏ๋ก ํ ์คํธ๋ช ์์ WhenTeamHan, WhenTeamCho ๋ฅผ ์ ๊ฑฐํจ
- ์ด๋ ๊ฒฝ๋ก ๊ณ์ฐ ๊ท์น์ด ์ค๋ณต๋๋ ๊ธฐ๋ฌผ์ ๊ณ์ฐ ๋ก์ง์ RouteRule ์ธํฐํ์ด์ค๋ก ์ถ์ํํจ - ๊ถ๊ณผ ์ฌ๋ ๊ถ์ฑ์ด๋ผ๋ ์์ญ ์ ํ ๊ท์น์ ๋์ผํ๊ฒ ๊ฐ์ง๋ฏ๋ก GungSeongRouteRule ์ด๋ผ๋ ๊ตฌํ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ํจ
- ๊ธฐ๋ฌผ ์ด๋ ๊ท์น์ ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง์: ์ด๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก, ๊ฒฝ๋ก ๋์ค์ ์ฅ์ ๋ฌผ์ด ์๋์ง ์ฌ๋ถ - ๊ฐ๊ฐ ๊ฒ์ฆ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ง๋ค๋ฉด์ '๊ท์น'์ ์๋ฏธ๊ฐ ์ฌ๋ฌ ํด๋์ค๋ก ํฉ์ด์ง๊ฒ ๋์๋ฏ๋ก, ๊ฐ ํด๋์ค๊ฐ ๊ฒ์ฆํ๋ ๋์์ ์ง์คํ ์ด๋ฆ์ผ๋ก ๋ค์ด๋ฐ ๋ณ๊ฒฝ
- direction์ผ๋ก ๋์ด์๋ ๊ท์น ํจํค์ง๋ช ์ rule๋ก ๋ณ๊ฒฝ - ๊ฒฝ๋ก์ ๊ดํ ๊ท์น์ ์ง๋ ์ธํฐํ์ด์ค ๋ฐ ํด๋์ค๋ค์ ํ์ ํจํค์ง์ธ route ํจํค์ง๋ก ์ด๋
- ํฌ๋ฅผ ์ ์ธํ ๊ธฐ๋ฌผ์ ์ด๋ ๊ฒฝ๋ก์ ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์กด์ฌํ๋์ง ํ์ธํ๊ณ ์์ธ๋ฅผ ๋ฐ์์ํค๋๋ก ํจ - ๋์ฐฉ์ง์ ๊ฐ์ ํ์ ๊ธฐ๋ฌผ์ด ์กด์ฌํ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋๋ก ํจ - ์ ์ฒด ์ฝ๋ ํฌ๋งทํ ์ ์ ๋ ฌํจ
- ํ ์คํธ์ฉ ๊ตฌํ ํด๋์ค๋ค์ support ํจํค์ง์ ๋ชจ์ผ๊ณ ํด๋์ค๋ช ์ Test๋ก ์์ํ๋๋ก ๋ค์ด๋ฐ ์ปจ๋ฒค์ ํต์ผ
- ํ ์คํธ์ฉ ์ ๋ต ํด๋์ค ์ถ๊ฐ
- ๊ธฐ๋ฌผ ์ด๋์ ์ถ๋ฐ ์ขํ์ ๋์ฐฉ ์ขํ๋ฅผ ๊ฒ์ฆํ๋ validate ๋ฉ์๋๋ค์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝ
- ์ํ๋ฅผ ๊ฐ์ง์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ฏ๋ก, ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ๋ง๊ธฐ ์ํด ์ฑ๊ธํค์ผ๋ก ๋ณ๊ฒฝ
- ์ํ๋ฅผ ๊ฐ์ง์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ฏ๋ก, ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ๋ง๊ธฐ ์ํด ์ฑ๊ธํค์ผ๋ก ๋ณ๊ฒฝ - BoardAssemblerTest๊ฐ ํ๋ก๋์ ์ ๋ต์ ์์กดํ์ง ์๋๋ก, ํ ์คํธ ์ ์ฉ ์ ๋ต ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ์ฌ ํ ์คํธ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค
- ์ํ๋ฅผ ๊ฐ์ง์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด์ด๋ฏ๋ก, ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ๋ง๊ธฐ ์ํด ์ฑ๊ธํค์ผ๋ก ๋ณ๊ฒฝ - Po ํด๋์ค์ RouteProvider ์์๊ฐ GungSeongRouteProvider์ ์ธ์คํด์ค๋ฅผ ํ ๋น๋ฐ๋ ๊ฒ์ Po์ ์ง์ ์ด๋ ๊ท์น์ ๋ง๋๋ก StraightRouteProvider์ ์ธ์คํด์ค๋ฅผ ํ ๋น๋ฐ๋๋ก ํจ์ผ๋ก์จ ๋ฒ๊ทธ ์์
- ๊ธฐ๋ฌผ์ ์ข ๋ฅ๋ฅผ ํํํ๋ PieceType Enum ํด๋์ค ๊ตฌํ - ๊ฐ ๊ธฐ๋ฌผ๋ง๋ค ๊ตฌํํ๋ Piece์ isEmpty() ์ถ์ ๋ฉ์๋๋ฅผ ์ผ๋ฐ ๋ฉ์๋๋ก ๋ณ๊ฒฝ - isEmpty() ํธ์ถ ์ PieceType์ด EMPTY์ธ์ง ํ์ธํ๋๋ก ๋ก์ง์ ์์ฑํด ์์ง๋๋ฅผ ๋์
- RouteProvider: ์ค๋ณต๋๋ ๊ธธ ์ฐพ๊ธฐ ํํฐ๋ง ๋ก์ง์ static ๋ฉ์๋(findValidPath)๋ก ์ถ์ถํด ์ผ์ํํ๊ณ ๋คํ์ฑ ๊ตฌ์กฐ ๊ฐ์ - Piece: ๊ธฐ๋ฌผ ๋ด๋ถ์ ๋ถํ์ํ ์์ธ ๋ฒ์ญ์ ๊ฑท์ด๋ด๊ณ , ์๋ฌ ๋ฐ์ ์ PieceType์ ์ ๋ฌํด ์ ํํ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋๋ก ์์ - Board: ์ถ๋ฐ์ง ์ ๋ณด๋ฅผ ํ์ฉํด ์ ์๋ฆฌ ์ด๋ ๋ฐฉ์ง ๋ก์ง์ ์ถ๊ฐํ๊ณ , ๋ถํ์ํ ๋ํผ ๋ฉ์๋๋ฅผ ์ ๊ฑฐํด ์์ง๋๋ฅผ ๋์ - ์๋๋ฅผ ๋ช ํํ ๋๋ฌ๋ด๋๋ก ๊ฐ์ข ํด๋์ค์ ๋ฉ์๋๋ช ๋ฐ ๋ณ์๋ช ๋ณ๊ฒฝ
- ArrangementStrategy: ๊ธฐ๋ณธ ๊ธฐ๋ฌผ(์ฐจ, ํฌ, ๊ถ ๋ฑ)์ ๋ฐฐ์นํ๋ ๊ณตํต ๋ก์ง์ ๋ถ๋ชจ์ public ๋ฉ์๋(place)๋ก ๋ฌถ๊ณ , BoardAssembler์ ์์นํด์๋ ๊ธฐ๋ฌผ ์์ฑ ๋ด๋ถ ํด๋์ค(DefaultPieceFactory)๋ฅผ ๊ฐ์ ธ์ด - BoardAssembler: ๊ธฐ๋ฌผ์ ๊ตฌ์ฒด์ ์ธ ์์น ์ง์์ ์ ๊ฑฐํ๊ณ , ๊ฐ ์ง์์ ์ ๋ต ๊ฐ์ฒด์ ๋ณด๋ํ ์กฐ๋ฆฝ์ ์์ํ๋๋ก ์ฑ ์ ์ถ์ - ํ์ ์ ๋ต ํด๋์ค๋ placeVariablePieces()๋ง ๊ตฌํํด ๋ณ๋ ๊ธฐ๋ฌผ(๋ง, ์) ๋ฐฐ์น๋ง ๋ด๋นํ๋๋ก ๊ตฌ์กฐ ๊ฐ์ - ๋ณ๊ฒฝ๋ ์ฑ ์์ ๋ง๊ฒ BoardAssemblerTest๋ ๋น์นธ ์ฑ์ฐ๊ธฐ๋ง ๊ฒ์ฆํ๋๋ก ํ๊ณ , ArrangementStrategyTest์ ๊ธฐ๋ณธ ๊ธฐ๋ฌผ ๋ฐฐ์น ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ
- JanggiFlow: ์๋ชป๋ ์ ๋ ฅ(์ ๋ต, ๊ธฐ๋ฌผ ์ ํ, ์ด๋ ์ขํ)์ผ๋ก ์์ธ ๋ฐ์ ์, ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์ ์ ์ ๋ ฅ๋ ๋๊น์ง ๋ค์ ์์ฒญํ๋ ๋ก์ง ์์ ๋ฐ ์ถ๊ฐ - RouteProvider: ๊ธฐ๋ฌผ ์ด๋ ๊ฒฝ๋ก ์๋ฐ ์๋ฌ ๋ฉ์์ง ์์ - ConsoleWriter: ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ํ, ๋ณด๋ํ ์ถ๋ ฅ ์ ๊ฐํ์ ์ถ๊ฐํด ์ฝ์ ํ๋ฉด ๊ฐ๋ ์ฑ ๊ฐ์
- Application, JanggiFlow: ์ ๋ต ๊ฐ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝํด OCP ์ค์ - JanggiFlow, ApplicationView: ์ปจํธ๋กค๋ฌ์์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์์ ๋ฐ์ดํฐ๋ก ๋ณํ ํ ๋ทฐ์ ์ ๋ฌํ๋๋ก ์์ ํด ๊ฐํ ๊ฒฐํฉ๋ ํด์ - JanggiFlow: ๋ทฐ์ ์ปจํธ๋กค๋ฌ์ ๋ถ์ฐ๋์ด์๋ ์ฌ์ ๋ ฅ ๋ก์ง์ ์ปจํธ๋กค๋ฌ์์ ๋ชจ๋ ๊ด๋ฆฌํ๋๋ก ํ๋ฆ ์ ์ด ์ฑ ์ ์ผ์ํ
Chocochip101
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์, ํ
๋ฆฌ ๋ฐ๊ฐ์ต๋๋ค! ๋ฏธ์
๋ฆฌ๋ทฐ์ด๋ก ํจ๊ปํ๊ฒ ๋ ์ด์ฝ์นฉ์
๋๋ค ๐ช
๋ฏธ์
์ ๊ตฌํํด์ฃผ์
จ๋ค์ ๐
์ฝ๋ฉํธ ๋จ๊ฒจ๋์์ผ๋ ํ์ธํด๋ณด์๊ณ ์ฌ์์ฒญ์ฃผ์ธ์!
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
||
| public class JanggiFlow { |
There was a problem hiding this comment.
Flow๋ ์ด๋ค ๊ฒ์ ์๋ฏธํ๋์?
There was a problem hiding this comment.
์ controller ํจํค์ง ์์ ์๋์? controller๋ ๋ฌด์์ ์๋ฏธํ๋์?
There was a problem hiding this comment.
ํด๋์ค์ ์ญํ ๊ณผ ๋ค์ด๋ฐ์ ๋ํด ๋ณธ์ง์ ์ธ ๊ณ ๋ฏผ์ ๋์ ธ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
๋ ์ง๋ฌธ์ด ๊ฒฐ๊ตญ '์ด ํด๋์ค์ ์ ์ฒด์ฑ'์ ํฅํ๊ณ ์์ด์ ํจ๊ป ๋ฌถ์ด์ ๋ต๋ณ์ ๋จ๊ฒจ๋ด
๋๋ค.
1. Controller๋ ๋ฌด์์ ์๋ฏธํ๊ณ , ์ ์ด ํจํค์ง์ ์๋์?
์ ๊ฐ ์๊ฐํ Controller๋ Model๊ณผ View ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ค์ฌ์์
๋๋ค. Board, Piece ๋ฑ์ ๋๋ฉ์ธ์ ์ฝ์ ์
๋ ฅ/์ถ๋ ฅ์ ์ ํ ๋ชจ๋ฅธ ์ฑ ์์ ์ฅ๊ธฐ ๊ท์น๋ง ์ฒ๋ฆฌํ๊ณ , View๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ์กฐ์ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ง ๋ฟ๋ฆฌ๋๋ก ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ด ๋ชฉํ์์ต๋๋ค.
ํ์ฌ ์ด ํด๋์ค๋ View๋ฅผ ํตํด ์ฌ์ฉ์์ ์
๋ ฅ์ ๋ฐ๊ณ , ๋๋ฉ์ธ ๋ฉ์๋๋ฅผ ํธ์ถํด ๋ช
๋ น์ ๋ด๋ฆฌ๋ฉฐ, ๋ค์ ๋๋ฉ์ธ์ ์ํ๋ฅผ View๋ก ์ ๋ฌํ๋ ๋ค๋ฆฌ ์ญํ ์ ์ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ controller ํจํค์ง์ ๋ฐฐ์นํ์ต๋๋ค.
2. Flow๋ ์ด๋ค ๊ฒ์ ์๋ฏธํ๋์?
'Flow'๋ผ๋ ์ด๋ฆ์ ์ด ์ปจํธ๋กค๋ฌ๊ฐ ์ฅ๊ธฐ ๊ฒ์์ ์ ์ฒด์ ์ธ ์งํ ํ๋ฆ์ ์ ์ดํ๋ค๋ ์๋ฏธ๋ก ์ง์์ต๋๋ค.
(๋ฐฐ์น ์ ๋ต ๋ฌป๊ธฐ -> ์ด๊ธฐ ์ธํ
-> ์นํจ๊ฐ ๋ ๋๊น์ง ํด์ ๋ฐ๋ณตํ๋ฉฐ ๊ธฐ๋ฌผ ์ด๋ํ๊ธฐ)
๋ค๋ง ์ง๋ฌธ์ ๋ฐ๊ณ ๋ค์ ์๊ฐํด ๋ณด๋, 'Flow'๋ผ๋ ๋จ์ด๋ ์ํ๋ ์ญํ ๋ณด๋ค๋ 'ํ์ ์์ฒด'์ ๊ฐ๊น์ด ์ถ์์ ์ธ ๋จ์ด๋ผ,
์ฒ์ ์ฝ๋๋ฅผ ๋ณด๋ ์ฌ๋์๊ฒ ์ด ํด๋์ค๊ฐ MVC์ ์ปจํธ๋กค๋ฌ๋ผ๋ ์ ์ด ์ง๊ด์ ์ผ๋ก ์๋ฟ์ง ์์ ์๋ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์ด ํด๋์ค์ ์ค์ฌ์ ์ญํ ์ด ๋ ๋ช
ํํ ๋๋ฌ๋๋๋ก JanggiController ํน์ ๊ฒ์์ ์ ์ฒด ํ๋ฆ์ ํต์ ํ๋ค๋ ์๋ฏธ์ GameController๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ ๊ถ์ฅํ์๋์ง ์ด์ฝ์นฉ์ ์๊ฒฌ์ด ๊ถ๊ธํฉ๋๋ค! ๐โโ๏ธ
- ApplicationView์ ์ ์ถ๋ ฅ ๋ฉ์๋ ์ ๋์ฌ๋ฅผ ์๋๊ฐ ๋ ๋ช ํํ `promptFor`, `show`๋ก ๋ณ๊ฒฝํด ๊ฐ๋ ์ฑ ํฅ์ - `convertBoardStatus` ๋ด๋ถ์ `boradIn2D` ๋ณ์๋ช ์คํ๋ฅผ `boardIn2D`๋ก ์์ - `repeatAskLocationToMoveUntilSuccess` ๋ฉ์๋์์ ์ฌ์ฉํ์ง ์๋ ๋ถํ์ํ ๋งค๊ฐ๋ณ์(`turnSide`) ์ ๊ฑฐ
- ๊ธฐ์กด ๋ก์ง์์ HAN์ด ์๋ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด HAN์ ๋ฐ์ํด, NONE ๋ฑ ์ ํจํ์ง ์์ ์ํ์์ ํธ์ถ๋ ์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ๋ฒ๊ทธ ์ฐจ๋จ - CHO ์ํ์ผ ๊ฒฝ์ฐ์๋ง ๋ช ์์ ์ผ๋ก HAN์ ๋ฐํํ๋๋ก ์กฐ๊ฑด ๊ฐ์ - ์ ํจํ์ง ์์ ์ง์์์ ์ํ ๋ฐ์ ์๋ ์ UnsupportedOperationException์ ๋์ง๋๋ก ์์ธ ์ฒ๋ฆฌ ์ถ๊ฐ
- ์ต์์ ArrangementStrategy๋ฅผ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํด ์ญํ ๋ช ํํ - ๋ง/์ ๋ฐฐ์น๋ฅผ ์ ์ธํ ๊ณ ์ ๊ธฐ๋ฌผ ๋ฐฐ์น๋ฅผ ๋ด๋นํ๋ MaSangArrangementTemplate ์ถ์ ํด๋์ค ๋์ : ๊ธฐ๋ฌผ ์ด๊ธฐํ์ ๋ฐ์ํ๋ ๋ฎ์ด์ฐ๊ธฐ ๋ฌธ์ ํด๊ฒฐ ๋ฐ OCP ํ๋ณด - ๋๋ฉ์ธ์ด UI ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์๋ StrategyLabel์ ์ญ์ ํ๊ณ , ์ ๋ ฅ ๋ฒํธ์ ์ ๋ต ๊ฐ์ฒด๋ฅผ ๋งคํํ๋ ArrangementStrategyResolver ๋์ - JanggiFlow ๋ด๋ถ์ ์ ๋ต ๊ฐ์ฒด ๋งคํ ๋ฐ ์บ์ฑ ๋ก์ง์ Resolver๋ก ์์ํด ์ปจํธ๋กค๋ฌ ๋ฌด์ํ ์ ์ง ๋ฐ ์ฑ ์ ๋ถ๋ฆฌ - ํ์ ์ ๋ต ๊ตฌํ์ฒด๋ค์ ๋ค์ด๋ฐ์ ๋ช ํํ๊ฒ ๋ณ๊ฒฝ (ex. MaSangMaSang -> MaSangMaSangStrategy)
โถ Piece & Movement ๊ตฌ์กฐ ๊ฐํธ - Piece๋ฅผ ์ธํฐํ์ด์ค๋ก ๋ณ๊ฒฝํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ActivePiece์ EmptyPiece๋ก ์ผ์ํ - ๊ธฐ์กด ๊ฐ๋ณ ๊ธฐ๋ฌผ ํด๋์ค(Cha, Ma, Sang ๋ฑ)๋ฅผ ์์ ์ด๋ ์ ๋ต์ธ Movement ๊ตฌํ์ฒด(ChaMovement, MaMovement ๋ฑ)๋ก ๋ถ๋ฆฌ - PieceFactory๋ฅผ ๋์ ํด PieceType๊ณผ Movement ๋งคํ ๋ฐ ๊ฐ์ฒด ์กฐ๋ฆฝ ์ฑ ์ ์บก์ํ - Ma, Sang์ ๊ฒฝ๋ก(possibleRoute) static ์ด๊ธฐํ ์์ ๊ผฌ์์ผ๋ก ์ธํ null ํ ๋น ์ด์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ฑ์ ๋ด๋ถ ์ด๊ธฐํ๋ก ์์ โถ RouteProvider & Collision ๊ฒ์ฆ ๋ก์ง ๊ฐ์ - RouteProvider๊ฐ ๊ฒฝ๋ก ํ์ ์คํจ ์ ์์ธ ๋์ Optional.empty()๋ฅผ ๋ฐํํ๋๋ก ๋ณ๊ฒฝํด ์ค์ ์์ธ ๋ฐ์ ์ง์ ์ Piece๋ก ์ค์ . ์ด์ ๋ฐ๋ผ ์์ธ ๋ฉ์์ง์์ ๊ธฐ๋ฌผ ์ด๋ฆ์ ํ์ํ๊ธฐ ์ํด PieceType์ ๋๊ฒจ์ฃผ๋ ๋ถ๋ถ์ ์ ๊ฑฐํ ์ ์์์. - CollisionDetector๊ฐ Piece ๊ฐ์ฒด ๋์ Side ์ ๋ณด๋ง์ผ๋ก ์ถฉ๋์ ํ๋ณํ๋๋ก ๊ฒฐํฉ๋ ์ํ โถ ์ด๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น ๊ตฌ์กฐ ๊ฐ์ - ArrangementStrategyResolver๋ฅผ ์ญํ ์ ๋ง๊ฒ ArrangementOption์ผ๋ก ์ด๋ฆ ๋ณ๊ฒฝ ๋ฐ ์ง๊ด์ ์ธ ๋ฉ์๋๋ช ์ ์ฉ - Strategy ๊ตฌํ์ฒด๊ฐ ์์ฑ์๋ก ์ง์์ ๋ฐ์์ ํ๋์ ์ ์ฅํ๊ณ ๋ก์ง์ ์ ์ฉํ๋๋ก ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํด BoardAssembler๊ฐ ํ๋์ฝ๋ฉ๋ ์ง์์ ๋ด๋ถ ๋ก์ง์์ ์ฌ์ฉํ๋ ๋์ List<ArrangementStrategy>๋ฅผ ์ ์ฐํ๊ฒ ๋ฐ์ ์ ์๊ฒ ํจ โถ ํ ์คํธ ์ฝ๋ ํํํ ๋ฐ ๊ฐ๋ ์ฑ ํฅ์ - ๋ณ๊ฒฝ๋ Optional ๋ฐํ ํ์ ์ ๋ง์ถฐ hasValue(), isEmpty() ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ฆ ๋ก์ง ์ ๋ฉด ์์ - ํ ์คํธ ๋ฉ์๋๋ช ๋ฐ @DisplayName์ ๊ตฌํ ์์ธ(ํ๋ผ๋ฏธํฐ ๋ฑ)๊ฐ ์๋ ํ์์ ๋๋ฉ์ธ ์ฉ์ด ์ค์ฌ์ผ๋ก ๊ฐ์
- ConsoleWriter๊ฐ RuntimeException ๊ฐ์ฒด ๋์ String ํ์ ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ธ์๋ก ๋ฐ๋๋ก ์์ - Controller์์ ์์ธ๋ฅผ ์บ์นํด ๋ฉ์์ง๋ง ์ถ์ถํ ๋ค View์ ์ ๋ฌํ๋๋ก ํ๋ฆ ๋ณ๊ฒฝ - View๊ฐ ์์ธ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ์ ํ์ ์์ด '์ถ๋ ฅ'์ด๋ผ๋ ๋ณธ์ฐ์ ์ญํ ์๋ง ์ง์คํ๋๋ก ๊ฒฐํฉ๋ ์ํ
- Board ํด๋์ค์์ ์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ ํ๋์ฝ๋ฉ๋ ์ซ์ 0์ FIRST_ROW_INDEX ์์๋ก ๋ถ๋ฆฌํด ๋งค์ง ๋๋ฒ ์ ๊ฑฐ ๋ฐ ๊ฐ๋ ์ฑ ํฅ์
- ์๋ชป๋ ์ ๋ ฅ์ด ๋ฐ๋ณต๋ ๊ฒฝ์ฐ Call Stack์ด ์์ฌ StackOverflowError๊ฐ ๋ฐ์ํ๋ ์ํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ๊ท ๋์ while ๋ฐ๋ณต๋ฌธ ์ ์ฉ - ์ฌ๋ฌ ์ ๋ ฅ ๋ก์ง์์ ์ฌ์๋ ๋ก์ง์ด ์ค๋ณต๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด, Supplier๋ฅผ ํ์ฉํ ๊ณตํต retry() ๋ฉ์๋๋ฅผ ๊ตฌํํด ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ ํฅ์
- BoardAssembler์ ์ด๊ธฐํ ์์๋ฅผ '๋น์นธ null ์ฒดํฌ' ๋ฐฉ์์์ 'EmptyPiece ์ ๋ฐฐ์น ํ ๋ฎ์ด์ฐ๊ธฐ' ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
- Board ์ด๊ธฐํ ์ ํ ๋จ์ ๋งคํ ๋ก์ง์ ๋ฉ์๋๋ก ์ถ์ถํด indent depth๋ฅผ 1๋ก ๊ฐ์ - Board ์ถ๋ ฅ์ ์ํ to2DArray() ๋ด๋ถ์ 2์ค for๋ฌธ ์ญ์ ๋ณ๋ ๋ฉ์๋๋ก ์ถ์ถํด indent depth๋ฅผ 1๋ก ๊ฐ์
- ์ฌ์ฉ์๊ฐ ๊ธฐ๋ฌผ์ ์์น๋ฅผ ์ฝ๊ฒ ํ์ ํ๊ณ ์ ๋ ฅํ ์ ์๋๋ก ConsoleWriter์ ํ/์ด ์ขํ ์ถ๋ ฅ ๋ก์ง ์ถ๊ฐ - ํ๊ธ ๊ธฐ๋ฌผ๊ณผ ์ซ์ ๊ฐ์ ์ฝ์ ์ถ๋ ฅ ๋๋น(์๊ฐ์ ํฌ๊ธฐ) ์ฐจ์ด๋ก ์ธํ ์ ๋ ฌ ๊นจ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์๋จ ์ด ๋ฒํธ์ ์ ๊ฐ ์ซ์๋ฅผ ๋์ ํด ์๋ฒฝํ ๊ฒฉ์ ์ ๋ ฌ ๊ตฌํ - ์ฌ์ฉ์๊ฐ ํ์ธํ๊ณ ์ ๋ ฅํ๋ ์ขํ(1~10, 1~9)๋ฅผ ๋ด๋ถ 2์ฐจ์ ๋ฐฐ์ด์ฉ ์ขํ๋ก ๋ณํํ๋ ์ฑ ์์ ๋๋ฉ์ธ(Location)์ ์บก์ํ - Location ํฉํ ๋ฆฌ ๋ฉ์๋ ์ญํ ๋ณ๊ฒฝ์ ๋ฐ๋ผ, ๊ธฐ์กด ํ ์คํธ ์ฝ๋๋ค์ Location ์์ฑ ๋ฐฉ์์ ์ผ๊ด ์์
Chocochip101
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์, ํ
๋ฆฌ!
์ ๋ฐ์ํด์ฃผ์
จ๋ค์ ๐๐ป
๋ช ๊ฐ์ ์ปค๋งจํธ ๋จ๊ฒผ์ผ๋ ํ์ธํด์ฃผ์ธ์.
|
|
||
| import java.util.List; | ||
|
|
||
| public record Location(int x, int y) { |
There was a problem hiding this comment.
์ผ๋ฐ์ ์ผ๋ก x๋ ์ด, y๋ ํ์ ์๋ฏธํ์ง ์๋์?(์๊ณ ๋ฆฌ์ฆ ํ ๋ ๊ทธ๋ ๊ฒ ์ผ๋ ๊ธฐ์ต์ด ์๋ค์ ๐ค)
์ฌ๊ธฐ๋ ๋ฐ๋๋ก ์ฐ์ด๋ ๊ฒ ๊ฐ๋ค์. ์๋๋ฉด row, col๋ก ๋ ๋ช
์์ ์ผ๋ก ํํํ๋ ๊ฒ์ ์ด๋ค๊ฐ์?
| public class ConsoleWriter implements Output { | ||
|
|
||
| private static final String BLANK = " "; | ||
| private static final List<String> FULL_WIDTH_NUMBERS = |
There was a problem hiding this comment.
์์ํ ๐๐ป
BoardAssembler์ DEFAULT_ROWS, DEFAULT_COLS๊ฐ ๋ฐ๋๋ฉด ์ฌ๊ธฐ๋
|
|
||
| HAN("ํ"), | ||
| CHO("์ด"), | ||
| NONE("์์"); |
|
|
||
| HAN("ํ"), | ||
| CHO("์ด"), | ||
| NONE("์์"); |
There was a problem hiding this comment.
์๋์ ๊ฐ์ด ์ฐ๋ฉด, ๋ค์ ์ฌ๋์ด ๋ค๋ฅธ Enum์ ์ถ๊ฐํ ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ ์กํ๊ฒ ๋ฉ๋๋ค :)
| NONE("์์"); | |
| NONE("์์"), | |
| ; |
| }).toList(); | ||
| return List.copyOf(integers); |
There was a problem hiding this comment.
.toList()๋ ์ด๋ฏธ ๋ถ๋ณ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํด์, copyOf๊ฐ ๋ถํ์ํด๋ณด์ด๋ค์.
| class RouteTest { | ||
|
|
||
| @Test | ||
| @DisplayName("ํ์ฌ ์์น์์ ์ฃผ์ด์ง Direction ๋ค์ ์ ์ฉํ์ ๋ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ค.") |
There was a problem hiding this comment.
์ด๋ ๋ถ๊ฐ ๊ฒฝ๋ก๋ก ์ด๋ ์๋(์๋ฅผ๋ค์ด ์ฐจ๊ฐ ๋๊ฐ์ ์ด๋ ์๋, ๊ฒฝ๋ก์ ๊ธฐ๋ฌผ์ด ์์ ๋ ๋ฑ)์ ๋ํ ์คํจ ํ ์คํธ๊ฐ ์๋์? ๐
| private Piece createPiece(Side side) { | ||
| if (this == JOLBYEONG) { | ||
| return FACTORY.createActivePiece(getJolOrByeongBySide(side), side); | ||
| } | ||
| return FACTORY.createActivePiece(this.pieceType, side); |
There was a problem hiding this comment.
DefaultPieceFactory์ Enum์ผ๋ก Piece๋ฅผ ๊ตฌ๋ถํ๋๋ฐ, createPiece์์ ๋ถ๊ธฐ์ฒ๋ฆฌํ๋ค์.
๊ทธ๋ฆฌ๊ณ enum์ JOLBYEONG์ PieceType.JOL์ ๋ค๊ณ ์๋๋ฐ, pieceType ํ๋๋ฅผ ์ฐ์ง ์๋ค์.
์๋์ฒ๋ผ ์ฒ๋ฆฌํด๋ณด๋๊ฑด ์ด๋ค๊ฐ์?
JOLBYEONG(3, List.of(0, 2, 4, 6, 8),
side -> side == Side.HAN ? PieceType.BYEONG : PieceType.JOL); | this.name = name; | ||
| } | ||
|
|
||
| public Side switchSide() { |
There was a problem hiding this comment.
enum์ด ์์ ์ ๋ค์ ์ํ๋ฅผ if/if๋ก ํ๋จํ๊ณ ์๋ค์.
์์๊ฐ ์์ ์ ๋ค์ ์ํ๋ฅผ ์ง์ ์๊ฒ ํ ์ ์์ง ์์๊น์?
| protected final PieceType pieceType; | ||
| protected final Side side; |
There was a problem hiding this comment.
private์ผ๋ก ๋ณ๊ฒฝํด๋ ๋๊ฒ ๋ค์.
๐ ์ธ์ฌ๋ง
์๋ ํ์ธ์, ์ด์ฝ์นฉ! ๋ฆฌ๋ทฐ์ด ํ ๋ฆฌ์ ๋๋ค.
๊ท์คํ ์๊ฐ์ ๋ฆฌ๋ทฐ ์ฐธ์ฌ์ ํ ์ ํด์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ๊ฐ ์์ด ๋ถ์กฑํ ๋ถ๋ถ๋ค์ ๋ํด ์๋ ค์ฃผ์ธ์.
์ต์ ์ ๋คํด ๊ฐ์ ํ๊ณ ๊ณต๋ถํ๊ฒ ์ต๋๋ค. ๐โโ๏ธ
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
๊ณ ๋ฏผํ๋ ๋ถ๋ถ
1. ์ํ ์์ ์ ์ฑ ์์ ์ผ์น: ๊ธฐ๋ฌผ์ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ง๋ ์ฃผ์ธ์ ๋๊ตฌ์ธ๊ฐ
'๊ธฐ๋ฌผ์ ํ์ฌ ์์น(Location)'๋ผ๋ ์ํ๋ฅผ
Piece๊ฐ์ฒด๊ฐ ๊ฐ์ ธ์ผ ํ ์ง, ์๋๋ฉด ๊ธฐ๋ฌผ์ ๊ด๋ฆฌํ๋Board๊ฐ ๊ฐ์ ธ์ผ ํ ์ง ๊ณ ๋ฏผํ์ต๋๋ค.ํ์ค ์ธ๊ณ๋ฅผ ๋ฐ์ํ๋ฉด ๊ธฐ๋ฌผ์ด ์์ ์ ์์น๋ฅผ ์๋ ๊ฒ์ด ์์ฐ์ค๋ฌ์ ๋ณด์์ง๋ง, ๋ง์ฝ
Piece๊ฐ ์์น๋ฅผ ๊ฐ์ง๋ค๋ฉดBoard๊ฐ ๊ธฐ๋ฌผ์ ์ด๋์ํฌ ๋๋ง๋คgetter/setter๋ฅผ ์ฌ์ฉํด ์ํ๋ฅผ ๋ฌป๊ณ ๋ณ๊ฒฝํด์ผ ํ๋ฏ๋ก ์บก์ํ๋ฅผ ์ ํดํ๋ค๊ณ ํ๋จํ์ต๋๋ค.๋ฐ๋ผ์ ์ํ๋ฅผ ์ง์ ์กฐ์ํ๊ณ ํ์ฉํ๋ ์ฃผ์ฒด์ธ
Board๊ฐ ์์น ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋๋ก ์ค๊ณํ์ต๋๋ค."ํ์ค ์ธ๊ณ์ ๋ชจ๋ฐฉ"๋ณด๋ค "์ฑ ์ ์ฃผ์ฒด์ ์ํ ์์ ์ ์ผ์น"๋ฅผ ์ฐ์ ์ํด์ผ ํ๋ค๋ ๊ธฐ์ค์ ์ธ์ฐ๊ณ ์ค๊ณํด๋ดค๋๋ฐ, ์ด ์ค๊ณ ๋ฐฉํฅ์ด ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ ์ ํ์ง ์ด์ฝ์นฉ์ ์๊ฒฌ์ด ๊ถ๊ธํฉ๋๋ค!
2. ๊ธฐ๋ฌผ ๋์ ์์ฑ ์ ๋ฆฌํ๋ ์ vs ํจ์ํ ์ธํฐํ์ด์ค
BoardAssembler์์ ๊ฐ ๊ธฐ๋ฌผ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, ์ด๊ธฐ์๋ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ต๋๋ค.ํ์ง๋ง ํ์ด์ ์๊ฒฌ์ ๋๋๊ณ ์ ๋ณด๋ฅผ ์ฐพ์๋ณด๋ ๊ณผ์ ์์ ๋ฆฌํ๋ ์ ์ ํ์ ์์ ์ฑ์ ์ ํดํ๊ณ ๋ฐํ์ ์๋ฌ๋ฅผ ์ ๋ฐํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Java 8์ ํจ์ํ ์ธํฐํ์ด์ค(
Function<Side, Piece>)์ ์์ฑ์ ์ฐธ์กฐ๋ฅผ ํ์ฉํด ํฉํ ๋ฆฌ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค. ์ด๋ฅผ ํตํด DIP๋ฅผ ์๋ฐํ์ง ์์ผ๋ฉด์๋ ์์ ํ๊ฒ ๋์ ์ผ๋ก ๊ธฐ๋ฌผ์ ์์ฑํ ์ ์์๋๋ฐ, ๋ ๋์ ๊ฐ์ ๋ฐฉํฅ์ด ์์์ง ๊ถ๊ธํฉ๋๋ค.3. View์ Domain์ ๊ฒฝ๊ณ ๋ฐ ํ๋ฆ ์ ์ด
์์กด์ฑ:
ApplicationView๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด์ธArrangementStrategy์ธ์คํด์ค๋ฅผ ์ง์ ์๊ณ ์๋ ๊ฒ์ด ๋๋ฉ์ธ ๊ฒฝ๊ณ๋ฅผ ํ๋ฆฐ๋ค๊ณ ํ๋จํ์ต๋๋ค. ๋ฐ๋ผ์ View์๋ ์์ ๋ฐ์ดํฐ์ธ Enum์ ์์๊ฐ์ด๋ String๋ง ๋๊ธฐ๋๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค.ํ๋ฆ ์ ์ด: ์ฌ์ฉ์ ์ ๋ ฅ ์ฌ์๋ ๋ก์ง์ ์ฑ ์์ ์ด๋ป๊ฒ ๋๋์ง ๊ณ ๋ฏผํ์ต๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก
View๋ '์ ๋ ฅ ํ์ ์์ฒด(๊ณต๋ฐฑ, ์ซ์ ์ฌ๋ถ ๋ฑ)'์ ๋ํ ์์ธ ๋ฐ์์ ๋ด๋นํ๊ณ ,Controller(JanggiFlow ํด๋์ค)๋ view์์ ๋ฐ์์ํจ ์์ธ์ '๋๋ฉ์ธ ๋ก์ง ๊ฒ์ฆ(์ ํจํ ์ ๋ต ๋ฒํธ, ๋ณด๋ ์ด๋ ๊ฐ๋ฅ ์ฌ๋ถ ๋ฑ)' ์คํจ์ ๋ํ ์์ธ๋ฅผ ์ก์์ ์ฌ์๋๋ฅผ ๋ด๋นํ๋๋ก ์ญํ ์ ์ค์ ํ์ต๋๋ค. ์ด ๊ณ์ธต ๊ฐ์ ์ฑ ์ ๋ถ๋ฆฌ๊ฐ ์ ์ ํ๊ฒ ์ด๋ฃจ์ด์ก๋์ง ์ค์ ์ ์ผ๋ก ์ดํด๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.์์ง๊น์ง ๋๋ฉ์ธ๊ณผ ์ ์ถ๋ ฅ์ ์ฐ๊ฒฐ ๋ค๋ฆฌ์ธ Controller๊ฐ ์ด๋๊น์ง ์ฑ ์์ ์ ธ์ผ ํ๋์ง์ ๋ํ ๊ธฐ์ค์ด ๋ชจํธํ ์ํ์ธ๋ฐ ์ง๊ธ์ ์ญํ ์ฑ ์ ๋ถ๋ฆฌ๊ฐ ์ ์ ํ์ง๋ ๊ถ๊ธํฉ๋๋ค!