๋ƒ„์ƒˆ ์›์ธ

์ค‘๋ณต๋œ ์ฝ”๋“œ(Duplicated Code)

  • ํ•œ ๊ณณ ์ด์ƒ์—์„œ ์ค‘๋ณต๋œ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์„ ํ•ฉ์ณ์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Extract Method์ด๊ณ  ๋ฝ‘์•„๋‚ธ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ ๋‘ ๊ณณ์—์„œ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ธด ๋ฉ”์†Œ๋“œ(Long Method)

๋ฐฐ๊ฒฝ

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

์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•  ํ•„์š”๋ฅผ ๋Š๋‚„ ๋•Œ๋งˆ๋‹ค ๋Œ€์‹  ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค(Large Class)

  • ํด๋ž˜์Šค ํ•˜๋‚˜๊ฐ€ ๋งŽ์€ ์ผ์„ ํ•˜๋ ค ํ•  ๋•Œ๋Š” ๋ณดํ†ต ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.
  • ๋งŽ์€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ, ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค.
  • ํด๋ž˜์Šค ๋‚ด์—์„œ ์„œ๋กœ์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ณจ๋ผ์„œ ๋ฌถ๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฑฐ๋Œ€ํ•˜๋‹ค๋Š” ๊ฑด. ๋งŽ์€ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ.

๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ(Long Parameter List)

๋ฐฐ๊ฒฝ

  • ์ ˆ์ฐจ์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

  • ํ•˜์ง€๋งŒ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋„˜์–ด์˜ค๊ฒŒ ๋˜๋ฉด์„œ ์ ๋‹นํžˆ ๋„˜๊ธฐ๊ณ  ๋ฉ”์†Œ๋“œ๋กœ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์–ป์œผ๋ฉด ๋œ๋‹ค.

  • ๊ธด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  • ์ผ๊ด€์„ฑ์ด ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๊ณ ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๊ฐ์ฒด์™€ ํฐ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ข…์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์„๋•Œ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ’€์–ด์„œ ๋„˜๊ธฐ๋Š”๊ฒŒ ํ˜„๋ช…ํ•˜๋‚˜ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋ฉด ๊ณ ๋ คํ•ด๋ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

ํ™•์‚ฐ์  ๋ณ€๊ฒฝ(Divergent Change)

  • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ด๋Ÿฐ ๋ณ€ํ™˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์„ ์—์„œ ๋๋‚ด์•ผ ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋Š” ๊ทธ ๋ณ€ํ™”๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๋งŽ์ด ์—†์–ด์งˆ ๊ฒƒ์ด๋‹ค.

ํ™•์‚ฐ์  ๋ณ€๊ฒฝ์€ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์‹œ๋‹ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ.

์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery)

  • ๋ณ€๊ฒฝ์„ ํ•  ๋•Œ๋งˆ๋‹ค ๋งŽ์€ ํด๋ž˜์Šค๋ฅผ ์กฐ๊ธˆ์”ฉ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์‚ฐํƒ„์ด ์ˆ˜์ˆ ์˜ ๋ƒ„์ƒˆ๋ฅผ ํ’๊ธฐ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋ชฐ์•„๋„ฃ๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค.

์‚ฐํƒ„์ด ์ˆ˜์ˆ ์€ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋งŽ์€ ํด๋ž˜์Šค๋ฅผ ๊ณ ์ณ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.

๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š•์‹ฌ(Feature Envy)

  • ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž์‹ ์ด ์†ํ•œ ํด๋ž˜์Šค๋ณด๋‹ค ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
  • ๊ฐ€์žฅ ํ”ํ•œ ์š•์‹ฌ์ด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์š•์‹ฌ์ด๋‹ค.
  • ์–ด๋–ค ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์žˆ๋Š” get ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ˆ˜๋„ ์—†์ด ๋งŽ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๊ทธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ์ฒด์— ์œ„์ž„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์–ด๋–ค ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๊ฐ€๋ฅผ ๋ณด๊ณ , ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ(Data Clump)

  • ๋ฐ์ดํ„ฐ ์•„์ดํ…œ์€ ์•„์ด๋“ค๊ณผ ๊ฐ™์•„์„œ ๋ชฐ๋ ค๋‹ค๋‹ˆ๊ธฐ๋ฅผ ์ข‹์•„ํ•œ๋‹ค.
  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ•„๋“œ๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ด์ต์ด ๋  ๊ฒƒ์ด๋‹ค.
  • ํ•„๋“œ ๋ฆฌ์ŠคํŠธ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๋‚˜์œ ๋ƒ„์ƒˆ๋ฅผ ์ œ๊ฑฐํ•  ๊ฒƒ์ด์ง€๋งŒ, ๊ฐ์ฒด๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋ฉด ์ข‹์€ ํ–ฅ๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์–ป๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ธฐ๋ณธ ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฐ•๋ฐ•๊ด€๋…(Primitive Obsession)

  • ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์€ ๋‘ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • ๋ ˆ์ฝ”๋“œ ํƒ€์ž…์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์˜๋ฏธ์žˆ๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • ๊ธฐ๋ณธ ํƒ€์ž…(Primitive type)์€ ๋ฒฝ๋Œ๊ณผ ๊ฐ™๋‹ค.
  • ๋ ˆ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ์–ด๋Š ์ •๋„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๊ฐ์ฒด์˜ ์œ ์šฉํ•œ ์  ์ค‘์˜ ํ•˜๋‚˜๋Š” ์ด๋Ÿฐ ๊ธฐ๋ณธ ํƒ€์ž…์ด๋‚˜ ๋ ˆ์ฝ”๋“œ ํƒ€์ž…์˜ ๊ฒฝ๊ณ„๋ฅผ ํ๋ฆฌ๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์—†์• ๋ฒ„๋ฆฐ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ•ญ์ƒ ๋ชฐ๋ ค๋‹ค๋‹ˆ๋Š” ๊ทธ๋ฃน์ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค๋กœ ์ถ”์ถœํ•˜์ž.

Switch๋ฌธ(Switch Statements)

  • ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ๋ช…ํ™•ํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” switch๋ฌธ์ด ๋น„๊ต์  ์ ๊ฒŒ ์“ฐ์ธ๋‹ค๋Š” ๊ฒƒ.
  • ๋‹คํ˜•์„ฑ(polymorphism) switch ์ค‘๋ณต์„ ์‰ฝ๊ฒŒ ์ฐพ์•„ ๋ฐ”๊พธ์–ด ์ค„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋„๊ตฌ๋‹ค.
  • switch๋ฌธ์„ ๋ณผ ๋•Œ๋ฉด ํ•ญ์ƒ ๋‹คํ˜•์„ฑ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.
  • ๋งŒ์•ฝ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ช‡ ๊ฐœ์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ตณ์ด ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹คํ˜•์„ฑ์€ ๊ณผํ•˜๋‹ค.

ํ‰ํ–‰ ์ƒ์† ๊ตฌ์กฐ(Parallel Inheritance Hierarchies)

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

๊ฒŒ์œผ๋ฅธ ํด๋ž˜์Šค(Lazy Class)

  • ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ๊ฒƒ์„ ์œ ์ง€ํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ด ๋น„์šฉ์„ ๊ฐ๋‹นํ• ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์ผ์„ ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋Š” ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฑฐ์˜ ํ•„์š”์—†๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋Š” Inline Class๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ถ”์ธก์„ฑ ์ผ๋ฐ˜ํ™”(Speculative Generality)

  • ๋งŒ์•ฝ ๋ณ„๋กœ ํ•˜๋Š” ์ผ์ด ์—†๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์ƒ์†๊ด€๊ณ„๋ฅผ ์—†์• ๋ผ.
  • ๋ถˆํ•„์š”ํ•œ ์œ„์ž„(delegation)์€ Inline Class๋กœ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ง€์šฐ๊ณ . ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ์ด์ƒํ•˜๊ณ  ์ถ”์ƒ์ ์ผ ๋•Œ๋Š” ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์ž.

์ž„์‹œ ํ•„๋“œ(Temporary Field)

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

๋ฉ”์‹œ์ง€ ์ฒด์ธ (Message Chains)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ฌผ์–ด๋ณด๊ณ  ๋‹ค๋ฅธ ๊ฐ์ฒด๋Š” ๋˜ ๋‹ค์‹œ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ฌผ์–ด๋ณด๊ณ  ๊ทธ ๊ฐ์ฒด๋Š” ๋‹ค์‹œ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ฌผ์–ด๋ณด๊ณ  โ€ฆ ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ์ฒด์ธ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๊ฒƒ์€ ๊ธด ์ค„์˜ getThis ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์ž„์‹œ๋ณ€์ˆ˜์˜ ์‹œํ€€์Šค๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํด๋ž˜์Šค ๊ตฌ์กฐ์™€ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ์ค‘๊ฐ„์— ์–ด๋–ค ๊ด€๊ณ„๊ฐ€ ๋ณ€ํ•œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์ด ๊ฒฝ์šฐ Hide Delegate๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒด์ธ์˜ ์—ฌ๋Ÿฌ ์ง€์ ์—์„œ ์ด๊ฒƒ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์›์น™์ ์œผ๋กœ๋Š” ์ฒด์ธ ๋‚ด์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ์ข…์ข… ์ค‘๊ฐ„์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋ฏธ๋“ค ๋งจ(middle man)์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์˜ ์กฐ๊ฐ์„ ์ทจํ•ด Extract Method๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ณ  Move Method๋กœ ๊ทธ๊ฒƒ์„ ์ฒด์ธ์˜ ๋ฐ‘์œผ๋กœ ๋ฐ€์–ด๋„ฃ๋Š”๋‹ค.

