Что такое принцип DRY (Don’t Repeat Yourself)?

«Что такое принцип DRY (Don’t Repeat Yourself)?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DRY (Don't Repeat Yourself — «Не повторяйся») — это фундаментальный принцип разработки ПО, который гласит: «Каждое знание должно иметь единственное, непротиворечивое и авторитетное представление в системе».

На практике это означает устранение дублирования логики, а не просто текста кода. Два фрагмента кода считаются дублированием, если изменение одного из них по логической необходимости требует изменения другого.

Пример нарушения DRY:

public class OrderProcessor
{
    public void Process(Order order)
    {
        // Дублирующаяся проверка и логирование
        if (order.Items.Count == 0)
        {
            Logger.Log("Заказ пуст. Обработка отменена.");
            return;
        }
        // Логика обработки...
    }

    public void Cancel(Order order)
    {
        // Та же самая проверка и логирование снова
        if (order.Items.Count == 0)
        {
            Logger.Log("Заказ пуст. Отмена невозможна.");
            return;
        }
        // Логика отмены...
    }
}

Исправленный вариант (следование DRY):

public class OrderValidator
{
    // Знание о валидации непустого заказа представлено в одном месте.
    public static bool ValidateNotEmpty(Order order, string operationName)
    {
        if (order.Items.Count == 0)
        {
            Logger.Log($"Заказ пуст. Операция '{operationName}' отменена.");
            return false;
        }
        return true;
    }
}

public class OrderProcessor
{
    public void Process(Order order)
    {
        if (!OrderValidator.ValidateNotEmpty(order, nameof(Process))) return;
        // Логика обработки...
    }

    public void Cancel(Order order)
    {
        if (!OrderValidator.ValidateNotEmpty(order, nameof(Cancel))) return;
        // Логика отмены...
    }
}

Преимущества следования DRY:

  • Снижение количества ошибок: Исправление или улучшение логики требуется только в одном месте.
  • Упрощение поддержки: Код становится легче читать и изменять.
  • Повышение согласованности: Поведение системы становится предсказуемым, так как одинаковая логика не разбросана по кодовой базе.

Важное уточнение: Не стоит абсолютизировать DRY на ранних этапах. Преждевременное абстрагирование дублирующегося кода, когда его назначение ещё не до конца ясно, может привести к созданию неправильных, жёстко связанных абстракций. Иногда лучше допустить контролируемое дублирование, чем создать плохую абстракцию.