코드 스멜(Code Smell)은 Martin Fowler가 정의한 개념으로, 코드에서 더 깊은 문제를 암시하는 표면적 징후다. 버그는 아니지만 설계 문제나 유지보수 어려움의 신호이며, 리팩토링이 필요함을 나타낸다.
주요 코드 스멜 유형
1. Long Method (긴 메서드)
python
# 나쁜 예: 한 메서드가 너무 많은 일을
def process_order(order):
# 유효성 검사 (20줄)
# 가격 계산 (30줄)
# 재고 확인 (15줄)
# 결제 처리 (25줄)
# 이메일 발송 (10줄)
pass
# 좋은 예: 메서드 추출
def process_order(order):
validate_order(order)
price = calculate_price(order)
check_inventory(order)
charge_payment(order, price)
send_confirmation(order)
2. Duplicate Code (중복 코드)
python
# 나쁜 예
def send_email_to_admin(msg): setup_smtp(); login_smtp(); send(msg); close_smtp()
def send_email_to_user(msg): setup_smtp(); login_smtp(); send(msg); close_smtp()
# 좋은 예
def send_email(msg, recipient):
with smtp_connection() as conn:
conn.send(msg, recipient)
3. Large Class / God Object
하나의 클래스가 너무 많은 책임을 진다. → 클래스 추출(Extract Class)로 해결
4. Feature Envy
메서드가 자신이 속한 클래스보다 다른 클래스를 더 많이 사용한다.
5. Primitive Obsession
python
# 나쁜 예
def create_user(name: str, phone: str, zip_code: str): ...
# 좋은 예
def create_user(name: str, phone: PhoneNumber, address: Address): ...
주요 리팩토링 기법
| 코드 스멜 | 리팩토링 기법 |
|---|
| 긴 메서드 | Extract Method |
| 중복 코드 | Extract Method / Template Method |
| Large Class | Extract Class |
| Feature Envy | Move Method |
| Magic Number | Replace Magic Number with Constant |
관련 개념