Что такое принцип DRY
Что проверяют
Понимаете ли вы DRY как правило про знание, а не про похожие строки. Обычно принцип пересказывают как «не копируй код», и дальше человек склеивает в одну функцию всё, что внешне совпало. Интервьюеру интересно обратное: отличаете ли вы настоящий дубль от случайного совпадения и знаете ли цену неудачно вынесенной абстракции.
Как отвечать
Исходная формулировка строже привычной: каждый кусок знания должен иметь одно однозначное представление в системе. Знание это правило расчёта, схема данных, формат сообщения, а не буквы в файле. Два похожих блока, которые меняются по разным причинам, дублем не являются.
В Python средств для этого больше, чем «вынести функцию»:
from functools import wraps
def with_retry(times=3):
def deco(fn):
@wraps(fn)
def inner(*args, **kwargs):
for attempt in range(times):
try:
return fn(*args, **kwargs)
except TimeoutError:
if attempt == times - 1:
raise
return inner
return decoСюда же dataclass вместо руками написанных конструкторов, Enum вместо разбросанных строковых литералов, общие фикстуры pytest, модель pydantic как единственный источник правды о формате запроса.
Хорошо закончить границей применимости: дубль знания убираем сразу, дубль текста терпим до третьего повторения.
Где спотыкаются
Склеивают совпавший код из разных подсистем. Расчёт скидки и расчёт комиссии сегодня выглядят одинаково, завтра расходятся, и общая функция обрастает параметрами, которые нужны только одному вызывающему.
Считают, что DRY распространяется на тесты. Тест читают как отдельный документ, и вынесенная в хелпер подготовка данных прячет ровно то условие, ради которого тест написан.
Обобщают через флаги. Появляется функция с аргументами mode и is_admin, внутри которой две несвязанные ветки. Это то же дублирование, только теперь его нельзя удалить по частям.