Good

  • ์Œ, ์ƒ๊ฐ๋ณด๋‹ค ์—†๋‹ค.
  • ๋ˆ์•„๋ผ๋Š” ๋ฐฉ๋ฒ•์„ ํ•˜๋‚˜ ์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ์•˜๋‹ค.
  • ๋ธŒ๋Ÿฐ์น˜ ๊ธ€์„ ๊พธ์ค€ํžˆ ์“ฐ๊ณ ์žˆ๋‹ค.

Bad

  • ์šด๋™์„ ๋ชปํ–ˆ๋‹ค.
  • ํ—ˆ๋ฆฌ๊ฐ€ ์•„ํ”„๋‹ค.
  • ์•ฝ๊ฐ„ ๋ฌด๊ธฐ๋ ฅ์ฆ์ด ๋„์ง€๋Š” ๋Š๋‚Œ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์•ˆ์งœ์„œ ๊ทธ๋Ÿฐ ๋“ฏ ํ•˜๋‹ค.
  • ์ตœ๊ทผ์— ์ž ์„ ์ž˜ ๋ชป์žค๋˜๊ฒŒ ์›”๋ง์— ๋ฐ€๋ ค์™”๋‹ค. ์ƒˆ๋ฒฝ์— ์ผ์–ด๋‚˜๋Š” ๊ฑธ ๋ชปํ–ˆ๋‹ค.

Learns

  • ReActive ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
    1. ์‹ค์ œ ๋ฐ”๊นฅ์—์„œ ์‚ฌ์šฉํ•  Publisher๋ฅผ internal์œผ๋กœ ๋งŒ๋“ ๋‹ค
      • ์ด๊ณผ์ •์—์„œ protocol์„ ์ฑ„ํƒํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.
    2. ์‹ค์ œ ๋‚ด๋ถ€์—์„œ๋Š” private์œผ๋กœ publisher๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๊ทธ๋…€์„์œผ๋กœ ์ง€์ง€๊ณ  ๋ณถ๋Š”๋‹ค.
      • ์ด ๊ณผ์ •์—์„œ ์™ธ๋ถ€ publisher๋ฅผ ๋ฐ›์•„ compactmap, flatmap์œผ๋กœ ๋ณ€ํ˜•ํ•˜์—ฌ ๋ฐ”๊นฅ์—์„œ ์‚ฌ์šฉํ•  publisher๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.
      • ์ด ๋•Œ ๋ณดํ†ต computed property๋ฅผ ํ†ตํ•ด ์ ์šฉํ•œ๋‹ค.
    3. ๋ฐ”๊นฅ์—์„œ ์‚ฌ์šฉํ•  ์นœ๊ตฌ์˜ type์€ AnyPublisher๋กœ ๊ฐ์ถ˜๋‹ค.
  • method ์ถ”์ถœ์—ญ์‹œ refactoring์ด๋‹ค.
  • View์—์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์‹œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด completion handler๋ฅผ ํ™œ์šฉํ•˜์ž.
 
// In ViewController
func announce(winner: PlayerType?, withCompletionHandler handler: @escaping () -> ()) {
    let alert = UIAlertController(title: winnerString, message: nil, preferredStyle: .alert)
    let closeAction = UIAlertAction(title: "Close Game", style: UIAlertActionStyle.default) { _ in
        handler()
    }
    alert.addAction(closeAction)
    present(alert, animated: true, completion: nil)
}
 
// In ViewModel
viewController.announce(winner: endGame.winner) {
    self.listener?.ticTacToeDidEnd(with: endGame.winner)
}
 
  • ๋ญ”๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋‚˜์ค‘์— ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ protocol์„ ๋งŒ๋“ค์–ด๋†“๊ณ  extension์— ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด๋†“์œผ๋ฉด ์™„์ „ ๊ตฌ๋ถ„๋˜์–ด์„œ ๋‚˜์ค‘์— ๋ถ„๋ฆฌํ•˜๊ธฐ ํŽธํ•จ, ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์ง„๋‹ค.
  • ๊ธฐ์ˆ ์ ์ธ ์ด์•ผ๊ธฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ๋Š” ๊ทธ์‚ฌ๋žŒ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•˜๊ณ  ๋งํ•œ๋‹ค.
    • ์ „๋ฐ˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ๋งํ•˜๊ณ , ํ•ต์‹ฌ์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งํ•œ๋‹ค.
    • ์„ธ๋ถ€ ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ ์งˆ๋ฌธ์„ ๋ฐ›๊ฑฐ๋‚˜, ํ›„๋ฐ˜๋ถ€์— ๋งํ•˜๊ธฐ
    • ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์šฉ์–ด์— ๋Œ€ํ•ด ์ •ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์ด์•ผ๊ธฐํ•ด์•ผ ๋…ผ์˜๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  • ์ด์Šˆ ์ˆ˜์ •์„ ํ•  ๋•Œ, ๋‹น์žฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๋„˜์–ด์„œ ์กฐ๊ธˆ๋” ๊นŠ์ด ๋œฏ์–ด๋ณด๋Š” ์Šต๊ด€์ด ํ•„์š”ํ•  ๋“ฏํ•˜๋‹ค.
    • ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋ณผ ๋•Œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๋ณธ๋‹ค๊ณ  ํ•ด๋„ ๋‚˜๋งŒํผ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ค์—ฌ ๋ณด๊ธฐ ๋•Œ๋ฌธ์—, ์žฅ๊ธฐ์  ๊ด€์ ์—์„œ ๋ณด์•˜์„ ๋•Œ ํ•ด๋‹น ์ด์Šˆ๋ฅผ ์ดํ•ดํ•œ ์‹œ์ ์— ์กฐ๊ธˆ์ด๋ผ๋„ ์ฝ”๋“œ๋ฅผ ๋‚ซ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋– ๋‚˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋™๋ฃŒ๊ฐ€ ๋˜๋Š” ๊ธธ์ด๋‹ค.
    • ๋‚ด ํŒ๋‹จ์— ์กฐ๊ธˆ๋” ํ™•์‹ ์„ ๊ฐ–๊ณ , ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜์ง€ ๋ง์ž.

Commitment

  • ์šด๋™์€ ์ง„์งœ ํ•ด์•ผํ•œ๋‹ค..
  • ๋‹ค์‹œ ์ƒˆ๋ฒฝ์— ์ผ์–ด๋‚˜์„œ ์šด๋™ํ•˜๊ณ  ์ถœ๊ทผํ•˜๋Š” ์ผ์ƒ์„ ๋˜์ฐพ๋Š”๋‹ค.
  • ๊ทœ์น™์ ์ธ ์‹์Šต๊ด€์„ ๊ฐ€์ง„๋‹ค.