Что такое принцип DRY в разработке?

Ответ

DRY (Don’t Repeat Yourself) — принцип разработки программного обеспечения, направленный на минимизацию дублирования логики и знаний в системе. Каждая часть знания должна иметь единственное, однозначное и авторитетное представление в рамках системы.

Цель:

  • Упрощение поддержки и модификации кода.
  • Снижение вероятности ошибок из-за рассинхронизации копий.
  • Повышение читаемости и переиспользования кода.

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

// Дублирование формулы расчета площади круга
func calculateAreaForCircleA(radius: Double) -> Double {
    return Double.pi * radius * radius
}

func calculateAreaForCircleB(radius: Double) -> Double {
    return 3.14159 * radius * radius // Разная константа!
}

Пример соблюдения DRY:

// Знание о расчете площади инкапсулировано в одном месте
struct Circle {
    let radius: Double
    private static let pi = Double.pi

    func area() -> Double {
        return Circle.pi * radius * radius
    }
}

// Использование
let circle = Circle(radius: 5.0)
let area = circle.area()

Почему это важно? Если потребуется изменить формулу или константу, правка вносится только в одном месте — в методе area() структуры Circle.

Ответ 18+ 🔞

Да ты посмотри на эту дичь, блядь! Сидит программист, как мартышлюшка, и копирует один и тот же кусок кода туда-сюда, а потом охуевает, когда в одном месте поправил, а в другом забыл — и всё, пиздец, программа падает.

Вот смотри, есть такой принцип, DRY, что расшифровывается как «Don’t Repeat Yourself», или, по-нашему, «Не повторяйся, мудила». Смысл в чём? Каждая твоя мысль, каждый алгоритм, каждая формула — должны жить в одном-единственном святом месте. Один раз написал, один раз проверил, и везде используешь. А не как тот дебил, который площадь круга в десяти местах считает.

Зачем это, спросишь? Да чтобы не было вот этой пиздецовой рассинхронизации. Сегодня ты в одном файле константу pi поменял, а в другом — нихуя. И пошло-поехало: в одном модуле площадь правильная, а в другом — хуйня. Поддержка такого кода — это ебать мои старые костыли, терпения ноль ебать.

Вот тебе наглядный пиздец, то есть пример на Swift:

Смотри, как НЕ НАДО, блядь:

// Один чувак площадь считает так...
func calculateAreaForCircleA(radius: Double) -> Double {
    return Double.pi * radius * radius
}

// А другой, блядь, так! И константу другую впендюрил!
func calculateAreaForCircleB(radius: Double) -> Double {
    return 3.14159 * radius * radius // Разная константа, ёпта!
}

Представляешь? Один умник Double.pi использует, а другой — своё число вписал. И где правда? Пизда с ушами. Потом баг искать — волнение ебать.

А вот как надо, по-человечески:

// Всё, блядь, знание о круге и его площади — здесь. В одном месте. Авторитетно.
struct Circle {
    let radius: Double
    private static let pi = Double.pi // Константа — тут. Раз и нахуй.

    func area() -> Double {
        return Circle.pi * radius * radius
    }
}

// Используем, блядь!
let circle = Circle(radius: 5.0)
let area = circle.area()

Видишь разницу, чувак? Формула и константа теперь живут в одном месте — внутри структуры Circle. Захотел поменять точность pi или вообще способ расчёта? Пожалуйста, иди в один-единственный метод area() и там всё делай. Всё остальное само подтянется. Никакого дублирования, никакой путаницы. Красота, ёперный театр!

Вот и весь принцип. Не плоди сущностей, не копипасть, а выноси общую логику. А то будешь потом, как Герасим, с мешком по берегу метаться и орать «Муму!», когда всё уже накрылось медным тазом.