πŸ’» Programming/기타

[클린 μ½”λ“œ Clean Code] 1μž₯ κΉ¨λ—ν•œ μ½”λ“œ

Jiwon() 2024. 1. 14. 23:40

 

Clean Code 클린 μ½”λ“œ μ• μžμΌ μ†Œν”„νŠΈμ›¨μ–΄ μž₯인 μ •μ‹ 

- Robert C. Martin


0μž₯ λ“€μ–΄κ°€λ©΄μ„œ

κΉ¨λ—ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 방법은 배우기 μ–΄λ ΅λ‹€

λ‹¨μˆœνžˆ 원칙과 νŒ¨ν„΄μ„ μ•ˆλ‹€κ³  κΉ¨λ—ν•œ μ½”λ“œκ°€ λ‚˜μ˜€μ§€ μ•ŠλŠ”λ‹€. μž˜ κ·Έλ¦° κ·Έλ¦Όκ³Ό 그렇지 μ•Šμ€ 그림을 ꡬ뢄할 쀄 μ•ˆλ‹€κ³  ν•΄μ„œ 그림을 잘 그릴 수 μžˆλŠ” 게 μ•„λ‹ˆλ“―μ΄

슀슀둜 μ—°μŠ΅ν•˜κ³  μ‹€νŒ¨λ„ 해보며 고생을 ν•΄μ•Ό ν•œλ‹€.

 

 

 


1μž₯ κΉ¨λ—ν•œ μ½”λ“œ

μ½”λ“œκ°€ μ‘΄μž¬ν•˜λ¦¬λΌ

μ½”λ“œλŠ” 더 이상 λ¬Έμ œκ°€ μ•„λ‹ˆκ³ , λͺ¨λΈμ΄λ‚˜ μš”κ΅¬μ‚¬ν•­μ— 집쀑해야 ν•œλ‹€κ³  μƒκ°ν•˜λŠ” μ‚¬λžŒλ„ μžˆμ„ 것이닀. μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” μ‹œλŒ€κ°€ λ‹€κ°€μ˜€λ©΄ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” ν•„μš”κ°€ μ—†κ²Œ 될 것이닀. μ±—GPT?

μ½”λ“œκ°€ μ‚¬λΌμ§ˆ 가망은 μ „ν˜€ μ—†λ‹€. μ™œ? μ½”λ“œλŠ” μš”κ΅¬μ‚¬ν•­μ„ μƒμ„Ένžˆ ν‘œν˜„ν•˜λŠ” μˆ˜λ‹¨μ΄κΈ° λ•Œλ¬Έ

기계가 μ‹€ν–‰ν•  μ •λ„λ‘œ μƒμ„Έν•˜κ²Œ μš”κ΅¬μ‚¬ν•­μ„ λͺ…μ‹œν•˜λŠ” μž‘μ—…μ΄ ν”„λ‘œκ·Έλž˜λ°μ΄κ³ , λͺ…μ‹œν•œ κ²°κ³Όκ°€ λ°”λ‘œ μ½”λ“œμ΄λ‹€.

ꢁ극적으둜 μ½”λ“œλŠ” μš”κ΅¬μ‚¬ν•­μ„ ν‘œν˜„ν•˜λŠ” 언어이닀. μ–΄λŠ μˆœκ°„μ—λŠ” μ •λ°€ν•œ ν‘œν˜„μ΄ μš”κ΅¬λ˜λ©°, κ·ΈλŸ¬λ―€λ‘œ μ½”λ“œλ„ 항상 μ‘΄μž¬ν•˜λ¦¬λΌ.

 

λ‚˜μœ μ½”λ“œ

λ‚˜μœ μ½”λ“œμ— 발λͺ©μž‘ν˜€ κ³ μƒν•œ 기얡은 μ‘°κΈˆμ΄λΌλ„ ν”„λ‘œκ·Έλž¨μ„ μ§œλ΄€λ‹€λ©΄ μˆ˜μ—†μ΄ κ²½ν—˜ν–ˆμ„ 것이닀.

우리 λͺ¨λ‘λŠ” μžμ‹ μ΄ μ§  μ“°λ ˆκΈ° μ½”λ“œλ₯Ό 보고 λ‚˜μ€‘μ— 손보겠닀고 μƒκ°ν•œ κ²½ν—˜λ„ μžˆμ„ 것이닀. μ•ˆ λŒμ•„κ°€λŠ” ν”„λ‘œκ·Έλž¨λ³΄λ‹€ λŒμ•„κ°€λŠ” μ“°λ ˆκΈ°κ°€ μ’‹λ‹€κ³  슀슀둜λ₯Ό μœ„λ‘œν•˜λ©΄μ„œ 말이닀. λ‹€μ‹œ λŒμ•„μ™€ λ‚˜μ€‘μ— μ •λ¦¬ν•˜κ² λ‹€κ³  λ‹€μ§ν–ˆμ—ˆλ‹€.

