1. DIP 적용 전
from typing import List
class KakaoPayHandler:
def handle_payment(self, total):
print(f"{total}")
PRICES = {
"burger": 10,
"pizza": 7,
"drink": 5,
}
def order_food(items: List[str]) -> None:
total = sum(PRICES[item] for item in items)
payment_handler = KakaoPayHandler()
payment_handler.handle_payment(total)
if __name__ == "__main__":
order_food(["burger", "pizza", "drink"])
2. DIP 적용 후
from typing import List
class KakaoPayHandler:
def handle_payment(self, total):
print(f"{total}")
PRICES = {
"burger": 10,
"pizza": 7,
"drink": 5,
}
def order_food(items: List[str], payment_handler: KakaoPayHandler) -> None:
total = sum(PRICES[item] for item in items)
payment_handler.handle_payment(total)
if __name__ == "__main__":
payment_handler = KakaoPayHandler()
order_food(["burger", "pizza", "drink"], payment_handler)
3. 효과
- order_food 모듈을 테스트하기 훨씬 쉽다
- order_food는 KakaoPayHander에 의존하게 됐다
- (실제 카카오페이와 결제를 처리하는 저수준 로직은 ) KakaoPayHander에 의존하고 있다.
- 따라서, 고수준 모듈과 저수준 모듈 모두 추상화에 의존하게 됐다.