โซ ์ ์ง๋ณด์์ฑ ๋์ Clean Method์ ์กฐ๊ฑด
1. Method๋ฅผ ํธ์ถํ๋ ์ฌ๋์ด ์ฌ์ฉํ๊ธฐ ์ฉ์ดํด์ผ ํ๋ค.
2. Method๋ฅผ ์ ์ง๋ณด์ ํ๋ ์ฌ๋์ด ์ดํดํ๊ณ , ๋ณ๊ฒฝํ๊ธฐ ์ฉ์ดํด์ผ ํ๋ค.
3. Method๋ฅผ ์ ์ง๋ณด์ ํ๋ ์ฌ๋์ด ํ
์คํธํ๊ธฐ ์ฉ์ดํด์ผ ํ๋ค.
โถ Clean Method์ ์์น
· ๊ฐ๋ฅํ ํ ์ถฉ๋ถํ ์์์ผ ํ๋ค.
· ํ ๊ฐ์ง๋ฅผ ํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ ๊ฐ์ง๋ฅผ ์ ํด์ผ ํ๋ค.
· ํ ์คํธ ๊ฐ๋ฅํด์ผ ํ๋ค.
· ์ค๋ณต์ด ์์ด์ผ ํ๋ค.
Method๋ฅผ ๋ง๋ค ๋ Method๋ฅผ ํธ์ถํ๋ ์ฌ๋์ ์ธ์ง์ ๋ถํ๋ฅผ ์ต์๋ก ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค. ์ฆ, Method๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ด๋ถ ์ฝ๋๋ฅผ ๋ณด๊ฑฐ๋ API ๋ฌธ์๋ฅผ ๋ณด์ง ์๊ฒ๋ ํด์ผํ๋ค๋ ๊ฒ์ด๋ค. ์ธ์ง์ ๋ถํ๋ฅผ ๋ฎ์ถ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ Method์ Parameter์ ๊ฐ์๋ฅผ ๊ฐ๋ฅํ ํ ์ต์๋ก ์ ์งํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ Prameter์ ๊ฐ์๋ ๋ช๊ฐ๊ฐ ๊ฐ์ฅ ์ข์๊น?
Parameter์ ๊ฐ์๊ฐ 3-4๊ฐ ์ด์์ผ ๋ ๊ณ ๋ คํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
1. Method๋ฅผ ๋ถํ ํ๋ค.
→ Method๊ฐ ๋๋ฌด ๋ง์ ์ญํ ์ ํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ๋ช ํํ ํ ๊ฐ์ง ์ญํ ์ ํ๋ 2๊ฐ ์ด์์ Method๋ก ๋ถํ ํ๋ ๊ฒ์ด ์ข๋ค.
2. Parameter Object๋ฅผ ์ฌ์ฉํ๋ค.
→ method๋ฅผ ํธ์ถํ ๋, ์ค์ ์ธ์๋ก ์๋ง์ ์ ๋ณด๊ฐ ํ์ํ ๋๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ primitive๋ก ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ํด๋์ค๋ฅผ ์์ฑํ์ฌ Object๋ฅผ ์์ฑํ์ฌ ๋๊ฒจ์ฃผ๋๊ฒ ์ข๋ค.
ex) saveProduct(product) // name, type, price, instructor, description, ...
3. ์์ฑ์์ ๊ฒฝ์ฐ Builder Pattern์ ํ์ฉํ๋ค.
→ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ฐ์ฒด ์์ฒด๊ฐ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ์์ฑ์๊ฐ ๋ณต์กํด์ง ์ ์๋ค. ์ด๋ด๊ฒฝ์ฐ, Builder Pattern์ ํ์ฉํ๊ฒ ๋๋ฉด ํ์ํ ๊ฒ๋ค๋ง ๋ช ํํ๊ฒ ์ธํ ํ์ฌ buildํ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
ex) Product("cleancode", "course", 10, "Dahye", ...) _ ์ผ๋ฐ
Product.builder().name("cleancode").type("course").price(10).build() _ Builder Pattern ํ์ฉ
4. Map์ ์ฌ์ฉํ๋ค.
→ Parameter์ ๊ฐ์๊ฐ ๋ง์ ์ Map ์ฌ์ฉ์ ์ ํน์ด ์๋ค. ๊ทธ๋ฌ๋ Map ์ฌ์ฉ์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค. Map์ Key๊ฐ์ด ์ ๋์ ์ด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๋ฌธ์ํ๊ฐ ํ์ํ๊ณ , Map์ Key์ ์ ๋ณด๋ ๊ฐ์๊ฐ ๋ณ๊ฒฝ๋์์ ์ ์๊ธฐ๊ฐ ์ด๋ ต๋ค. ๋ํ ํธ์ถํ๋ ์ฌ๋์ด Key ๊ฐ์ ์คํ๋ฅผ ์ ๋ ฅํ์ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์์์ ์ข์ method๋ ์๊ณ , ํ ๊ฐ์ง ์ผ์ ํด์ผํ๋ค ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๋จผ์ Clean Method๋ ์ผ๋ง๋ ์์์ผํ ๊น?
โซ ์๊ณ ์ญํ ์ด ๋ช ํํ ๋ฉ์๋์ ์ฅ์
· ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฉ์ดํ๋ค.
· ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ฉ์ดํ๋ค.
· ๋จ์ ํ ์คํธํ๊ธฐ๊ฐ ์ฉ์ดํ๋ค.
· ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค.
Rules of Thumb
· 10~100 ๋ผ์ธ ์ฌ์ด๊ฐ ์ ์ ํ๋ค. ๊ทธ๋ฌ๋ ์ซ์์ ์ง์ฐฉํ ํ์๋ ์๋ค.
· 1๊ฐ์ Method๋ ์คํฌ๋กค๋ง์ ํ์ง ์๊ณ ์ฝ์ ์ ์์ด์ผ ํ๋ค.
· ๋จ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋๋ฐ ์ด๋ ค์์ด ์์ด์ผ ํ๋ค.
· Method ๋์์ ์ค๋ช ํ๊ธฐ ์ํด ๋ด๋ถ์ ์ฃผ์์ ๋ฌ์์ผ ํ๋ฉด Bad Smell์ด๋ค.
(์ฃผ์์ด ํ์ํ ์ฝ๋๋ค์ ์๋ก์ด Method๋ก ์ถ์ถํ๋ค)
Method์ ํฌ๊ธฐ์ ๋ํด ์์๋ดค์ผ๋ ์ด๋ฒ์ ํ ๊ฐ์ง์ ๋ช ํํ ์ญํ ์ ํ๋ค๋ ๊ฒ์ ๋ฌด์์ธ์ง ์์๋ณด์.
โซ ํ ๊ฐ์ง์ ๋ช ํํ ์ผ์ ํ๋ Method์ ์ฅ์
· ๋ช ํํ Naming์ด ๊ฐ๋ฅํ๊ณ , ์ด๋ฆ๋ง์ผ๋ก ๊ธฐ๋ฅ์ ์ดํดํ ์ ์๋ค.
· ๋ณต์ก๋๊ฐ ๋ฎ์์ง ๊ฐ๋ฅ์ฑ์ด ๋๋ค.(Cyclomatic Complexity) → ์กฐ๊ฑด๋ฌธ์ ๋ณต์กํ ์ค์ฒฉ๊ตฌ์กฐ๊ฐ ์ ๋ค.
· Method์ ๋ด๋ถ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฉ์ดํ๋ค.
· ๋จ์ ํ ์คํธํ๊ธฐ๊ฐ ์ฉ์ดํ๋ค.
ํ ๊ฐ์ง์ ์ผ์ด๋ ๋ฌด์์ผ๊น?
1. ํ๋์ Method๋ ๋์ผํ ์ถ์ํ์ ์์ค๋ง ๊ฐ์ ธ์ผ ํ๋ค.
* ์ถ์ํ์ ์์ค(Level of Abstraction)์ด๋?
ํ์๊ฐ์ method๋ฅผ ์์๋ก ํ method ์์ ์ถ์ํ ์์ค์ด ๋์ผํ๊ฒ ๊ตฌ์ฑ๋์๋์ง ๋ณด์.
๋ ๋ค๋ฅธ ์ถ์ํ ์์ค์ ์๋ฅผ ๋ณด์.
2. Method์ ์ด๋ฆ์ด ์ฑ ์์ง๋ ๋ฒ์์ ์ผ๋ง ํด์ผ ํ๋ค.
๊ตฌ์ฑํ๊ณ ์ ํ๋ ์์คํ ์ ์์ญ์ ์ ํ๋ฉด ๊ทธ ์์คํ ์ ์ฑ ์์ง๋ ์ผ๋ง ํด์ผํ๋ค.
์ด๋ฆ์ ์ฑ ์์ ๋ฒ์ด๋๋ Bad Smell์ ์์๋ฅผ ๋ณด์.
Clean Method๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ง์์ ์ธ ๊ฐ์ ์ด๋ค
ํ ๊ฐ์ง๋ฅผ ์ํ๋ Method๋ฅผ ๋ง๋๋ ๊ฒ์ ์ด๋ ต๋ค.
๋ฐ๋ผ์
์ถฉ๋ถํ ์์๊ฐ, ์ถฉ๋ถํ ํ ์คํธ ๋๊ณ ์๋๊ฐ? ๋์์๋ ์ง๋ฌธ๊ณผ ๊ฐ์ ์ด ์ค์ํ๋ค.
์ฒ์๋ถํฐ ๊ฑฐ๋ํ Method๋ ์ ๋ค. ํ์ง๋ง ์ ๊น์ ์ ํน๋ค์ด ์ ์ ๊ฑฐ๋ํ Method๋ฅผ ๋ง๋ค๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ค๊ณ์ ๋ํ ๊ณ ๋ ค ์์ด ๊ธฐ์กด Method์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ํํ๋ค.
์ค๋ณต ์ฝ๋
์ผ์ ๋ผ์ธ ์ ์ด์์ด ๋ค์ ์ค๋ณต๋์ด ์กด์ฌํ๋ ์ฝ๋
์ค๋ณต ์ฝ๋์ ์ข ๋ฅ
1. Method ์ ์ฒด ์ฝ๋ ์ค๋ณต
: ๋ค์์ Method์ ๊ตฌํ๋ถ๊ฐ 100% ์ผ์นํ๋ ๊ฒฝ์ฐ (* Method ์ด๋ฆ์ ๋ค๋ฅผ ์ ์์)
2. ์ฐ์ ๋ ์ผ๋ จ์ ์ฝ๋ ์ค๋ณต
: Method ์ ์ฒด๋ ์๋์ง๋ง ์ผ๋ถ ์ฐ์ ๋ ์ฝ๋๊ฐ ๋ค์ ์ค๋ณต๋๋ ๊ฒฝ์ฐ (* ์ค๋ณต ์ฝ๋์ ๋๋ค์๋ฅผ ์ฐจ์งํ๋ ์ ํ)
3. ์ผ๋ถ๋ง ๋ค๋ฅธ ์ฝ๋ ์ค๋ณต
: ์ฝ๋๊ฐ ์ค๋ณต๋์ง๋ง ์ค๊ฐ 1-2 ๋ผ์ธ ์ ๋๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ (* Refactoringํ๊ธฐ ๊ฐ์ฅ ๊น๋ค๋ก์ด ์ ํ)
์ค๋ณต ์ฝ๋์ ๋ฌธ์ ์
- ๋ถํ์ํ๊ฒ ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ํฌ๊ฒ ๋ง๋ ๋ค. (์ฝ๋๋ฒ ์ด์ค๊ฐ ํฌ๋ฉด ์ ์ง๋ณด์์ฑ์ ๋จ์ด๋จ๋ฆฐ๋ค)
- ์ฝ๋๋ฅผ ์์ ํด์ผ ํ ๋ ์ค๋ณต๋ ๋ค์์ ์ฝ๋๋ฅผ ๋ชจ๋ ์์ ํด์ผ ํ๋ค. (์ผ๋ถ ๋๋ฝ๋ ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค)
- ์ค๋ณต ์ฝ๋์ ์ ์ฌ์ ๊ฒฐํจ์ด ์์ ์, ๊ฒฐํจ๋ ๊ฐ์ด ์ค๋ณต ๋๋ค.
์ค๋ณต ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฒ
- ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋ค. (But, ์๋์ผ๋ก ์ ์ฒด SW ์์คํ ์ ์ค๋ณต์ ๋ค ๋ฐ๊ฒฌํ๊ธฐ๋ ์ฝ์ง ์๋ค)
- ์ ์ ๋ถ์์ ํ๋ค. (CPD, Atomiq ๋ฑ์ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ํ์ฉํ๋ค)
- ๋ค์ํ Refactoring ์ ๋ต ๋ฐ Design Pattern์ ์ ์ฉํ๋ค.
(Extract Method, Extract Superclass, Template Method Pattern)
โป ๋ณด์ด์ค์นด์ฐํธ ๋ฒ์น
: ์บ ํ์ฅ์ ์ฒ์ ์์ ๋๋ณด๋ค ๋ ๊นจ๋ํ๊ฒ ํด๋๊ณ ๋ ๋๋ผ (= ์ฒดํฌ์์ ํ ๋๋ณด๋ค ์กฐ๊ธ์ด๋ผ๋ ๋ ๊นจ๋ํ ์ฝ๋๋ฅผ ์ฒดํฌ์ธ ํ๋ผ)
→ ์์ฃผ ์์ ๊ฐ์ ์ด๋ผ๋ ์ง์๋๋ฉด ์ฝ๋๋ ๋๋น ์ง์ง ์๋๋ค.
(ex. ์กฐ๊ธ ๊ธด ํจ์๋ฅผ ๋ถํ , ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐ, ๋ณต์กํ if๋ฌธ 1๊ฐ ์ ๋ฆฌ ๋ฑ)
๋ณด์ด์ค์นด์ฐํธ ๊ท์น์ด ์ ๋๋ก ์งํ๋๊ธฐ ์ํด์๋
1. Clean Code๋ฅผ ์ฅ๋ คํ๋ ๋ฌธํ๊ฐ ํ์ฑ๋์ด์ผ ํ๋ค.
→ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ค๋ ๋ ธ๋ ฅ์ ๋ฌด์ํด์๋ ์๋๋ค.
2. ๋จ์ ํ ์คํธ ์ฝ๋๊ฐ ์์ด์ผ ํ๋ค.
→ ์์ ํ์๋ ํญ์ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ํฅ์ด ์์์ ๊ฒ์ฆํด์ผ ํ๋ค.
→ ์์ ํ์๋ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ๋ค.
โป ๋น์์์ ํ๋ก๊ทธ๋๋ฐ(Egoless Programming)
: ์์ง๋์ด ๊ฐ๊ฐ์ธ์ ์์๋ค์ ์ต๋ํ ์ ๊ฑฐํจ์ผ๋ก์จ ์ ์ฒด SW ํ์ง์ ๋์ด๋ ๋ฌธํ
( ๊ฐ์ ๋ง๋ ์ฝ๋์ ๊ฐ์ธ์ ์์๋ฅผ ํฌ์ํ์ง ๋ง์์ผ ํจ, ํ๋ก์ ํธ ์ด๊ธฐ๋ถํฐ ์ง์์ ์ธ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํ๋ฉฐ ๊ณต๋ ์ฑ ์ ์ฒ ํ์ ๊ฐ์กฐ)
โท ๋น์์์ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๊ฐ์ด๋_Jeff Atwood
· ๋น์ ์ด ์ค์ ํ ์ ์๋ค๋ ๊ฒ์ ๋ฐ์ ๋ค์ฌ๋ผ
· ๋น์ ๊ณผ ๋น์ ์ด ์์ฑํ ์ฝ๋๋ ๋ค๋ฅด๋ค.
· ๋น์ ๋ณด๋ค ์ง์์ด ์ ์ ์ฌ๋์ด๋ผ๋ ์กด์คํ๊ณ ์ธ๋ด๋ฅผ ๊ฐ๊ณ ๋ํ๋ผ.
· ์ธ์์ ๊ณ ์ ๋์ด ์๋ ๊ฒ์ ์๋ค. ๋ณํ๋ฅผ ๋ฐ์๋ค์ฌ๋ผ.
· ์ฌ๋์ด ์๋ ์ฝ๋๋ฅผ ๋นํํด๋ผ. ์ฌ๋์๊ฒ๋ ์น์ ํ ๋ํ๋ผ.
โ ๋ฐ๋ผ์, Clean Method๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋
· Parameter์ ๊ฐ์๋ ์ ๊ฒ,
· Clean Name์ผ๋ก ๋ช ํํ๊ฒ,
· ํฌ๊ธฐ๋ ์๊ฒ,
· ์ญํ ์ ๋ช ํํ๊ฒ,
· ์ค๋ณต ์๋ ์ํ๋ก,
· ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ํ ์คํธ ์ฉ์ด์ฑ์ ๋๊ฒ. ํด์ผํ๋ค.
์ฝ๋ํ๋ ์ Java ์น ๊ฐ๋ฐ ์ฒดํ๋จ ํ๋ ์ค 'SW ์ ์ง๋ณด์์ฑ ํฅ์์ ์ํ Clean Code' ์ด๋ฌ๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ฑํ์์ต๋๋ค :)
์ฝ๋ํ๋ ์ URL: https://www.codepresso.kr/
'๐ ๊ธฐํ > ์ฝ๋ํ๋ ์ ์ฒดํ๋จ_BE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Clean Control Structure | Refactoring (0) | 2022.01.24 |
---|---|
Clean Comment | Formatting (0) | 2022.01.24 |
Clean Naming (0) | 2022.01.23 |
[Java] ์ปฌ๋ ์ ํ๋ ์์ํฌ : List (0) | 2022.01.21 |
[Java] ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ์ ๋ค๋ฆญ (0) | 2022.01.21 |