Skip to content

Latest commit

Β 

History

History
100 lines (75 loc) Β· 4.86 KB

02. Tic Tac Toe.md

File metadata and controls

100 lines (75 loc) Β· 4.86 KB

2. Tic Tac Toe νšŒκ³ πŸ€”πŸ’­



2-1. κ³Όμ—° μ–΄λ””κΉŒμ§€ state 객체둜 관리해야 ν• κΉŒμš”?

2-1-1. ν˜„μƒπŸ§±

  • TicTacToe κ²Œμž„μ˜ 승리 및 λ¬΄μŠΉλΆ€λ₯Ό νŒλ‹¨ν•˜λŠ” isTicTaeToe와 isDrawλ₯Ό μ „μ—­ λ³€μˆ˜λ‘œ μ‚¬μš©ν• μ§€ state둜 관리할지에 λŒ€ν•΄ 고민이 μžˆμ—ˆλ‹€.
    • state둜 μ‚¬μš©ν•œ player와 board의 경우 λ Œλ”λ§μ— 자주 영ν–₯을 μ£Όμ§€λ§Œ, isTicTacToe와 isDraw의 경우 ν•œ 번만 λ Œλ”μ— 영ν–₯을 μ£ΌκΈ° λ•Œλ¬Έμ— state둜 관리할 ν•„μš”μ„±μ΄ μžˆλŠ”μ§€μ— λŒ€ν•΄ κ³ λ―Όλ˜μ—ˆλ‹€.
    // μ „μ—­ λ³€μˆ˜λ‘œ μ‚¬μš©λœ isDraw와 isTicTacToe
    // λ‘˜ 쀑 ν•˜λ‚˜λΌλ„ trueκ°€ 되면 κ²Œμž„μ΄ μ’…λ£Œλœλ‹€
    let isDraw = false;
    let isTicTacToe = false;
    // state 객체둜 κ΄€λ¦¬λœ isDraw와 isTicTacToe
    let state = {
      player: 'X',
      board: new Array(9).fill(''),
      isDraw: false,
      isTicTacToe: false,
    };

2-1-2. λ°œκ²¬πŸ’‘

  • isTicTacToe와 isDrawλŠ” TicTacToeλΌλŠ” μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λ³€ν•  뿐 만 μ•„λ‹ˆλΌ, ν™”λ©΄ λ Œλ”μ— 영ν–₯을 미치기 λ•Œλ¬Έμ— state에 μΆ”κ°€ν•˜μ—¬ 관리해야함을 μ•Œμ•˜λ‹€.
  • λ˜ν•œ, ν•¨μˆ˜ 상단에 μ—¬λŸ¬κ°€μ§€ λ³€μˆ˜λ“€μ΄ 선언이 λ˜μ–΄μžˆμ—ˆκΈ° λ•Œλ¬Έμ— 이 λ³€μˆ˜κ°€ μ–΄λŠκ³³μ—μ„œ μ‚¬μš©λ˜λŠ”μ§€ 고민이 μƒκ²ΌμœΌλ‚˜, stateλΌλŠ” 객체둜 λ¬Άμ–΄ ν™”λ©΄ λ Œλ”λ§μ— κ΄€μ—¬ν•˜λŠ” λ³€μˆ˜λ“€μ΄λΌλŠ” 것을 μ§κ΄€μ μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆμ—ˆκ³  응집도 λ˜ν•œ ν–₯μƒλ˜μ—ˆλ‹€.

2-1-3. λ°°μš΄μ πŸ“

  • state인지 일반 λ³€μˆ˜μΈμ§€ 고민이 κΉŠμ–΄μ§ˆ κ²½μš°μ—, κ°„λ‹¨νžˆ μƒκ°ν•˜μ—¬ ν™”λ©΄ λ Œλ”μ— 영ν–₯을 λ―ΈμΉ˜λŠ” λ³€μˆ˜λ“€μ€ state라고 μƒκ°ν•˜λŠ” 편이 λΉ λ₯Έ μ˜μ‚¬κ²°μ •μ„ ν•  수 μžˆλ‹€λŠ” 것을 μ•Œμ•˜λ‹€.
  • λ Œλ”μ— 영ν–₯을 μ£ΌλŠ” λ³€μˆ˜λ“€μ€ state둜 κ΄€λ¦¬ν•˜μ—¬ 응집도λ₯Ό λ†’μ—¬ λ³€μˆ˜λ“€μ„ 관리 ν•  수 μžˆμŒμ„ λ°°μ› λ‹€.


2-2. some or for...of

