전략: 계산 방법을 갈아 끼우기
배송비 계산 방법은 일반 배송과 빠른 배송으로 나뉩니다. 주문 처리 코드 곳곳에 배송 종류를 구분하는 조건문을 반복하면, 새 방식이 생길 때 여러 곳을 고쳐야 합니다. 전략 패턴은 교체할 알고리즘을 분리합니다.
Python에서는 함수도 전략이 됩니다
def standard(weight):
return 3000 if weight <= 2 else 5000
def express(weight):
return standard(weight) + 4000
class ShippingQuote:
def __init__(self, calculate):
self.calculate = calculate
def fee(self, weight):
return self.calculate(weight)
print(ShippingQuote(standard).fee(1))
print(ShippingQuote(express).fee(1))
출력은 3000, 7000입니다. ShippingQuote는 무게를 전달하고 결과를 받는 역할만 합니다. 함수도 값으로 전달할 수 있으므로 계산마다 클래스를 만들 필요는 없습니다. 내부 설정과 상태가 많다면 객체로 만들 수도 있습니다.
전략은 같은 입력과 결과의 약속을 지켜야 합니다. 어떤 전략은 원 단위를, 다른 전략은 달러 단위를 반환하면 호출하는 쪽이 안전하게 교체할 수 없습니다.
어디까지 분리할까
전략 선택을 위한 조건문 자체가 완전히 없어지는 것은 아닙니다. 화면 입력이나 설정을 바탕으로 어느 함수를 넣을지 정하는 곳은 남습니다. 핵심은 선택 로직과 실제 계산 로직이 여러 곳에 뒤섞이지 않도록 하는 것입니다.
확인 문제
배송 방식이 하나뿐이고 바뀔 가능성도 낮습니다. 처음부터 전략 클래스 여러 개를 만드는 것이 좋을까요?
해설 보기
작은 함수 하나로 충분할 수 있습니다. 실제로 다른 계산을 교체해야 하거나 테스트에서 분리할 필요가 생겼을 때 패턴을 도입해도 됩니다. 늘어난 구조를 이해하는 비용도 고려합니다.