Clean Code (2)

Understanding 'Clean Code' in a Pythonic way

2017-08-23


Clean Code: A Handbook Of Agile Software Craftsmanship (2009) ๋ผ๋Š” ์ฑ…์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ฑ…์˜ ์˜ˆ์ œ๋Š” Java ๋กœ ์“ฐ์—ฌ ์žˆ์–ด์„œ Python์œผ๋กœ ์“ฐ์ธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ฑ…์€ ๊ทธ ์ž์ฒด๊ฐ€ ํด๋ฆฐ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์›์น™๊ณผ ์ฒ ํ•™์—์„œ ์‹ค์ œ ์ฝ”๋“œ๊นŒ์ง€ ์„ค๋ช…์ด ๋ช…ํ™•ํ•˜๊ณ  ๊ตฐ๋”๋”๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ฝ๋‹ค๊ฐ€ ๋…ธํŠธ๋ถ์„ ์ผœ๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉฐ ๋ฌด๋ฆŽ์„ ํƒ์นœ ๊ฒฝ์šฐ๊ฐ€ ์ ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ Clean Code (1)


7. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

  • ๊นจ๋—ํ•œ ์ฝ”๋“œ๋ž€? '๋ฌผ ์ƒ ํ‹ˆ์—†๋Š” ์˜ค๋ฅ˜์ฒ˜๋ฆฌ!' - Bjarne Stroustrup(C++ ์ฐฝ์‹œ์ž)
  • ์˜ค๋ฅ˜์ฝ”๋“œ ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

if () {} else {} ๋Œ€์‹  try {} catch {} ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋…ผ๋ฆฌ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. try-catch-finally ๋ฌธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜๊ณ  catch ๋ธ”๋ก์˜ ์˜ˆ์™ธ ์œ ํ˜•์„ ์ ์  ์ขํ˜€๋‚˜๊ฐ€๋ฉฐ ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค. ํ™•์ธ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋„ ํฌํ•จํ•œ๋‹ค. ํ™•์ธ๋œ ์˜ˆ์™ธ๋งŒ์„ ์žก๋Š” ๊ฒƒ์€ OCP ์›์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค. ๋งŒ์•ฝ์— ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€๋ฅผ ์ „๋ถ€ ๊ณ ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. catch ๋ฌธ์—์„œ๋Š” log ์— ์‹คํŒจํ•œ ์—ฐ์‚ฐ ์ด๋ฆ„๊ณผ ์‹คํŒจ ์œ ํ˜•์„ ๋‹ด๋Š”๋‹ค.

  • Open Closed Principle - ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜ ์‹œ ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๋ ค์žˆ๊ณ  ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™

8. ๊ฒฝ๊ณ„ (์˜คํ”ˆ์†Œ์Šค, third party package ์‚ฌ์šฉํ•˜๊ธฐ)

  1. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ธฐ

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

  1. ํ•™์Šต ํ…Œ์ŠคํŠธ

์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ตํžˆ๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š๋‹ค. ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋” ์–ด๋ ต๋‹ค. ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ถœ๋ ฅ๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์ตํžŒ๋‹ค. ์ด๋ฅผ ํ•™์Šต ํ…Œ์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

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


9. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

์ปดํŒŒ์ผ์€ ์‹คํŒจํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์‹คํ–‰์€ ์‹คํŒจํ•˜๋Š” ์ •๋„์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ํ˜„์žฌ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ •๋„๋กœ๋งŒ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 'ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋“  ๋ณ€๊ฒฝ์ด ์ž ์ •์ ์ธ ๋ฒ„๊ทธ๋‹ค.' ์ฆ‰, ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ค๋ณด๋ฉด ๋˜๋‹ˆ, ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„์ง€ ๋‘๋ ค์›Œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • ๊นจ๋—ํ•œ ํ…Œ์ŠคํŠธ ๊ทœ์น™ FIRST

    • Fast : ํ…Œ์ŠคํŠธ๋Š” ๋น ๋ฅด๊ฒŒ ์ž์ฃผ ๋Œ๋ ค์•ผ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋Š๋ฆฌ๋ฉด ์ž์ฃผ ๋Œ๋ฆด ์—„๋‘๋ฅผ ๋‚ด์ง€ ๋ชปํ•œ๋‹ค.
    • Independent : ๊ฐ ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์•„์•ผ ํ•œ๋‹ค.
    • Repeatable : ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ˜๋ณตํ•ด์„œ ๋Œ์•„์•ผ ํ•œ๋‹ค.
    • Self-validating : ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” True/False๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด log๋ฅผ ์ผ์ผ์ด ์ฝ๊ฒŒ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    • Timely : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ง์ „์— ๊ตฌํ˜„ํ•œ๋‹ค.