๋ฏธ๋“ค ๋งจ (Middle Man)

  • ๊ฐ์ฒด์˜ ์ฃผ์š” ํŠน์ง•ํ•˜๋‚˜๊ฐ€ ์บก์Šํ™”(encapsulation - ๋‚ด๋ถ€์˜ ์ƒ์„ธ์‚ฌํ•ญ์„ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธฐ๋Š” ๊ฒƒ)์ด๋‹ค. ์บก์Šํ™”๋Š” ๋ณดํ†ต ์œ„์ž„(delegation)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋‹ˆ ๋ฉ”์†Œ๋“œ์˜ ํƒœ๋ฐ˜์ด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์œ„์ž„ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Remove Middle Man์„ ์‚ฌ์šฉํ•ด์—ฌ ๊ทธ ๊ฐ์ฒด์— ์‹ค์ œ๋กœ ๋ญ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜์–ด๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ ํ•ด์ค„ ๋•Œ์ด๋‹ค.
  • ๋ช‡๋ช‡ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งŽ์€ ์ผ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Inline Method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ถ”๊ฐ€ ๋™์ž‘์ด ์žˆ๋‹ค๋ฉด Replace Delegation with Inheritance์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋“ค๋งจ์„ ์‹ค์ œ ๊ฐ์ฒด์˜ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ฒŒ์ดํŠธ์›จ์ด ์—ญํ• ๋งŒ ํ•˜๋Š” ํด๋ž˜์Šค(ํ•จ์ˆ˜)
  • ๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€
  • ๋†’์€ ์˜์กด๋„ ํ˜น์€ ํ•„์š”์—†๋Š” ๋ถ„๋ฆฌ

๋ถ€์ ์ ˆํ•œ ์นœ๋ฐ€(Inappropriate Intimacy)

  • ํด๋ž˜์Šค๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์นœ๋ฐ€ํ•˜๊ฒŒ ๋˜์–ด ์„œ๋กœ ์‚ฌ์ ์ธ ๋ถ€๋ถ„์„ ํŒŒ๊ณ ๋“œ๋Š๋ผ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์นœ๋ฐ€ํ•จ์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค. ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ์•ˆ์ „ํ•œ ๊ณณ์œผ๋กœ ๋นผ๋‚ด์„œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด๋ผ.
  • ์ƒ์†์€ ์ข…์ข… ๊ณผ๋„ํ•œ ์นœ๋ฐ€์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค๋Š” ํ•ญ์ƒ ๊ทธ ๋ถ€๋ชจ๊ฐ€ ์•Œ๋ ค์ฃผ๊ณ  ์‹ถ์€ ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ๊ฒƒ์„ ์•Œ๋ ค๊ณ  ํ•œ๋‹ค.

๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๋Œ€์ฒด ํด๋ž˜์Šค(Alternative Classes with Different Interface)

  • ๊ฐ™์€ ์ž‘์—…์„ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜(signature)๋ฅผ ๊ฐ€์ง€๋Š” ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” Rename Method๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.
  • ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋Š๋ผ๋ฉด ํด๋ž˜์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์ถฉ๋ถ„ํ•œ ์ž‘์—…์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋‹ค.
  • ํ”„๋กœํ† ์ฝœ์ด ๊ฐ™์•„์งˆ ๋•Œ๊นŒ์ง€ Move Method๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ž‘์„ ์ด๋™์‹œ์ผœ๋ผ.

๋ถˆ์™„์ „ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค(Incomplete Library Class)

  • ์žฌ์‚ฌ์šฉ์€ ์ข…์ข… ๊ฐ์ฒด์˜ ๋ชฉ์ ์œผ๋กœ ์„ ์ „๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์žฌ์‚ฌ์šฉ์ด ๊ณผ๋Œ€ํ‰๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
  • ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์ด๋ผ๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ์•„๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ข…์ข… ๋‚˜์œ ํ˜•ํƒœ์ด๊ณ , ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ.

๋ฐ์ดํ„ฐ ํด๋ž˜์Šค(Data Class)

  • ํ•„๋“œ์™€ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•œ get/set ๋ฉ”์†Œ๋“œ๋งŒ ๊ฐ€์ง€๊ณ , ๋‹ค๋ฅธ ๊ฒƒ์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ํด๋ž˜์Šค๋„ ์žˆ๋‹ค.
  • ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ํ–‰์œ„๋ฅผ ๋ฐ์ดํ„ฐ ์ชฝ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋Š” ์•„์ด๋“ค๊ณผ ๊ฐ™๋‹ค. ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ, ์–ด๋ฅธ ๊ฐ์ฒด๋กœ ์ฐธ์—ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ์ฑ…์ž„์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๊ฑฐ๋ถ€๋œ ์œ ์‚ฐ (Refused Bequest)

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

์ฃผ์„(Comment)

์ฃผ์„์„ ์จ์•ผ ํ•  ๊ฒƒ ๊ฐ™์€ ์ƒ๊ฐ์ด ๋“ค๋ฉด, ๋จผ์ € ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•˜์—ฌ ์ฃผ์„์ด ๋ถˆํ•„์š”ํ•˜๋„๋ก ํ•˜๋ผ.

Reference