테스트와 동일한 고객,쇼핑 카트가 주어졌을 때와 같이 테스트 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()를 제외한 모든 프로모션 할인 함수를 그 모듈에 넣어서, 적용할 수 있는 모든 할인 함수를 모으는 방법도 있다.