Явно нарушен SRP: Invoice смешивает данные счёта, PDF, запросы БД и аналитику. Есть зависимость от глобальных конкретных сервисов, а также ошибки среднего значения и форматирования строки.
Определение нарушений принципов SOLID в представленном фрагменте кода
Явно нарушен 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-рендеринге экранировать.