๋Œ€์™ธํ™œ๋™/CodePresso

์ฝ”๋“œํ”„๋ ˆ์†Œ ์ฒดํ—˜๋‹จ 5 : SW ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•œ Clean Code

kite707 2022. 1. 24.

์ด๋ฒˆ์—๋Š” Clean Code ๊ด€๋ จ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ–ˆ๋‹ค. ๋จผ์ € Clean Code๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

 

Clean Code๋ž€?

Clean Code์— ๋Œ€ํ•ด Robert C.Martin์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค.

clean code๋Š” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ by Robert C.Martin, Clean Code

Clean Code์˜ ํ‘œ์ค€์ด๋‚˜ ์—„๊ฒฉํ•œ ์ •์˜๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๊ณตํ†ต๋œ ์˜๊ฒฌ์ด ์กด์žฌํ•œ๋‹ค.

  • ์‚ฌ๋žŒ์ด ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค
  • ๋‹จ์ˆœํ•œ ํ•œ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•˜๊ณ , ๋ช…ํ™•ํ•œ ์ด๋ฆ„(ํ‘œํ˜„)์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • ์ค‘๋ณต์ด ์—†๋‹ค
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Clean Code๋ž€ ์™œ ์ค‘์š”ํ• ๊นŒ?

์ผ๋ฐ˜์ ์œผ๋กœ SoftWare๋Š” ํ•œ ๋ฒˆ ๊ฐœ๋ฐœ๋˜๊ณ , ์˜ค๋žœ ๊ธฐ๊ฐ„๋™์•ˆ ์œ ์ง€๋ณด์ˆ˜๋œ๋‹ค. ์ด๋•Œ ๊ธฐ์กด ์ฝ”๋“œ์— ์ถ”๊ฐ€ ์ž‘์—…ํ•˜๋Š” ์‹œ๊ฐ„์ด ์••๋„์ ์œผ๋กœ ๋งŽ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ , ์ดํ•ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

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

 

Clean Code๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์ด์ œ Clean Code๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋„๋ก ํ•˜์ž.

 

Clean Code๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

1 . Clean Name

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

๐Ÿ’ก Variables / Constants : ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜๋Š” ์ด๋ฆ„

Functions / Methods : ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜๋Š” ์ด๋ฆ„

Classes : ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜๋Š” ์ด๋ฆ„

 

์œ„์™€ ๊ฐ™์ด Clean Name์„ ์งœ๋ ค๋ฉด ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ง์ด๋‹ค. ์ด๋Ÿฐ ๊ทœ์น™์€ ํŒ€์›๊ณผ ์ƒ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋˜๋Š” ์–ธ์–ด๋ณ„ Naming Standard๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ Java๋Š” Oracle, Google ๋“ฑ์—์„œ Style Guide๋ฅผ ์ œ์ž‘ํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿ’ก ex) ์šฐ๋ฆฌ ํŒ€์€ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ๋•Œ get ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
→User์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด getUser()ํ•จ์ˆ˜๋ฅผ ์ฐพ์•˜๋‹ค.

 

์ฝ”๋“œ ๋ฆฌ๋ทฐ์‹œ์—๋Š” Naming ๋“ฑ์ด ์‚ฌ์ „์— ์ •ํ•œ ๊ทœ์น™์„ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

 

2 . Clean Method

Method์™€ Function์€ SW์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ชจ๋“ˆ์ด๋‹ค. ์šฐ์„  Clean Method๋ž€ ํ˜ธ์ถœํ•˜๋Š” ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ์œ ์ง€๋ณด์ˆ˜ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ดํ•ด/๋ณ€๊ฒฝ/ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•œ๋‹ค. Clean Method์˜ ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๊ฐ€๋Šฅํ•œ ํ•œ ์ถฉ๋ถ„ํžˆ ์ž‘์•„์•ผ ํ•œ๋‹ค.
  • ํ•œ ๊ฐ€์ง€๋ฅผ ํ•ด์•ผํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  • ์ค‘๋ณต์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

๋˜ Parameter ์— ๋Œ€ํ•œ ์›์น™๋“ค๋„ ์žˆ๋‹ค.

  • Method๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ธ์ง€์  ๋ถ€ํ•˜๋ฅผ ์ตœ์†Œ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผํ•œ๋‹ค.
  • Method๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฑฐ๋‚˜ API ๋ฌธ์„œ๋ฅผ ๋ณด์ง€ ์•Š๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.
  • Parameter์˜ ๊ฐœ์ˆ˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์–ด์•ผ ํ•œ๋‹ค. →0~2๊ฐœ๊นŒ์ง€๋Š” ๋ณดํ†ต →3๊ฐœ๋Š” ๊ฐœ์„  ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ†  ํ•„์š”, 4๊ฐœ๋Š” ๊ฐœ์„  ํ•„์š”

