Определение нарушений принципов SOLID в представленном фрагменте кода

Явно нарушен SRP: Invoice смешивает данные счёта, PDF, запросы БД и аналитику. Есть зависимость от глобальных конкретных сервисов, а также ошибки среднего значения и форматирования строки.

Короткий ответ

Что ответить на собеседовании

Явно нарушен SRP: Invoice смешивает данные счёта, PDF, запросы БД и аналитику. Есть зависимость от глобальных конкретных сервисов, а также ошибки среднего значения и форматирования строки.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какие из принципов SOLID не соблюдены в следующем примере кода:


class Invoice:
    def __init__(self, order_id, amount):
        self.order_id = order_id
        self.amount = amount
        self.filename = f'invoice_{order_id}.pdf'  # Имя файла инвойса
        self.data = self.generate_invoice_data()  # Генерация содержимого инвойса в формате PDF
        self.pdf_data = generate_invoice_pdf(self.data)  # Генерация содержимого инвойса в формате PDF

    def calculate_average_price_for_all_years(self):
        all_orders = db.session.query(Order).all()
        average = 0
        n = 0
        for order in all_orders:
            order_price = order.order_details['price']
            n += 1
            average = (average + order_price) / n
        return average

    def generate_account_report(self, order):
        average_price_for_all_orders = self.calculate_average_price_for_all_years()
        return f"Текущая цена заказа: {order.order_details['price']}. " \
               f"Средняя цена всех заказов за все время: {average_price_for_all_orders}"

    def generate_invoice_data(self):
        return "<h3>Инвойс для заказа №</h3><p>Сумма к оплате: {}".format(self.order_id, self.amount)

Ответ

Явно нарушен SRP: Invoice смешивает данные счёта, PDF, запросы БД и аналитику. Есть зависимость от глобальных конкретных сервисов, а также ошибки среднего значения и форматирования строки.

Разделите модель счёта, получение статистики и PDF-рендерер; зависимости передавайте извне. Это уменьшит связанность и облегчит тестирование. Нарушения LSP и ISP по этому фрагменту доказать нельзя.

Формула (average + order_price) / n неверна после второй итерации. Правильно average += (price - average) / n либо SUM/COUNT, лучше агрегировать в БД. Для пустого набора определите результат отдельно. В generate_invoice_data один placeholder получает order_id, а amount игнорируется: нужны два места подстановки. Тяжёлую генерацию PDF стоит убрать из конструктора; текстовые данные при HTML-рендеринге экранировать.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее