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