Parameter๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์„ ๊ฒฝ์šฐ, ์ด๋Š” Method๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋Š” Method๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ๋œ๋‹ค. ๋˜๋Š” Parameter Data๋ฅผ ์ €์žฅํ•˜๋Š” Object๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ํ•˜์ž.

 

๐Ÿ’ก ์ฐธ๊ณ 
Cyclomatic Complexity
→ Method ๋‚ด๋ถ€์˜ ๋ณต์žก๋„๋ฅผ ์ฆ‰์ •ํ•˜๋Š” ์ง€ํ‘œ
→ Method ๋‚ด๋ถ€์˜ ์กฐ๊ฑด๋ฌธ ์ค‘์ฒฉ์ด ๋ณต์žกํ•  ์ˆ˜๋ก ๋†’์•„์ง„๋‹ค.
→ CC(Cyclomatic Complexity)๊ฐ€ ๋†’์„์ˆ˜๋ก ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๊ณ , ์ˆ˜์ •์ด ์–ด๋ ต๋‹ค.

 

3 . Clean Comment

Comment๋Š” Code์— ๋Œ€ํ•œ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ถ€๊ฐ€์„ค๋ช…์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ์ด Code๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์„์„ ์ž‘์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ Comment๋กœ ๋ถ€๊ฐ€ ์„ค๋ช…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Code๊ฐ€ ์ถฉ๋ถ„ํžˆ ์˜๋ฏธ์žˆ์ง€ ๋ชปํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ Comment๋Š” ์ˆ˜์ •์ด ๋˜๊ธฐ๋„ ํ•˜๊ณ , ๋˜์ง€ ์•Š๊ธฐ๋„ ํ•œ๋‹ค. ์ฆ‰ Comment์˜ ์ •๋ณด๋Š” ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ ์˜ค๋ž˜๋œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์ฆ‰ ์ฝ”๋“œ ์ˆ˜์ • ์ด๋ ฅ์„ Comment๋กœ ๋‚จ๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

4. Clean Formatting

Code Formatting์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์ดํ•ด๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์ด๋‹ค. ์ˆ˜์ง์  Formatting ์›์น™๊ณผ ์ˆ˜ํ‰์  Formatting ์›์น™์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

๐Ÿ’ก ์ˆ˜์ง์ (Vertical) Formatting
์ฝ”๋“œ์˜ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ง„ํ–‰๋˜๋Š” ํ๋ฆ„๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ทœ์น™
์ฝ”๋“œ ๋ผ์ธ๊ฐ„์˜ ๊ฐ„๊ฒฉ, ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ์ฝ”๋“œ ๊ฐ„ ๊ทธ๋ฃนํ™” ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค

๐Ÿ’ก ์ˆ˜ํ‰์ (Horizontal) Formatting
ํ•˜๋‚˜์˜ ์ฝ”๋“œ ํ–‰์—์„œ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ํ๋ฆ„๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ทœ์น™
๋“ค์—ฌ์“ฐ๊ธฐ, ์ฝ”๋“œ ๊ฐ„ ๊ฐ„๊ฒฉ, ์ฝ”๋“œ ํ–‰์˜ ๋„“์ด ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.

 

5 . Clean Control Structure

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

์ด์™€ ๊ฐ™์€ ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ๋กœ Cyclomatic Complexity๊ฐ€ ์žˆ๋‹ค. ๋ณต์žก๋„๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ํ”„๋กœ๊ทธ๋žจ์ด ๊ตฌ์กฐ์ ์œผ๋กœ ์•ˆ์ •๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ๋ณต์žก๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ํ”„๋กœ๊ทธ๋žจ์ด ๋น„ ๊ตฌ์กฐ์ ์ด๋ฉฐ ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ node, edge๋กœ ํ‘œํ˜„ํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

 

๊ณ„์‚ฐ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

๐Ÿ’ก ๊ณ„์‚ฐ๋ฐฉ๋ฒ• 1
๋ณต์žก๋„ V(G) = edge์˜ ์ˆ˜ - node์˜ ์ˆ˜ + 2

๐Ÿ’ก ๊ณ„์‚ฐ๋ฐฉ๋ฒ• 2
๋ณต์žก๋„ V(G) = ๋ถ„๊ธฐ๋ฌธ์˜ ์ˆ˜ + 1

 

๐Ÿ“Œ์ฝ”๋“œํ”„๋ ˆ์†Œ Java ์›น ๊ฐœ๋ฐœ ์ฒดํ—˜๋‹จ ํ™œ๋™์œผ๋กœ ์ œ๊ณต๋ฐ›์€ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ์ฝ”๋“œํ”„๋ ˆ์†Œ์—์„œ "SW ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•œ Clean Code" ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ์ฝ”๋“œํ”„๋ ˆ์†Œ ๋ฐ”๋กœ๊ฐ€๊ธฐ ๋งํฌ : https://www.codepresso.kr/ 

๋Œ“๊ธ€