μν ν¨ν΄μ΄λ?
μν ν¨ν΄μ΄λ, μΌλ ¨μ κ·μΉμ λ°λΌ κ°μ²΄μ μνλ₯Ό λ³νμμΌ κ°μ²΄κ° ν μ μλ νμλ₯Ό λ°κΎΈλ κ²μ μλ―Ένλ€.
μ¦, λμΌν λ©μλλ₯Ό κ°μ²΄μ μνμ λ°λΌ λ€λ₯΄κ² λμν μ μλλ‘ νλ κ²μ΄λ€.
κ°μ²΄μ μνλ₯Ό λ³λμ νμ μΌλ‘ λΆλ¦¬νκ³ μν λ³ νμ νμ μ ꡬννμ¬ μ¬μ©νλ€.
μΆμν λ λμΌν λ©μλμ μνλ§λ€ λ€λ₯Έ νΉμ κΈ°λ₯μ μνν ν λ€μ μνλ₯Ό λ°ννλ κ²μ΄ ν΅μ¬μ΄λ€.
μν ν¨ν΄ μ μ©
μΈν°νμ΄μ€
public interface BoardState {
boolean isEnd();
boolean isBlackTurn();
Winner findWinner();
BoardState move(Position start, Position target);
Rank getRank(int rankLine);
BoardState terminate();
double calculateBlackScore();
double calculateWhiteScore();
}
μ²΄μ€ λ―Έμ μ μ§ννλ©΄μ μ²΄μ€ κ²μμ μνλ₯Ό μν ν¨ν΄μ μ μ©νμ¬ κ΅¬νν΄λ³΄κ³ μ νλ€.
κ°μ²΄μ μνμ λ°λΌ λ¬λΌμ§λ νμλ₯Ό μΆμν λ ννλ‘ μΈν°νμ΄μ€λ₯Ό λ§λ λ€.
- μ²΄μ€ κ²μμ΄ λλ¬λμ§ νμΈνλ κΈ°λ₯
- νμ¬ μ°¨λ‘κ° ννμΈμ§ νμΈνλ κΈ°λ₯
- μΉλ¦¬μλ₯Ό μ°Ύλ κΈ°λ₯
- κΈ°λ¬Όμ μμ§μ΄λ κΈ°λ₯
- 체μ€νμ κ°λ‘μ€μ κ°μ Έμ€λ κΈ°λ₯
- μ²΄μ€ κ²μμ κ°μ μ’ λ£νλ κΈ°λ₯
- ννμ μ μλ₯Ό κ³μ°νλ κΈ°λ₯
- λ°±νμ μ μλ₯Ό κ³μ°νλ κΈ°λ₯
μ κΈ°λ₯λ€μ μ²΄μ€ κ²μμ΄ μ§ν μ€μ΄κ±°λ μ’ λ£ λμμ λ, ννμ μ°¨λ‘μ΄κ±°λ λ°±νμ μ°¨λ‘μΌ λ λ€λ₯΄κ² νλν μ μλ€.
μΆμ ν΄λμ€
ꡬννκ³ μ νλ μν μ€ μ€λ³΅λλ νμκ° μλ€λ©΄ μΈν°νμ΄μ€λ₯Ό ꡬνν μΆμ ν΄λμ€λ₯Ό λ§λ€μ΄ μ¬μ©νλ€.
μΆμ ν΄λμ€λ‘ μΈν°νμ΄μ€λ₯Ό ꡬνν κ²½μ° μΈν°νμ΄μ€μ μμΉν λͺ¨λ λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν νμ μμ΄ μ€λ³΅λλ λ©μλλ§μ ꡬνν μ μλ€.
public abstract class GameStarted implements BoardState {
protected final Map<Integer, Rank> ranks;
public GameStarted(Map<Integer, Rank> ranks) {
this.ranks = ranks;
}
public Rank getRank(int rankLine) {
return ranks.get(rankLine);
}
}
μ²΄μ€ κ²μμ λͺ¨λ μνμμ 체μ€νμ μλ―Ένλ ranks
λ₯Ό λͺ¨λ ν¬ν¨νκ³ μκΈ° λλ¬Έμ μΈν°νμ΄μ€ λ°λ‘ μλμ GameStarted
λΌλ μΆμ ν΄λμ€λ₯Ό ꡬννμ¬ λͺ¨λ νμ νμ
μνμμ ranks
λ₯Ό μ¬μ©ν μ μλλ‘ κ΅¬ννλ€.
public abstract class Playing extends GameStarted {
public Playing(Map<Integer, Rank> ranks) {
super(ranks);
}
BoardState movePiece(Position start, Position target) {
// ...
}
Piece getPiece(Position position) {
// ...
}
@Override
public boolean isEnd() {
return false;
}
@Override
public Winner findWinner() {
throw new IllegalStateException();
}
@Override
public BoardState terminate() {
return new Terminate(ranks);
}
@Override
public double calculateBlackScore() {
throw new IllegalStateException();
}
@Override
public double calculateWhiteScore() {
throw new IllegalStateException();
}
}
GameStarted
λ₯Ό μμλ°λ λ λ€λ₯Έ μΆμ ν΄λμ€μΈ Playing
μ΄λ€.
μ‘°μμΈ GameStarted
ν΄λμ€μμ 체μ€νμ κ°λ‘μ€μ κ°μ Έμ€λ κΈ°λ₯μ ꡬννκΈ° λλ¬Έμ Playing
μμλ ν΄λΉ κΈ°λμ μ μΈν κΈ°λ₯λ€μ ꡬννλ©΄ λλ€.
Playing
μ μ²΄μ€ κ²μμ΄ μ§νλκ³ μλ μνλ₯Ό μλ―Ένλ€. λλ¬Έμ μ’
λ£ λμμ λ μ€νλμ΄μΌ νλ μΌλΆ νμλ€μ λͺ¨λ μμΈλ₯Ό λμ§λλ‘ μ²λ¦¬νλ€.
Playing
μ νμ μνλ‘λ WhiteTurn
κ³Ό BlackTurn
μ΄ μ‘΄μ¬νλ€.
ν΄λΉ μνλ§λ€ λ€λ₯΄κ² ꡬνλ μ μλ λ©μλλ€μ ꡬννμ§ μλλ€.
μν ν΄λμ€
μ²΄μ€ κ²μ λ΄μμ μ¬μ©λλ μνλ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ μΆμν΄λμ€λ₯Ό μμλ°μ ν΄λΉ μνλ§ κ°μ§ μ μλ νμλ₯Ό μ¬μ μνμ¬ μ¬μ©ν μ μλ€.
public final class WhiteTurn extends Playing {
public WhiteTurn(Map<Integer, Rank> ranks) {
super(ranks);
}
@Override
public boolean isBlackTurn() {
return false;
}
@Override
public BoardState move(Position start, Position target) {
// ...
}
@Override
public End judgeWinner() {
return new WhiteWin(ranks);
}
@Override
public Playing judgeTurn() {
return new BlackTurn(ranks);
}
@Override
public String findTurn() {
return "λ°±";
}
}
public final class BlackTurn extends Playing {
public BlackTurn(Map<Integer, Rank> ranks) {
super(ranks);
}
@Override
public boolean isBlackTurn() {
return true;
}
@Override
public BoardState move(Position start, Position target) {
// ...
}
@Override
public End judgeWinner() {
return new BlackWin(ranks);
}
@Override
public Playing judgeTurn() {
return new WhiteTurn(ranks);
}
@Override
public String findTurn() {
return "ν";
}
}
μ²΄μ€ κ²μ μ§ν μ€ λ°±νκ³Ό ννμ μ°¨λ‘λ₯Ό λνλ΄κΈ° μν WhiteTurn
κ³Ό BlackTurn
μ΄λ€.
μνμ λ°λΌ λ€λ₯΄κ² λμνλ λ©μλλ€μ ν΄λΉ ν΄λμ€ λ΄λΆμμ ꡬνν΄μ€λ€.
μ΄λ₯Ό ν΅ν΄ Context μΈ‘μμλ BoardState
λ§μ μ°Έμ‘°νμ¬ νμ¬ μ²΄μ€ κ²μμ μνλ₯Ό μ νμ μμ΄ νμν κΈ°λ₯λ€μ νΈμΆν΄μ£ΌκΈ°λ§ νλ©΄ λλ€.
μν ν¨ν΄μ μ₯λ¨μ
μ₯μ
- Context λ΄λΆμ μ‘΄μ¬νλ λΆκΈ°λ¬Έλ€μ μ κ±°ν μ μλ€.
- μΆκ°μ μΌλ‘ μꡬλλ μνλ μν κ°μ²΄λ₯Ό μλ‘κ² κ΅¬ννμ¬ μ μ©ν μ μλ€.
- ν΄λμ€ κ°μλ μ¦κ°νμ§λ§ μ½λμ 볡μ‘λλ μ¦κ°νμ§ μκΈ° λλ¬Έμ μ μ§λ³΄μμ μ©μ΄νλ€.
λ¨μ
- Context μν λ³νμ μ£Όμ²΄μΌ κ²½μ°, μνμ κ°μκ° λ§μμ§κ±°λ μν λ³κ²½ κ·μΉμ΄ μμ£Ό λ³κ²½λλ€λ©΄ Context λ΄λΆμ μ½λκ° λ³΅μ‘ν΄μ§ μ μκ³ , λΆνμν λ©μλκ° μν κ°μ²΄ λ΄λΆμ μκΈΈ μ μλ€.
- μν κ°μ²΄κ° μν λ³νμ μ£Όμ²΄μΌ κ²½μ°, μν λ³κ²½ κ·μΉμ΄ μ¬λ¬ ν΄λμ€μ λΆμ°λμ΄ μκΈ° λλ¬Έμ μν κ°μ²΄κ° λ§μμ§μλ‘ μν λ³κ²½ κ·μΉμ νμ νκΈ° μ΄λ €μμ§ μ μκ³ , κ° μν κ° μμ‘΄λκ° μκΈΈ μ μλ€.
μ λ΅ ν¨ν΄κ³Όμ μ°¨μ΄μ
곡ν΅μ
μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ κ΅¬ν ν΄λμ€λ₯Ό μΊ‘μννλ€. μ¦, λ€νμ±κ³Ό μΆμ λ©μλλ₯Ό νμ©νμ¬ Context μμλ μ΄λ€ νμ ν΄λμ€λ₯Ό ν λΉλ°λμ§ μμ§ λͺ»νλ μνλ‘ λ¨μν μΆμ λ©μλλ₯Ό μ€ννλ€.
Context λ΄λΆλ μν₯μ λ°μ§ μκ³ μ μ°νκ² λ³νμ λμ²ν μ μλ€.
μ°¨μ΄μ
μ λ΅ ν¨ν΄μ κ²½μ°, μΈλΆλ‘λΆν° μ λ΅μ΄ μ£Όμ λμ΄μΌ νλ€. μν©μ λ§μΆ° νλμ μ£Όμ νμ¬ μ€νν μ μλ€.
λ€μν μκ³ λ¦¬μ¦μ μν©μ λ°λΌ μ¬μ©ν΄μΌ νλ κ²½μ° κ³ λ €ν΄λ³Ό μ μλ€.
μν ν¨ν΄μ κ²½μ°, λ΄λΆμμ μ€μ€λ‘ Context μ μνλ₯Ό λ³κ²½ν μ μλ€.
λ€μν μν λ³νλ₯Ό λ€λ€μΌν κ²½μ°. μ¦, λΆκΈ°λ¬Έμ΄ λ§μ 볡μ‘ν κ²½μ° κ³ λ €ν΄λ³Ό μ μλ€.