์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๋ณด๋ฉด, ์–ด๋Š์ƒˆ ์–ฝํžˆ๊ณ  ์„ฅํ˜€์žˆ๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์ฃผํ•œ๋‹ค. ๋ถ€์ง€๋Ÿฐํ•จ์ด ๊ฐœ๋ฐœ์ž์˜ ๋•๋ชฉ์ด ์•„๋‹Œ๊ฐ€๋ผ๊ณ  ์ƒ๊ฐ๋  ์ •๋„๋กœ ํ•ญ์ƒ ๊น”๋”ํ•จ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ฐธ ์ค‘์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ณคํ•œ๋‹ค. ํ˜น์€ ๋ฏธ๋ž˜์˜ ๋‚˜์™€ ๊ณผ๊ฑฐ์˜ ๋‚˜๊ฐ€ ํ•ญ์ƒ ํ˜„์žฌ์—์„œ ์‹ธ์šฐ๋Š” ๋“ฏํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์˜ค๋Š˜์€ ์ด๋ ‡๊ฒŒ ๋งˆ์ฃผํ•˜๊ธฐ ์‹ซ์€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ํ•œ๋ฒˆ ๋ถ„์„ํ•ด๋ณด๊ณ , ์–ด๋–ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•, ์›์น™์„ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์€์ง€ ์•Œ์•„๋ณด๋ คํ•œ๋‹ค.

์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ

  • ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ
  • ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ๋ชจ์Šต์„ ๋ฉด๋ฐœ์— ๋น„์œ ํ•œ ํ‘œํ˜„
  • ๋ฌธ์ œ์ 
    • ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€
    • ์žฌํ™œ์šฉ ๋ถˆ๊ฐ€
    • ๋ฒ„๊ทธ์˜ ์˜จ์ƒ
    • ์ƒ์‚ฐ์„ฑ ์ €ํ•˜
  • ํ˜•ํƒœ
    • ๋ณต์žกํ•œ ์ œ์–ด๋ฌธ
    • ๋งŽ์€ ๋ณ€์ˆ˜
    • ์ž˜๋ชป๋œ ์ƒ์†
    • ํด๋ž˜์Šค ๊ฐ„ ์˜์กด๊ด€๊ณ„ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋จ
    • ์ถ”์ƒํ™” ๋‹จ๊ณ„์˜ ๋ถ€์žฌ
  • ์›์ธ
    • ๋ชฐ๋ผ์„œ
      • ์ฃผ๋‹ˆ์–ด์˜ ๊ฒฝ์šฐ
    • ๊ฒŒ์„๋Ÿฌ์„œ
      • ์ด๊ฒŒ ๋” ๋ฌธ์ œ๊ฐ€ ๋งŽ์Œ

ํ˜•ํƒœ์— ๋”ฐ๋ฅธ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ

์œ„์—์„œ ์•Œ์•„๋ณธ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ํ•ด๋‹น ๋ถ„๋ฅ˜๋ฅผ ์ดํ•ดํ•ด๋ณด์ž.

๋ณต์žกํ•œ ์ œ์–ด๋ฌธ

  • goto
  • branch (if, switch)
    • ๋ถ„๊ธฐ ๋ณ„๋กœ case๋ฅผ ๋”ฐ์ ธ์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฝ๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ฆ
  • loop (for, while)
  • Cyclomatic complexity
    • ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ ์ค‘ ํ•˜๋‚˜
    • Control flow ๋ถ„๊ธฐ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด ์ธก์ •
  • if ๋ฌธ์ด ์—†๋‹ค๋ฉด..?
    • ์ƒ๋‹นํžˆ ์ฝ”๋“œ ์ฝ๊ธฐ๊ฐ€ ์ˆ˜์›”ํ•ด์งˆ ๊ฒƒ

๋งŽ์€ ๋ณ€์ˆ˜

  • ๋‹จ์ˆœํžˆ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์šฉ๋„
  • ์ œ์–ด๋ฅผ ์ปจํŠธ๋กค ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„
    • ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ๋ถ„๊ธฐ(if, switch) ํ˜น์€ loop(for)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ๋ฆ„์„ ๊ธฐ์–ตํ•ด์•ผ ํ•จ
    • ์ƒ๋‹นํžˆ ์ฝ”๋“œ๊ฐ€ ์ฝ๊ธฐ ํž˜๋“ค์–ด์ง
    • ์ œ์–ด์— ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ฝ”๋“œ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๊ธฐ ํž˜๋“ฆ
  • ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด..?
    • ๋ชจ๋“  ๊ฒƒ์ด ์ƒ์ˆ˜๋ผ๋ฉด, ๋ถ„๊ธฐ๋„ ์—†์„ ๊ฒƒ์ด๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ

