코드를 작성하다 보면 자연스럽게 if-else 구문을 많이 사용하게 됨
조건문을 통해 로직을 처리하는 것은 필수적이지만, 조건이 복잡해지고 여러 조건이 중첩되면서 코드가 읽기 어렵고 유지보수가 힘들어지는 경우가 많음
특히, 중첩된 if-else는 코드의 가독성을 떨어뜨리는 주요 원인 중 하나임
이 글에서는 중첩된 if-else 구문을 리팩토링하는 여러 가지 기법을 소개하고, 실제로 적용할 수 있는 예시를 통해 코드의 품질을 향상시키는 방법을 정리함
Early Return 패턴
Early Return 패턴은 함수의 실행 중 특정 조건을 만족하지 않으면 일찍 반환(return)하는 방식
Early Return 패턴을 활용하면 불필요한 중첩을 방지할 수 있음
# before
def process_data(data):
if data is not None:
if data.is_valid():
if data.has_permission():
return "Processing data"
else:
return "No permission"
else:
return "Invalid data"
else:
return "No data"
# after
def process_data(data):
if data is None:
return "No data"
if not data.is_valid():
return "Invalid data"
if not data.has_permission():
return "No permission"
return "Processing data"
Early Return을 사용하면 코드의 중첩을 줄여 가독성을 크게 향상시킬 수 있음
조건이 충족되지 않을 경우 빠르게 반환(Return)하면 이후 로직을 간결하게 처리할 수 있음
Guard Clauses 패턴
Guard Clauses는 특정 조건을 검사해 빠르게 반환하거나 예외를 던지는 패턴
이 방식은 Early Return과 유사하지만, 주로 예외 처리나 특정한 조건을 걸러내는 데 자주 사용됨
# before
def calculate_discount(price, user):
if price > 0:
if user.is_premium():
if user.has_discount_coupon():
return price * 0.7
return price
# after
def calculate_discount(price, user):
if price <= 0:
raise ValueError("Price must be greater than zero")
if not user.is_premium():
return price
if not user.has_discount_coupon():
return price
return price * 0.7
조건문을 함수로 분리
Early Return, Guard Clauses 패턴을 사용할 때 조건이 많은 경우
각 조건을 별도의 함수로 분리해 코드의 가독성과 재사용성을 높일 수 있음
# before
def validate_user(user):
if user.is_active:
if user.has_subscription:
if user.is_email_verified:
return True
return False
# after
def is_active_user(user):
return user.is_active
def has_valid_subscription(user):
return user.has_subscription
def is_email_verified(user):
return user.is_email_verified
def validate_user(user):
if not is_active_user(user):
return False
if not has_valid_subscription(user):
return False
if not is_email_verified(user):
return False
return True
데이터 구조를 활용해 조건 제거하기
때로는 복잡한 조건문을 데이터 구조를 사용해 간결하게 표현할 수도 있음
특히 다중 조건을 처리할 때 유용함
# before
def get_discount(user_type):
if user_type == "premium":
return 20
elif user_type == "standard":
return 10
elif user_type == "basic":
return 5
else:
return 0
# after
def get_discount(user_type):
discounts = {
"premium": 20,
"standard": 10,
"basic": 5,
}
return discounts.get(user_type, 0)
'Python' 카테고리의 다른 글
파이썬 클린코드 (0) | 2024.04.28 |
---|---|
파이썬 계약에 의한 디자인(Design by Contract, DbC) (1) | 2024.04.21 |
Python 정규 표현식 기초 (0) | 2024.04.13 |
Python 추상클래스 (0) | 2024.04.12 |
Python Singleton 패턴 (0) | 2024.04.12 |