λ₯΄λΈ”λž‘μ˜ 법칙 (Leblance's Law)
Later equals never. λ‚˜μ€‘μ€ κ²°μ½” μ˜€μ§€ μ•ŠλŠ”λ‹€. ν•œλ²ˆ μž‘μ„±ν•œ μ“°λ ˆκΈ° μ½”λ“œλ₯Ό λ‚˜μ€‘μ— μˆ˜μ •ν•˜λŠ” 일은 κ²°μ½” μ—†λ‹€.

 

λ‚˜μœ μ½”λ“œλ‘œ 치λ₯΄λŠ” λŒ€κ°€

λ‚˜μœ μ½”λ“œλŠ” 개발 속도λ₯Ό 크게 λ–¨μ–΄λœ¨λ¦°λ‹€.

μ½”λ“œλ₯Ό κ³ μΉ  λ•Œλ§ˆλ‹€ μ—‰λš±ν•œ κ³³μ—μ„œ λ¬Έμ œκ°€ 생기고, μ‹œκ°„μ΄ μ§€λ‚ μˆ˜λ‘ μ“°λ ˆκΈ° λ”λ―ΈλŠ” 점점 높아지고 κΉŠμ–΄μ§€κ³  컀진닀.

 

λ‚˜μœ μ½”λ“œκ°€ μŒ“μΌμˆ˜λ‘ νŒ€ 생산성은 떨어진닀.

생산성이 떨어지면 관리측은 생산성 μ¦λŒ€μ— λŒ€ν•œ 희망을 ν’ˆκ³  ν”„λ‘œμ νŠΈμ— 인λ ₯을 μΆ”κ°€λ‘œ νˆ¬μž…ν•œλ‹€.

브룩슀의 법칙 (Brooks' law)
ν”„λ ˆλ”λ¦­ λΈŒλ£©μŠ€κ°€ μžμ‹ μ˜ 1975λ…„ μ €μ„œ γ€Šλ§¨λ¨ΌμŠ€ 미신》 (The Mythical Man-Month)μ—μ„œ "μ§€μ²΄λ˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 ν”„λ‘œμ νŠΈμ— 인λ ₯을 λ”ν•˜λŠ” 것은 κ°œλ°œμ„ 늦좜 뿐이닀"라고 μ£Όμž₯ν•œ 법칙이닀.

μƒˆ 인λ ₯은 μ‹œμŠ€ν…œ 섀계에 λŒ€ν•œ μ‘°μ˜ˆκ°€ κΉŠμ§€ μ•Šκ³ , 섀계 μ˜λ„μ— λ§žλŠ” λ³€κ²½κ³Ό 섀계 μ˜λ„μ— λ°˜ν•˜λŠ” 변경을 κ΅¬λΆ„ν•˜μ§€ λͺ»ν•œλ‹€. κ²°κ³Όμ μœΌλ‘œλŠ” λ‚˜μœ μ½”λ“œλ₯Ό 더 많이 μ–‘μ‚°ν•œλ‹€. κ·Έ 덕뢄에 생산성은 λ”λ”μš± λ–¨μ–΄μ Έ 거의 0이 λœλ‹€.

μ›λŒ€ν•œ μž¬μ„€κ³„μ˜ 꿈

기쑴의 혐였슀러운 μ½”λ“œλ‘œλŠ” 더 이상 μΌν•˜μ§€ λͺ»ν•˜κ² λ‹€λ©° 관리측에 μž¬μ„€κ³„λ₯Ό μš”κ΅¬ν•œλ‹€.

μƒˆλ‘œμš΄ 타이거 νŒ€μ΄ κ΅¬μ„±λ˜μ–΄ κΈ°μ‘΄ μ‹œμŠ€ν…œ κΈ°λŠ₯을 λͺ¨λ‘ μ œκ³΅ν•˜λ©°, μœ μ§€λ³΄μˆ˜ 되고 μžˆλŠ” κΈ°μ‘΄ μ‹œμŠ€ν…œμ— κ°€ν•΄μ§€λŠ” 변경도 λͺ¨λ‘ λ”°λΌμž‘μ•„μ•Ό ν•œλ‹€.

μ΄λŸ¬ν•œ μž¬μ„€κ³„ 과정은 μ•„μ£Ό μ˜€λž«λ™μ•ˆ 이어지며, μƒˆ μ‹œμŠ€ν…œμ΄ κΈ°μ‘΄ μ‹œμŠ€ν…œμ„ λ”°λΌμž‘μ„ 쯀이면 초창기 타이거 νŒ€μ›λ“€μ€ λͺ¨λ‘ 떠났고 μƒˆλ‘œμš΄ νŒ€μ›λ“€μ΄ μƒˆ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜μžκ³  μ£Όμž₯ν•œλ‹€.

μž¬μ„€κ³„λŠ” 근본적인 ν•΄κ²° 방법이 λ˜μ§€ λͺ»ν•œλ‹€.

 

νƒœλ„

λ‚˜μœ μ½”λ“œμ˜ μœ„ν—˜μ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λŠ” κ΄€λ¦¬μž 말을 κ·ΈλŒ€λ‘œ λ”°λ₯΄λŠ” 행동은 전문가닡지 λͺ»ν•œ νƒœλ„μ΄λ‹€.

 

μ›μ΄ˆμ  λ‚œμ œ

κΈ°ν•œμ„ λ§žμΆ”κΈ° μœ„ν•΄ ν”„λ‘œκ·Έλž¨μ„ 빨리 μ™„μ„±ν•˜λ‹€ 보면 λ‚˜μœ μ½”λ“œλ₯Ό μ–‘μ‚°ν•  μˆ˜λ°–μ— μ—†λ‹€. ν•˜μ§€λ§Œ 였히렀 엉망진창인 μƒνƒœλ‘œ 인해 속도가 λŠ¦μ–΄μ§€κ³ , κ²°κ΅­ κΈ°ν•œμ„ λ†“μΉœλ‹€.

κΈ°ν•œμ„ λ§žμΆ”λŠ” μœ μΌν•œ 방법, λ‹€μ‹œ 말해 빨리 κ°€λŠ” μœ μΌν•œ 방법은 μ–Έμ œλ‚˜ μ½”λ“œλ₯Ό κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•˜λŠ” μŠ΅κ΄€μ΄λ‹€.

 

κΉ¨λ—ν•œ μ½”λ“œλΌλŠ” 예술?

잘 κ·Έλ¦° 그림을 κ΅¬λΆ„ν•˜λŠ” λŠ₯λ ₯이 그림을 잘 κ·Έλ¦¬λŠ” λŠ₯λ ₯은 μ•„λ‹Œ κ²ƒμ²˜λŸΌ, κΉ¨λ—ν•œ μ½”λ“œμ™€ λ‚˜μœ μ½”λ“œλ₯Ό ꡬ뢄할 쀄 μ•ˆλ‹€κ³  κΉ¨λ—ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  쀄 μ•ˆλ‹€λŠ” λœ»μ€ μ•„λ‹ˆλ‹€.

 

κΉ¨λ—ν•œ μ½”λ“œλž€?

  • κΉ¨λ—ν•œ μ½”λ“œλŠ” λ³΄κΈ°μ— 즐거운 μ½”λ“œλ‹€.
    • 효율적인 μ½”λ“œ : λ‹¨μˆœνžˆ μ†λ„λ§Œμ„ μ˜λ―Έν•˜λŠ” 것이 μ•„λ‹Œ, CPU μžμ›κΉŒμ§€ κ³ λ €ν•œ μ½”λ“œ
  • μ² μ €ν•œ 였λ₯˜ 처리 - μ„Έμ„Έν•œ μ‚¬ν•­κΉŒμ§€ κΌΌκΌΌν•˜κ²Œ 신경써야 ν•œλ‹€.
    • λ©”λͺ¨λ¦¬ λˆ„μˆ˜, 경쟁 μƒνƒœ(race condition), 일관성 μ—†λŠ” λͺ…λͺ…법
경쟁 μƒνƒœ (Race condition)
μ„€λͺ…곡학 λΆ„μ•Όμ—μ„œ 경쟁 μƒνƒœλž€ λ‘˜ μ΄μƒμ˜ μž…λ ₯ λ˜λŠ” μ‘°μž‘μ˜ νƒ€μ΄λ°μ΄λ‚˜ μˆœμ„œ 등이 결괏값에 영ν–₯을 쀄 수 μžˆλŠ” μƒνƒœλ₯Ό λ§ν•œλ‹€. μž…λ ₯ λ³€ν™”μ˜ νƒ€μ΄λ°μ΄λ‚˜ μˆœμ„œκ°€ μ˜ˆμƒκ³Ό λ‹€λ₯΄κ²Œ μž‘λ™ν•˜λ©΄ 정상적인 κ²°κ³Όκ°€ λ‚˜μ˜€μ§€ μ•Šκ²Œ 될 μœ„ν—˜μ΄ μžˆλŠ”λ° 이λ₯Ό 경쟁 μœ„ν—˜μ΄λΌκ³  ν•œλ‹€.
  • κΉ¨λ—ν•œ μ½”λ“œλŠ” ν•œ 가지에 '집쀑'ν•œλ‹€.
    • λ‚˜μœ μ½”λ“œλŠ” λ„ˆλ¬΄ λ§Žμ€ 일을 ν•˜λ € μ• μ“°λ‹€κ°€ μ˜λ„κ°€ λ’€μ„žμ΄κ³  λͺ©μ μ΄ 흐렀진닀.
    • 각 ν•¨μˆ˜μ™€ ν΄λž˜μŠ€μ™€ λͺ¨λ“ˆμ€ μ£Όλ³€ 상황에 ν˜„ν˜Ήλ˜κ±°λ‚˜ μ˜€μ—Όλ˜μ§€ μ•Šμ€ 채 ν•œκΈΈλ§Œ κ±·λŠ”λ‹€.
  • κΉ¨λ—ν•œ μ½”λ“œλŠ” 잘 μ“΄ λ¬Έμž₯처럼 μ½νžŒλ‹€. (가독성)
    • λ‹¨μˆœν•˜κ³  μ§μ ‘μ μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
    • μ„€κ³„μžμ˜ μ˜λ„λ₯Ό μˆ¨κΈ°μ§€ μ•Šκ³ , 였히렀 λͺ…μΎŒν•œ 좔상화와 λ‹¨μˆœν•œ μ œμ–΄λ¬ΈμœΌλ‘œ κ°€λ“ν•˜λ‹€.
  • κΉ¨λ—ν•œ μ½”λ“œλŠ” μž‘μ„±μžκ°€ μ•„λ‹Œ μ‚¬λžŒλ„ 읽기 쉽고 고치기 쉽닀.
    • 읽기 μ‰¬μš΄ μ½”λ“œμ™€ 고치기 μ‰¬μš΄ μ½”λ“œλŠ” μ—„μ—°νžˆ λ‹€λ₯΄λ‹€.
    • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ—†λŠ” μ½”λ“œλŠ” κΉ¨λ—ν•œ μ½”λ“œκ°€ μ•„λ‹ˆλ‹€.
    • 'μ΅œμ†Œ'의 μ˜μ‘΄μ„±, 'μ΅œμ†Œ'의 API : μž‘μ„μˆ˜λ‘ μ’‹λ‹€.
  • κΉ¨λ—ν•œ μ½”λ“œλŠ” 주의 깊게 μž‘μ„±ν•œ μ½”λ“œλ‹€.
    • λˆ„κ΅°κ°€ μ‹œκ°„μ„ λ“€μ—¬ κΉ”λ”ν•˜κ³  λ‹¨μ •ν•˜κ²Œ μ •λ¦¬ν•œ μ½”λ“œλ‹€. μ„Έμ„Έν•œ μ‚¬ν•­κΉŒμ§€ κΌΌκΌΌν•˜κ²Œ μ‹ κ²½μ“°κ³  주의λ₯Ό 기울인 μ½”λ“œλ‹€.
  • 쀑볡 쀄이기, ν‘œν˜„λ ₯ 높이기, μ΄ˆλ°˜λΆ€ν„° κ°„λ‹¨ν•œ 좔상화 κ³ λ €ν•˜κΈ°
  • μ½μœΌλ©΄μ„œ μ§μž‘ν•œ λŒ€λ‘œ λŒμ•„κ°€λŠ” μ½”λ“œκ°€ κΉ¨λ—ν•œ μ½”λ“œλ‹€.

 

μš°λ¦¬λŠ” μ €μžλ‹€

μ €μžμ™€ λ…μžμ˜ κ΄€κ³„μ²˜λŸΌ μ½”λ“œλ₯Ό μ§  μ‚¬λžŒμ€ μ½”λ“œλ₯Ό μ½λŠ” μ‚¬λžŒμ— λŒ€ν•΄ μ±…μž„μ΄ μžˆλ‹€.

μƒˆ μ½”λ“œλ₯Ό μ§œλ©΄μ„œ μš°λ¦¬λŠ” λŠμž„μ—†μ΄ κΈ°μ‘΄ μ½”λ“œλ₯Ό μ½λŠ”λ‹€. λ”°λΌμ„œ 읽기 μ‰¬μš΄ μ½”λ“œκ°€ 맀우 μ€‘μš”ν•˜λ‹€.

κΈ‰ν•˜λ‹€λ©΄, μ„œλ‘˜λŸ¬ 끝내렀면, μ‰½κ²Œ 짜렀면? μ½κΈ° μ‰½κ²Œ λ§Œλ“€λ©΄ λœλ‹€.

 

보이슀카우트 κ·œμΉ™

μΊ ν”„μž₯은 처음 왔을 λ•Œλ³΄λ‹€ 더 κΉ¨λ—ν•˜κ²Œ 해놓고 λ– λ‚˜λΌ.

잘 μ§  μ½”λ“œκ°€ μ „λΆ€λŠ” μ•„λ‹ˆλ‹€. μ‹œκ°„μ΄ μ§€λ‚˜λ„ μ–Έμ œλ‚˜ κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•΄μ•Ό ν•œλ‹€. 지속적인 κ°œμ„ μ΄μ•Όλ§λ‘œ μ „λ¬Έκ°€ μ •μ‹ μ˜ 본질이 μ•„λ‹ˆλ˜κ°€?

 

프리퀄과 원칙

객체 지ν–₯ μ„€κ³„μ˜ λ‹€μ„― 가지 원칙

  1. SRP(The Single Responsibility Principle): ν΄λž˜μŠ€μ—λŠ” 단 ν•œ 가지, 단 ν•œ 가지 λ³€κ²½ 이유만 μ‘΄μž¬ν•΄μ•Ό ν•œλ‹€.
  2. OCP(The Open Clused Principle): ν΄λž˜μŠ€λŠ” ν™•μž₯에 μ—΄λ € μžˆμ–΄μ•Ό ν•˜λ©° 변경에 λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€.
  3. LSP(The Liskov Substitution Principle): 상속받은 ν΄λž˜μŠ€λŠ” 기초 클래슀λ₯Ό λŒ€μ²΄ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
  4. DIP(The Dependency Inversion Principle): 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•˜λ©°, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆ λœλ‹€.
  5. ISP(The Interface Segregation Principle): ν΄λΌμ΄μ–ΈνŠΈμ— λ°€μ ‘ν•˜κ²Œ μž‘κ²Œ μͺΌκ°œμ§„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μœ μ§€ν•œλ‹€.

 

 


λŠλ‚€ 점

νŒ€ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ λ‹€λ₯Έ νŒ€μ›λ“€μ˜ μ½”λ“œλ₯Ό 읽닀 보면 λ¬Ό 흐λ₯΄λ“― μ½νžˆλŠ” μ½”λ“œκ°€ μžˆλŠ” 반면, 아무리 읽어도 이해가지 μ•ŠλŠ” μ½”λ“œλ“€λ„ 많이 λ§ˆμ£Όν–ˆμ—ˆλ‹€. μ•„λ§ˆ λ‚΄ μ½”λ“œλ„ λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ 봀을 λ•Œ μˆ˜μ—†μ΄ κ·Έλž¬μ„ 것이닀. λˆ„κ°€ 봐도 μ§κ΄€μ μœΌλ‘œ 이해할 수 μžˆλŠ” μ½”λ“œλ₯Ό 짜고 μ‹Άμ–΄μ„œ 이 책을 읽기 μ‹œμž‘ν–ˆλ‹€.

 

μ €μžκ°€ λ§ν–ˆλ“― λ‹¨μˆœνžˆ 이 책을 μ™„λ…ν•œλ‹€κ³ ν•΄μ„œ λ°”λ‘œ κΉ¨λ—ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  μˆ˜λŠ” 없을 것이닀. ν•˜μ§€λ§Œ 이 책을 κ³„μ†ν•΄μ„œ λ°˜λ³΅ν•˜λ©° μ²΄ν™”ν•˜κ³ , 또 이 μ±…μ˜ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μ„ λ°°, λ™λ£Œλ“€κ³Ό μ½”λ“œ 리뷰λ₯Ό ν•˜κ³  μ˜κ²¬μ„ λ‚˜λˆ„λ‹€ 보면 μ–Έμ  κ°€λŠ” μ•„λ¦„λ‹€μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ§€ μ•Šμ„κΉŒ?