Refactoring - cleancodeclass/cleancode_theory GitHub Wiki
Refactoring ์ด๋ ๋ฌด์์ธ๊ฐ?
- ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๋์ํ๋๋ก ๋๊ณ , ์ํํธ์จ์ด ๋ด๋ถ๋ฅผ ์์ ํ๋ ์์
- ์ ๋๋ก ์คํ๋๋ ๊ตฌ์กฐ๊ฐ ์์ ํ์ง ๋ชปํ ์ฝ๋๋ฅผ ๋์์ผ๋ก ์์
- ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ๋ ์ฝ๋๋ก ์ํํธ์จ์ด ๋ด๋ถ๋ฅผ ๋ณ๊ฒฝ
- ๊ฒ์ผ๋ก ๋๋ฌ๋๋ ๊ธฐ๋ฅ์๋ ์ํฅ์ ์ฃผ์ง ์์
- ๊ธฐ๋ฅ์ด ๋ณํ์ง ์๋๋ค๋ ๊ฒ์ ์ฆ๋ช ํด์ฃผ๋ ํ ์คํธ ์ฝ๋๊ฐ ๋ฐ๋์ ํ์!
์ Refactoring์ ํ๋๊ฐ?
- ์ํํธ์จ์ด ์ค๊ณ๊ฐ ๊ฐ์ ๋๋๊น : ์ค๋ณต๋ ์ฝ๋๊ฐ ์์ด์ง๋ฉด์ ์ค๊ณ๊ฐ ๊ฐ์ ๋๋ค.
- ์ํํธ์จ์ด ์ดํด๊ฐ ๋ ์ฌ์์ง๋๊น : ์ฝ๋๊ฐ ๊น๋ํด์ ธ ๋น ๋ฅด๊ฒ ํ์ ํ๊ณ ์์ ํ ์ ์๋ค.
- ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๊น : ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ์ ๋จ์โ๋ช ๋ฃํ๋ก ๋ฒ๊ทธ ์์ธ์ ์ฝ๊ฒ ์ฐพ๋๋ค.
- ํ๋ก๊ทธ๋๋ฐ ์๋๊ฐ ๋นจ๋ผ์ง๋๊น : ๊น๋ํ ์ค๊ณ๋ก ์ํํธ์จ์ด ๊ฐ๋ฐ์๋๊ฐ ๋์์ง๋ค.
์ธ์ ๋ฆฌํฉํ ๋ง์ ํ๋๊ฐ?
- ์์ ํ๊ณ ๋ฐ๋ก ์๊ฐ์ ๋ด์ ํ๋ ๊ฒ์ด ์๋ ์ผ์์ ์ผ๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
- ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋
- ๋ฒ๊ทธ๋ฅผ ์์ ํ ๋
- ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํ ๋
- ๊ฐ๋ฐ ์ค์ ๋ฅ๋ฅ ์ ๋์ด๊ธฐ ์ํด์ ํํํ ํ๋ ๊ฒ์ด๋ค.
- ์ฝ๋๋ฅผ ์์๋ณด๊ธฐ ํ๋ค ๋
- ์ค๋ณต๋ ๋ก์ง์ด ๋ค์ด์์ ๋
- ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ฃ์ด์ผ ํด์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋
- ์กฐ๊ฑด๋ฌธ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ ๋
๋ฆฌํฉํ ๋ง ๋ฐฉ๋ฒ
- Find some code that โsmellsโ
- Determine how to simplify this code
- Make the simplifications
- Run tests to ensure things still work correctly
- Repeat the simplify/test cycle until the smell is gone
์ฝ๋ ์ค๋ฉ(Code Smell)
- ์ฝ๋์์ ๋ ์ฌ์คํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋์ ์ฆ์
- ์ฝ๋ ์ค๋ฉ์ธ์ง ์๋์ง์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์ผ์ ์ฃผ๊ด์ ์ธ ๊ฒ
- ์ธ์ด์ ๊ฐ๋ฐ์, ๊ฐ๋ฐ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค์ํจ
- ์ฝ๋ ์ค๋ฉ์ ํ์ธํ๊ธฐ ์ํ ๋ค์ํ ๋๊ตฌ๋ค์ด ์์ (PMD, FindBugs ๋ฑ)
- ๋ฉ์๋ ์ถ์ถ
- ์ฝ๋๋ฅผ ๋ฉ์๋๋ก ๋นผ๋ธ๋ค.
- ๋ฉ์๋๊ฐ ๋๋ฌด ๊ธธ๊ฑฐ๋ ์ฝ๋์ ์ฃผ์์ ๋ฌ์์ผ๋ง ์๋๋ฅผ ์ดํดํ ์ ์์ ๋
- ๋ฉ์๋์ ์ด๋ฆ์ ์ฝ๋์ ๋ชฉ์ ์ ๋ํ๋ด๋ ์ง๊ด์ ์ธ ์ด๋ฆ์ ๋ฉ์๋์ฌ์ผ ํ๋ค.
- ์กฐ๊ฑด๋ฌธ ์ชผ๊ฐ๊ธฐ
- if, then, else ๋ถ๋ถ์ ๊ฐ๊ฐ ๋ฉ์๋๋ก ๋นผ๋ธ๋ค.
- if, then, else ๋ถ๋ถ์ ๊ฐ๊ฐ ๋ฉ์๋๋ก ๋นผ๋ธ๋ค.
- ๋งค๊ฐ๋ณ์ ์ธํธ๋ฅผ ๋ฉ์๋๋ก ์ ํ
- ๋งค๊ฐ๋ณ์๋ฅผ ์์ ๊ณ ์ง์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ์์ ํ๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๋ฉ์๋๋ฅผ ์ ๋ฌ๋ฐ๋ ์ชฝ์์๋ ํธ์ถํ ์ ์์ ๋
- ํธ์ถํ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ๊ณ์ฐ์ ์ฌ์ฉ๋ ๋ ์ญ์ ํ ์ ์๋ค.
- ๊ฐ์ฒด๋ฅผ ํต์งธ๋ก ์ ๋ฌ
- ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ฒด๋ก ์ ๋ฌํด ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ธ๋ค.
- ๊ฐ์ฒด์์ ๊ฐ์ ธ์จ ์ฌ๋ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๋ ๊ฐ์ฒด๋ฅผ ํต์งธ๋ก ์ ๋ฌํ๋๋ก ์์ ํ๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ฏ๋ก ๊ฐ๋ฅํ ์ค์ฌ์ผ ํ๋ค. ๋จ, ์ ๋ฌ๋๋ ๊ฐ์ฒด์ ์์กด์ฑ์ด ๊ฐํ๋๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
- ๋งค๊ฐ๋ณ์ ์ธํธ๋ฅผ ๊ฐ์ฒด๋ก ์ ํ
- ๋ ํจ๊ป ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์ ๋ญ์น๋ฅผ ๊ฐ์ฒด๋ก ์ ๋ฌํ๋๋ก ์์ ํ๋ค.
- ๋งค๊ฐ๋ณ์ ์ธํธ๊ฐ ์งง๊ฒ ์ค์ด์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
- ๋ฐ๋ณต๋๋ ๊ด๋ จ ๊ธฐ๋ฅ์ ์๋ก์ด ํด๋์ค๋ก ์ฎ๊ฒจ ์ฝ๋ ์ค๋ณต์ ์์จ ์ ์๋ค.
- ํด๋์ค ์ถ์ถ
- ํด๋์ค์ ์ผ๋ถ๋ฅผ ๋ผ๋ด์ด ์๋ก์ด ํด๋์ค๋ก ๋ง๋ ๋ค.
- ๊ฐ๋ฐํ๋ฉด์ ํด๋์ค๋ ๊ธฐ๋ฅ ์ถ๊ฐ๋ก ์ ์ฐจ ๋ฐฉ๋ํด์ง๋ค.
- ์ฌ๋ฌ ํด๋์ค๊ฐ ์ฒ๋ฆฌํด์ผ ํ ๊ธฐ๋ฅ์ด ํ๋์ ํด๋์ค์ ๋ค์ด์์ ๋
- ๋ฉ์๋ ์ด๋(Move Method)
- ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ํด๋์ค๋ก ์ด๋ํ๋ ๊ธฐ๋ฒ
- ๋ฉ์๋๊ฐ ์์ ์ ํด๋์ค๋ณด๋ค ๋ค๋ฅธ ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ ๋ง์ด ์ด์ฉํ ๋
- ํด๋์ค์ ๊ธฐ๋ฅ์ด ๋๋ฌด ๋ง๊ฑฐ๋ ํด๋์ค๊ฐ ์์กด์ฑ์ด ์ง๋์น ๋
- ํ๋ ์ด๋(Move Field)
- ํด๋์ค ๋ด์ ํ๋๋ฅผ ๋ค๋ฅธ ํด๋์ค๋ก ์ฎ๊ธด๋ค.
- ์์ ์ด ์ํ ํด๋์ค๋ณด๋ค ๋ค๋ฅธ ํด๋์ค์์ ๋ ๋ง์ด ์ฌ์ฉ๋ ๋
- ํด๋์ค ๋ด์ฉ ์ง์ ์ฝ์
(Inline Class)
- ํด๋์ค์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํด๋์ค๋ก ํฉ์ณ ๋ฃ๋๋ค.
- ํด๋์ค ์ถ์ถ (Extract Class)๊ณผ ๋ฐ๋๋๋ ๊ฐ๋
- ํด๋์ค์ ๊ธฐ๋ฅ ๋๋ถ๋ถ์ ์ด๋์์ผ ๋จ์ ๊ธฐ๋ฅ์ด ๊ฑฐ์ ์์ ๋
- ํด๋น ํด๋์ค๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ํ๋ ๊ณจ๋ผ์ ํฉ์น๋ค.
- Replace Type Code with State / Strategy
- ๋ถ๋ฅ ๋ถํธ๋ฅผ ์ํ/ ์ ๋ต ํจํด์ผ๋ก ์ ํ
- ์ํ / ์ ๋ต ํจํด์ ์ด์ฉํด์ ๋ถ๋ฅ ๊ธฐํธ๋ฅผ ์์ ๋ ๊ธฐ๋ฒ
- ๋ถ๋ฅ ๋ถํธ๋ฅผ ํ์ํด๋์ค๋ก ์ ํ (with Subclasses)๊ณผ ๋น์ทํ ๊ธฐ๋ฒ
- ๋ถ๋ฅ ๋ถํธ๊ฐ ๊ฐ์ฒด ์๋ช
์ฃผ๊ธฐ ๋์ ๋ณํ ๋๋ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ
๊ฐ๋จํ Cleancode Refactoring ์ฌ๋ก?