Understanding 'Clean Code' in a Pythonic way
2017-08-23
Clean Code: A Handbook Of Agile Software Craftsmanship (2009) ๋ผ๋ ์ฑ ์ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ฑ ์ ์์ ๋ Java ๋ก ์ฐ์ฌ ์์ด์ Python์ผ๋ก ์ฐ์ธ ์ฝ๋๋ ํจ๊ป ์ฐพ์๋ณด์์ต๋๋ค. ์ด ์ฑ ์ ๊ทธ ์์ฒด๊ฐ ํด๋ฆฐ์ฝ๋์ ๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋ ์์น๊ณผ ์ฒ ํ์์ ์ค์ ์ฝ๋๊น์ง ์ค๋ช ์ด ๋ช ํํ๊ณ ๊ตฐ๋๋๊ธฐ๊ฐ ์์ต๋๋ค. ์ค์ ๋ก ์ฝ๋ค๊ฐ ๋ ธํธ๋ถ์ ์ผ๊ณ ๋ฆฌํฉํ ๋งํ๋ฉฐ ๋ฌด๋ฆ์ ํ์น ๊ฒฝ์ฐ๊ฐ ์ ์ง ์์์ต๋๋ค.
๐ Clean Code (1)
if () {} else {}
๋์ try {} catch {}
๋ฅผ ์ฌ์ฉํด์ ๋
ผ๋ฆฌ ๋ถ๋ถ๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋ค. try-catch-finally ๋ฌธ๋ถํฐ ์์ฑํ๊ณ catch ๋ธ๋ก์ ์์ธ ์ ํ์ ์ ์ ์ขํ๋๊ฐ๋ฉฐ ๋ฆฌํฉํ ๋งํ๋ค. ํ์ธ๋์ง ์์ ์ค๋ฅ๋ ํฌํจํ๋ค. ํ์ธ๋ ์์ธ๋ง์ ์ก๋ ๊ฒ์ OCP ์์น์ ์๋ฐํ๋ค. ๋ง์ฝ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ค๋ฉด ๋ฉ์๋ ์ ์ธ๋ถ๋ฅผ ์ ๋ถ ๊ณ ์ณ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. catch ๋ฌธ์์๋ log ์ ์คํจํ ์ฐ์ฐ ์ด๋ฆ๊ณผ ์คํจ ์ ํ์ ๋ด๋๋ค.
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๋์ค ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ก ์์ฑํด์ ์ฌ์ฉํ๋ค.
์ธ๋ถ ์ฝ๋๋ฅผ ์ตํ๋ ๊ฒ์ ์ฝ์ง ์๋ค. ํตํฉํ๋ ๊ฒ์ ๋ ์ด๋ ต๋ค. ๊ฐ๋จํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ณ ์ถ๋ ฅ๋ ์ค๋ฅ ๋ฉ์์ง์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๊ณ ์น๋ ๊ฒ์ ๋ฐ๋ณตํ๋ฉฐ ์ฝ๋๋ฅผ ์ตํ๋ค. ์ด๋ฅผ ํ์ต ํ ์คํธ๋ผ๊ณ ํ๋ค.
๋ชจ๋ฅด๋ ์ฝ๋๋ฅผ ๋ง์ฃผํ ๋๋ ์๋ค. ์๊ณผ ๋ชจ๋ฆ์ ๊ฒฝ๊ณ์ ์๋ ์ฝ๋๋ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํด์ ๋ณ๊ฒฝํ ๋ ๋น์ฉ์ ์ค์ธ๋ค. ์ธ๋ถ ์ฝ๋๋ฅผ ์๋ฒฝํ ์ดํดํ๊ณ ์ฐ๋ฆฌ์ชฝ ์ฝ๋๋ฅผ ํตํฉํ๋ ๊ฒ๋ณด๋ค ๊ตฌํํ๊ณ ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ฏธ๋ฆฌ ์ค๊ณํ๊ณ ๊ทธ ํจํด์ ์ธ๋ถ ์ฝ๋๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ๋ซ๋ค.
์ปดํ์ผ์ ์คํจํ์ง ์์ผ๋ฉด์ ์คํ์ ์คํจํ๋ ์ ๋์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ค. ํ์ฌ ์คํจํ๋ ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ๋๋ก๋ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ค. 'ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋ค๋ฉด ๋ชจ๋ ๋ณ๊ฒฝ์ด ์ ์ ์ ์ธ ๋ฒ๊ทธ๋ค.' ์ฆ, ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด๋ ํ ์คํธ๋ฅผ ๋๋ ค๋ณด๋ฉด ๋๋, ๋ฒ๊ทธ๊ฐ ์์์ง ๋๋ ค์ํ์ง ์์๋ ๋๋ค.
๊นจ๋ํ ํ ์คํธ ๊ท์น FIRST
์ฑ ๋ชจ์์์๋ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ๋ํด์๋ง ๋ฐ๋ก ์ฑ ์ ์ฝ์ผ๋ผ๊ณ ๊ถํ ์ ๋๋ก ํด๋ฆฐ์ฝ๋์ ์๊ฐ๋ ๋ด์ฉ์ ์ผ๋ถ์ ๋ถ๊ณผํ๋ฉฐ, ํ ์คํธ๋ ๋งค์ฐ ์ค์ํ๋ค.
ํด๋์ค๋ ํจ์์ฒ๋ผ ์์์ผํ๋ฉฐ, ๋จ์ผ์ฑ ์์์น์ ๋ฐ๋ฅธ๋ค. ํด๋์ค ์ด๋ฆ์ ํด๋์ค์ ์ฑ ์์ ๊ธฐ์ ํ๋ค. Processor, Manager ๋ฑ๊ณผ ๊ฐ์ด ๋ชจํธํ ์ด๋ฆ์ผ ๊ฒฝ์ฐ, ํด๋์ค๊ฐ ๋งก์ ์ฑ ์์ด ๋ง์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
ํด๋์ค์ ์ํ ๋ฉ์๋์ ๋ณ์๊ฐ ์๋ก ์์กดํ๋ฉฐ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ฌ ์๋ ๊ฒ. ์์ง๋ ฅ์ ์์์ ๋์๋ ํด๋์ค๋ฅผ ์ชผ๊ฐ์ผ ํ๋ค.
๊ตฌ์ฒด์ ์ธ ์ค์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋ ํด๋์ค์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํด ๊ฒฉ๋ฆฌํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ ํด๋์ค๋ฅผ ํ๋ด๋ด๋ ํ ์คํธ์ฉ ํด๋์ค๋ ๋ง๋ค ์ ์๋ค. ์ค์๊ฐ์ผ๋ก ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์ฝ๋์ ๊ฒฝ์ฐ, ํ ์คํธ์ฉ ์ถ์ ํด๋์ค๊ฐ ์์ผ๋ฉด ๊ณ ์ ๋ ๊ฐ์ผ๋ก๋ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋์ค ์ค๊ณ ์์น์ธ DIP(Dependency Inversion Principle)์๋ ๋ถํฉํ๊ฒ ๋๋ค.
์ฐฝ๋ฐ์ฑ(Emergence)์ ๊ฐ๋ฏธ ํ๋ง๋ฆฌ๋ ์ง์ ์ง์ ๋ฅ๋ ฅ์ด ์์ง๋ง ๊ฐ๋ฏธ ์งํฉ์ ๊ฑฐ๋ํ ์ง์ ์ง์ ์ ์๋ ๋ฅ๋ ฅ์ ๋ฐํํ๋ ์๊ธฐ์กฐ์งํ ๋ฅ๋ ฅ์์ ์จ ๊ฐ๋ ์ด๋ค. ์ด ์ฑ ์์๋ ์ ์ฅ์ ๋ด์ฉ์ ์์ฝ/์ ๋ฆฌํ๋ค.
'Coding is as much an art as it is a science'
- Rebecca Parsons