Загрузка данных


Проведите рефакторинг кода системы обработки заказов, где высокоуровневый модуль 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'], "Ваш заказ принят.")