Выявление недостатков в проектировании класса View

В fallback используется неопределённое data вместо n. Кроме того, форматирование и HTML-рендеринг смешаны, а label вставляется без экранирования. Можно внедрить форматтер и отдельно формировать безопасный HTML.

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

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

В fallback используется неопределённое data вместо n. Кроме того, форматирование и HTML-рендеринг смешаны, а label вставляется без экранирования. Можно внедрить форматтер и отдельно формировать безопасный HTML.

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

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

Условие

Определите слабые места в архитектуре класса View и предложите варианты их исправления или оптимизации. Код класса отвечает за форматирование значений с учётом указанных единиц измерения и формирует HTML‑строку.

class View:
    def __init__(self, units):
        self.units = units

    def render(self, data):
        label = self.format(data)
        return f"<p>{label}</p>"

    def format(self, n) -> str:
        if self.units == "$":
            return '${:.2f}'.format(n)
        if self.units == "%":
            return '{:.0f}%'.format(n * 100)
        return str(data)

Обратите внимание на потенциальные нарушения принципов SOLID, отсутствие обработки ошибок, жёстко закодированные условия и использование глобального состояния. Предложите, как можно улучшить гибкость, тестируемость и расширяемость компонента.

Ответ

В fallback используется неопределённое data вместо n. Кроме того, форматирование и HTML-рендеринг смешаны, а label вставляется без экранирования. Можно внедрить форматтер и отдельно формировать безопасный HTML.

Минимальная композиция:

from html import escape

class View:
    def __init__(self, formatter=str):
        self.formatter = formatter

    def render(self, data):
        label = self.formatter(data)
        return f'<p>{escape(str(label))}</p>'

money_view = View(lambda value: f'${value:.2f}')
percent_view = View(lambda value: f'{value * 100:.0f}%')

Теперь форматтер можно тестировать и заменять отдельно. Не следует объявлять все принципы SOLID нарушенными только из-за if: главное — реальные причины изменения и границы ответственности. Для денежных сумм обычно используют Decimal и определяют правила округления.

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

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

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

Подробнее