Проведите рефакторинг кода системы обработки заказов, где высокоуровневый модуль OrderProcessor напрямую зависит от конкретных низкоуровневых классов (MySqlDatabase, SmtpMailSender). Введите абстракции (интерфейсы) для хранилища данных и уведомлений, перестройте OrderProcessor так, чтобы он зависел только от этих абстракций, а конкретные реализации передавайте через конструктор (dependency injection). Затем продемонстрируйте гибкость, подставив альтернативные реализации (например, PostgresDatabase, MockMailSender), не меняя код процессора. По желанию — напишите юнит-тест с моками.
# low-level modules
class MySqlDatabase:
def save_order(self, order_data: dict) -> None:
print(f"Сохранение заказа {order_data} в MySQL...")
class SmtpMailSender:
def send_confirmation(self, email: str, message: str) -> None:
print(f"Отправка email на {email} через SMTP: {message}")
# high-level module
class OrderProcessor:
def __init__(self):
self.db = MySqlDatabase()
self.mailer = SmtpMailSender()
def process_order(self, order: dict) -> None:
# бизнес-логика обработки заказа
print(f"Обработка заказа {order['id']}...")
self.db.save_order(order)
self.mailer.send_confirmation(order['customer_email'], "Ваш заказ принят.")