์ฑ… ๋ชจ์ž„์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด์„œ๋งŒ ๋”ฐ๋กœ ์ฑ…์„ ์ฝ์œผ๋ผ๊ณ  ๊ถŒํ•  ์ •๋„๋กœ ํด๋ฆฐ์ฝ”๋“œ์— ์†Œ๊ฐœ๋œ ๋‚ด์šฉ์€ ์ผ๋ถ€์— ๋ถˆ๊ณผํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.


10. ํด๋ž˜์Šค

  1. ์ฑ…์ž„

ํด๋ž˜์Šค๋„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘์•„์•ผํ•˜๋ฉฐ, ๋‹จ์ผ์ฑ…์ž„์›์น™์„ ๋”ฐ๋ฅธ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„์€ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๊ธฐ์ˆ ํ•œ๋‹ค. Processor, Manager ๋“ฑ๊ณผ ๊ฐ™์ด ๋ชจํ˜ธํ•œ ์ด๋ฆ„์ผ ๊ฒฝ์šฐ, ํด๋ž˜์Šค๊ฐ€ ๋งก์€ ์ฑ…์ž„์ด ๋งŽ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.

  1. ์‘์ง‘๋„

ํด๋ž˜์Šค์— ์†ํ•œ ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜๊ฐ€ ์„œ๋กœ ์˜์กดํ•˜๋ฉฐ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ฌถ์—ฌ ์žˆ๋Š” ๊ฒƒ. ์‘์ง‘๋ ฅ์„ ์žƒ์—ˆ์„ ๋•Œ์—๋Š” ํด๋ž˜์Šค๋ฅผ ์ชผ๊ฐœ์•ผ ํ•œ๋‹ค.

  1. ์ถ”์ƒ ํด๋ž˜์Šค์™€ ํ…Œ์ŠคํŠธ

๊ตฌ์ฒด์ ์ธ ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฉ๋ฆฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜ ํด๋ž˜์Šค๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ํ…Œ์ŠคํŠธ์šฉ ํด๋ž˜์Šค๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ํ…Œ์ŠคํŠธ์šฉ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๊ณ ์ •๋œ ๊ฐ’์œผ๋กœ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ž˜์Šค ์„ค๊ณ„ ์›์น™์ธ DIP(Dependency Inversion Principle)์—๋„ ๋ถ€ํ•ฉํ•˜๊ฒŒ ๋œ๋‹ค.


12. ์ฐฝ๋ฐœ์„ฑ

์ฐฝ๋ฐœ์„ฑ(Emergence)์€ ๊ฐœ๋ฏธ ํ•œ๋งˆ๋ฆฌ๋Š” ์ง‘์„ ์ง€์„ ๋Šฅ๋ ฅ์ด ์—†์ง€๋งŒ ๊ฐœ๋ฏธ ์ง‘ํ•ฉ์€ ๊ฑฐ๋Œ€ํ•œ ์ง‘์„ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๋ฐœํœ˜ํ•˜๋Š” ์ž๊ธฐ์กฐ์งํ™” ๋Šฅ๋ ฅ์—์„œ ์˜จ ๊ฐœ๋…์ด๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ์•ž ์žฅ์˜ ๋‚ด์šฉ์„ ์š”์•ฝ/์ •๋ฆฌํ–ˆ๋‹ค.

  1. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  2. ์ค‘๋ณต์„ ์—†์•ค๋‹ค.
  3. ์˜๋„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  4. ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ์ˆ˜๋ฅผ ์ตœ์†Œ๋กœ ์ค„์ธ๋‹ค.

'Coding is as much an art as it is a science'
- Rebecca Parsons