728x90

코드를 작성하다 보면 자연스럽게 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)
728x90

'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

+ Recent posts