전략 패턴의 리팩토링 (3)

매일 공부(ML)·2022년 12월 11일
0

Fluent Python

목록 보기
39/130

객체로서의 함수

일급 함수 디자인 패턴

전략 패턴의 리팩토링

최선의 전략 선택하기: 단순한 접근법

테스트와 동일한 고객,쇼핑 카트가 주어졌을 때와 같이 테스트 3개를 추가해보자

#모든 할인을 적용해서 가장 큰 값을 반환하는 best_promo()함수

Order(joe, long_order, best_promo)

Order(joe, bana_cart, best_promo)

Order(ann, cart, best_promo)
#함수 리스트를 반복해서 최대 할인액을 찾아내는 함수

promos = [fidelity_promo, bulk_item_promo, large_order_promo]

def best_promo(order):
	"""최대호 할인 받을 금액을 반환한다."""
    return max(promo(order) for promo in promos)

promos는 함수들의 리스트로, 가독성이 좋고 제대로 동작은 하지만 일부 코드가 중복이 되어 있으므로 버그가 생길 여지가 있고, 새로운 할인 전략을 추가하려면 함수를 코딩하고 이 함수를 promos 리스트에 추가해야 한다.

혹은 새로운 할인 함수를 Order 객체에 인수로 전달해서 작동시킬 수 있으나 best_promo()는 새로운 함수를 고려하지 않는다.


위와 같은 문제 해결: 모듈에서 전략찾기

파이썬 모듈도 일급 객체로, 모듈을 다루는 여러 함수가 표준 라이브러리에서 여러 함수가 제공

globals()
전역 심벌 테이블을 나타내는 딕셔너리 겍체를 반환하고, 이 딕셔너리는 언제나 현재 모듈에 대한 내용을 담고 있다.

#모듈 전역 네임스페이스를 내부 조사해서 만든 promos 리스트
#globals()에 약간 꼼수를 부려서 best_promo()가 자동으로 다른 *_promo()함수들을 찾아내게 한다.

promos = [globals()[name] for name in globals()
			if name.endswith('_promo')
            and name != 'best_promo']
            
def best_promo(order):
	"""최대로 할인 받을 금액을 반환한다."""
    return max(promo(order) for promo in promos)
   

별도의 모듈을 만들고 best_promo()를 제외한 모든 프로모션 할인 함수를 그 모듈에 넣어서, 적용할 수 있는 모든 할인 함수를 모으는 방법도 있다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글