์ž˜๋ชป๋œ ์ƒ์†

  • ๋ˆˆ์น˜์ฑ„๊ธฐ ์–ด๋ ค์šด ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ
  • ์ง„์„ฑ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ
  • ์ƒ์†์€ ๊ฐ€์žฅ ๊ฐ•ํ•œ ์ปคํ”Œ๋ง ์ค‘ ํ•˜๋‚˜
    • ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์ฝ์–ด์•ผ ํ•จ
    • override๋œ ํ•จ์ˆ˜์™€ ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ฝ์–ด์•ผ ํ•จ
  • ์ž˜๋ชป๋œ ์ƒ์†
    • ๋งค์šฐ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ feature envy ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.
      • Feature Envy
        • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ
        • ๋ณธ์—ฐ์˜ ์ž„๋ฌด ์ด์™ธ์˜ ๊ธฐ๋Šฅ์ด ํ•ด๋‹น ํด๋ž˜์Šค์— ๋“ค์–ด๊ฐ€์„œ ํƒ€ ํด๋ž˜์Šค์—์„œ ์ด์— ์˜์กด์ ์ด๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ
        • ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Code Smell
          • Code Smell
            • ์‹ฌ์˜คํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ํŠน์ง•
        • A Class์˜ ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์ด B Class์˜ ์—ฌ๋Ÿฌ method์— ์˜์กด์ ์ž„
        • Method Move๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์˜ˆ์‹œ
      • UIViewController โ† DefaultNetworkViewController โ† RealViewController
      • DefaultNetworkViewController
        • UIViewController ์ƒ์†
        • viewWillAppear์— network ์š”์ฒญํ•˜๋Š” ์ฝ”๋“œ ๋„ฃ์–ด๋‘š
          • ์ผ๋‹จ View๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ network ์š”์ฒญํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ง์ด ์•ˆ๋˜๊ธด ํ•จ
          • ์—ญํ• ์„ ๋‚˜๋ˆ„๊ณ  ๋ถ„๋ฆฌํ•ด์•ผ ํ•จ
      • RealViewController
        • DefaultNetworkViewController ์ƒ์†
        • super.network ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
      • ํ˜„์ƒ
        • RealViewController๋Š” ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ํ•˜๋ฉด ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ 2๋ฒˆ ํ˜ธ์ถœ๋จ
        • ViewWillAppear์— ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ
        • ์›ํ•˜๋Š” ๋™์ž‘์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น… ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์–ด๊ฐ

ํด๋ž˜์Šค ๊ฐ„ ์˜์กด๊ด€๊ณ„ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋จ

  • ํด๋ž˜์Šค๊ฐ„ ์˜์กด ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ๋…์ž์ ์œผ๋กœ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ
    • ํŠน์ • ํด๋ž˜์Šค ๋™์ž‘ ์œ„ํ•ด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ํ•„์š”๋กœ ํ•จ
    • ํด๋ž˜์Šค ํ•˜๋‚˜๋ฅผ ์žฌํ™œ์šฉํ•˜๋ ค ํ–ˆ๋Š”๋ฐ, ์ˆ˜์‹ญ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ์ƒํ™ฉ(๋นŒ๋“œ๊ฐ€ ์•ˆ๋˜์„œ)
  • ํด๋ž˜์Šค์˜ ๋™์ž‘์ด ์ƒ๊ด€์—†๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ

์ถ”์ƒํ™” ๋‹จ๊ณ„์˜ ๋ถ€์žฌ

  • ๋””ํ…Œ์ผ๊นŒ์ง€ ๋ชจ๋‘ ์ ๋Š”๋‹ค๋ฉด ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง
  • ์ฝ”๋“œ๋Š” ์ถ”์ƒํ™”๋œ ๋‚ด์šฉ์œผ๋กœ ๊ธฐ์ˆ ๋˜์–ด์•ผ ํ•จ
  • ์ด ๋•Œ, ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” ๋™์ผํ•œ ๋ ˆ๋ฒจ์˜ ์ถ”์ƒํ™”๊ฐ€ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • OOP๋ฅผ ์ œ๋Œ€๋กœ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์•ผ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅ
    • ํ•™๊ต์—์„œ ๋ฐฐ์šด OOP?
    • OOP๋ฅผ ๋ฐฐ์šด ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  OOP Language๋ฅผ ๋ฐฐ์šด ๊ฒƒ
  • ๋””์ž์ธ ํŒจํ„ด ๊ณต๋ถ€
    • ์˜คํžˆ๋ ค ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์˜๋ฌธ
    • ์ด๊ฑด ์ž˜๋ชป์จ์„œ ๊ทธ๋Ÿฐ ๊ฒƒ
  • ๋ฆฌํŒฉํ† ๋ง ๊ณต๋ถ€
    • ๊ธฐ์กด์˜ ๋ ˆ๊ฑฐ์‹œ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง
    • ๋ฒ„๊ทธ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ UnitTest
  • ๋ฌธ์ œ์ 
    • ์ด๊ฑธ ๋ชจ๋‘ ๋‹ค ๋น ๋ฅธ ์‹œ๊ฐ„๋‚ด์— ๊ณต๋ถ€ํ•˜๊ธฐ ์–ด๋ ค์›€
    • Design Pattern: ๋ชฉ์ ์ดํ•ด๊ฐ€ ์—†์–ด์„œ ์–ด๋ ค์›€
    • Clean Code: ์ž…์œผ๋กœ๋งŒ ํด๋ฆฐ์ฝ”๋“œ
    • Refactoring: ์žฌ์ž‘์„ฑ์ธ๊ฐ€?
    • UnitTest: ๋จน๋Š”๊ฑด๊ฐ€?
  • ๋ฒ•์น™
    • 10-200 Rule
      • ๋ชจ๋“  ํ•จ์ˆ˜๋Š” 10๋ผ์ธ ์•ˆ์—์„œ ๋๋‚œ๋‹ค.
      • ๋ชจ๋“  class(struct, enum)์€ 200๋ผ์ธ ์•ˆ์—์„œ ๋๋‚˜์•ผ ํ•œ๋‹ค.
      • ํšจ๊ณผ
        • ๋ฐœ์ƒํ•œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ณผ์ •
        • ๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ์‹œ์ž‘
        • ๋กœ์ง๊ณผ ๊ตฌ์กฐ์˜ ๋‹จ์ˆœํ™”๋กœ ์ƒ๊ด€๊ด€๊ณ„ ํŒŒ์•… ์šฉ์ด
      • ์งง๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์˜ ์˜๋ฏธ
        • ์š”์†Œ์˜ ๋ถ„๋ฆฌ
          • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ
          • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ
        • ๋ถ„๋ฆฌ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ๊ทœ์น™์ด ์ƒ๊น€
          • ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์„ ์ƒ๊ฐํ•  ์ˆ˜ ๋ฐ–์— ์—†์Œ
        • ์ˆœ์ˆ˜ํ•จ์ˆ˜์— ๊ฐ€๊นŒ์šด ํ˜•ํƒœ๋กœ ๋ณ€ํ™”
          • Cyclomatic complexity๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์—†์Œ
          • ๋ณ€์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
          • ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•ด์ง
        • ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋จ
          • 10์ค„, 200์ค„์€ ํ˜‘์†Œํ•œ ๊ณต๊ฐ„
          • ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ฐ„๊ฒฐํ•˜๊ฒŒ?
          • ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ• ๊นŒ?
          • ์–ด๋–ป๊ฒŒ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ• ๊นŒ?
    • ๊ณ ๋ฏผ์˜ ์‹œ๊ฐ„์„ ๋งŽ์ด ํ™•๋ณดํ•˜๊ธฐ
      • ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•ด์•ผ ์ถ”๊ฐ€ ํ•™์Šต ๋‚ด์šฉ์„ ๋ฐ›์•„๋“ค์ด๋Š” ์†๋„๊ฐ€ ๋นจ๋ผ์ง
      • ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ๋‹ค์‹œ ๊ตฌ์กฐํ™” ์‹œํ‚ฌ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋„ ํ•„์š”
        • ๋””์ž์ธ ํŒจํ„ด

Reference