2-2-1. ν˜„μƒπŸ§±

  • board state의 값듀이 TicTacToe 인지 ν™•μΈν•˜κΈ° μœ„ν•˜μ—¬ winConditionsλΌλŠ” 2차원 배열을 μˆœνšŒν•˜μ˜€λ‹€.

    for (const [one, two, three] of winConditions) {
      if (
        state.board[one] &&
        state.board[one] === state.board[two] &&
        state.board[two] === state.board[three]
      )
        state.isTicTacToe = true;
    }
    state.isTicTacToe = winConditions.some(
      ([one, two, three]) =>
        state.board[one] &&
        state.board[one] === state.board[two] &&
        state.board[two] === state.board[three]
    );

2-2-2. λ°œκ²¬πŸ’‘

  • λ°°μ—΄ some λ©”μ„œλ“œλŠ” 의미둠적으둜 배열을 μˆœνšŒν•˜λ©° μ½œλ°±ν•¨μˆ˜ 쑰건을 λ§Œμ‘±ν•œ 경우 ν•˜λ‚˜λΌλ„ μžˆμ„ 경우 순회λ₯Ό λ©ˆμΆ”κ³  λ°”λ‘œ boolean κ°’μœΌλ‘œ λ°˜ν™˜λ˜κΈ° λ•Œλ¬Έμ— μ’€ 더 λͺ…μ‹œμ μœΌλ‘œ isTicTacToe 인지 λ‚˜νƒ€λ‚Ό 수 μžˆμ—ˆλ‹€.

    some()

    some λ©”μ„œλ“œλŠ” 반볡 λ©”μ„œλ“œμž…λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” 주어진 callbackFnν•¨μˆ˜κ°€ μ°Έ 같은 값을 λ°˜ν™˜ν•  λ•ŒκΉŒμ§€ λ°°μ—΄ μ•ˆμ— μžˆλŠ” 각각의 μš”μ†Œλ§ˆλ‹€ ν•œ λ²ˆμ”© ν˜ΈμΆœν•©λ‹ˆλ‹€. λ§Œμ•½ κ·ΈλŸ¬ν•œ μš”μ†Œλ₯Ό μ°Ύμ•˜μœΌλ©΄ some() λ©”μ„œλ“œλŠ” κ·Έ μ¦‰μ‹œ trueλ₯Ό λ°˜ν™˜ν•˜λ©° λ°°μ—΄ 순회λ₯Ό 멈μΆ₯λ‹ˆλ‹€. 그렇지 μ•Šκ³  callbackFn이 λͺ¨λ“  μš”μ†Œμ— λŒ€ν•΄ 거짓같은 값을 λ°˜ν™˜ν•˜λ©΄ some()은 falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    MDN: some()

2-2-3. λ°°μš΄μ πŸ“

  • some()λ©”μ„œλ“œλŠ” for ... of문의 early return 으둜 μ²˜λ¦¬ν•˜λŠ” 것과 λ‹€λ¦„μ—†μ§€λ§Œ, some() μ΄λΌλŠ” λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ λ™μž‘μ„ μ˜ˆμΈ‘ν•˜λŠ”λ°μ— μ‘°κΈˆμ΄λ‚˜λ§ˆ 더 도움이 될 수 μžˆλ‹€λŠ” 점을 λ°°μ› λ‹€.

2-3. μ„ μ–ΈπŸ§ŽπŸ»

  • 예츑 κ°€λŠ₯ν•œ μ½”λ“œκ°€ κ°€μž₯ 가독성 높은 μ½”λ“œλΌλŠ” 점을 λŠκΌˆλ‹€.
    • isDraw와 isTicTacToeλ₯Ό μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹Œ state둜 관리헀을 λ•Œμ™€ for...ofλ¬Έ λŒ€μ‹  some() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œμ˜ κ°€μž₯ 큰 μž₯점 쀑 ν•˜λ‚˜λŠ” μ½”λ“œμ˜ μ˜ˆμΈ‘μ„± ν–₯μƒμ΄μ—ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ isDraw와 isTicTacToe 같은 경우 μ „μ—­ λ³€μˆ˜λ‘œ κ΄€λ¦¬ν–ˆλ”λΌλ©΄ 각 λ³€μˆ˜κ°€ μ–΄λ””μ„œ μ°Έμ‘°λ˜μ–΄ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ 확인이 ν•„μš”ν•˜μ§€λ§Œ, state 객체둜 κ΄€λ¦¬ν•¨μœΌλ‘œμ„œ 두 λ³€μˆ˜κ°€ λ Œλ”μ— 영ν–₯을 μ€€λ‹€λŠ” 점을 보닀 μ§κ΄€μ μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆμ—ˆλ‹€. μ•žμœΌλ‘œλ„, λˆ„κ°€ 읽더라도 예츑 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄ κΎΈμ€€ν•œ λ…Έλ ₯을 ν•΄λ‚˜κ°€κ² λ‹€!