Найти в Дзене
Код Мастерио

90% PHP-разработчиков неправильно понимают DRY! Проверь себя

Ты открываешь старый PHP-класс… И видишь 300 строк “универсального” кода. Код, который должен был избавить от дублирования - но теперь его боится трогать вся команда. Знакомо? И вот тут начинается самое интересное… Вот говорят: DRY (Don't Repeat Yourself) - не повторяйся. KISS (Keep It Simple, Stupid) - делай проще. Звучит как идеальный дуэт. Но есть одна проблема. Они часто конфликтуют. И если ты этого не видишь - твой код скорей всего уже страдает. Смотри сам. Ты видишь дублирование: function calculateUserDiscount($user) { return $user->isPremium() ? 0.2 : 0.1; } function calculateProductDiscount($product) { return $product->isOnSale() ? 0.2 : 0.1; } “Фу, дублирование!” - думаешь ты. И делаешь "красиво": function calculateDiscount($entity) { if ($entity instanceof User) { return $entity->isPremium() ? 0.2 : 0.1; } if ($entity instanceof Product) { return $entity->isOnSale() ? 0.2 : 0.1; } } На первый взгляд - идеально. Но нет ) Ты только что: И э
Оглавление

Ты открываешь старый PHP-класс… И видишь 300 строк “универсального” кода. Код, который должен был избавить от дублирования - но теперь его боится трогать вся команда.

Знакомо? И вот тут начинается самое интересное…

DRY и KISS: не союзники, а скрытые враги

Вот говорят: DRY (Don't Repeat Yourself) - не повторяйся. KISS (Keep It Simple, Stupid) - делай проще.

Звучит как идеальный дуэт. Но есть одна проблема.

Они часто конфликтуют.

И если ты этого не видишь - твой код скорей всего уже страдает.

Где DRY ломает проекты

Смотри сам. Ты видишь дублирование:

function calculateUserDiscount($user) {
return $user->isPremium() ? 0.2 : 0.1;
}
function calculateProductDiscount($product) {
return $product->isOnSale() ? 0.2 : 0.1;
}

“Фу, дублирование!” - думаешь ты. И делаешь "красиво":

function calculateDiscount($entity) {
if ($entity instanceof User) {
return $entity->isPremium() ? 0.2 : 0.1;
}
if ($entity instanceof Product) {
return $entity->isOnSale() ? 0.2 : 0.1;
}
}

На первый взгляд - идеально. Но нет )

Ты только что:

  • усложнил код
  • добавил зависимость от типов
  • увеличил риск багов

И это только начало.

KISS спасает там, где DRY ломает

А теперь тот же код - но через KISS:

function calculateUserDiscount($user) {
return $user->isPremium() ? 0.2 : 0.1;
}
function calculateProductDiscount($product) {
return $product->isOnSale() ? 0.2 : 0.1;
}

Да, есть повтор. Но код читается за 2 секунды.

И вот что важно:

Простота > абстракция (в 80% случаев)

Настоящее правило DRY (о котором молчат)

DRY - это не про код. Коротко. Очень коротко.

DRY - про знания.

Тут начинается магия.

Если ты дублируешь бизнес-логику - это плохо.

Если ты дублируешь синтаксис - это нормально.

И вот тут боль, любое изменение = риск сломать всё.

Как делать правильно (конкретные шаги)

Запомни простую схему:

1. Сначала KISS

Пиши максимально просто.

2. Потом ищи паттерны

Не абстрагируй заранее.

3. Абстрагируй только когда:

  • есть минимум 3 одинаковых кейса
  • логика реально совпадает
  • изменения происходят в одном месте

Пример “здорового” DRY

interface Discountable
{
public function getDiscount(): float;
}

class User implements Discountable
{
public function getDiscount(): float
{
return $this->isPremium() ? 0.2 : 0.1;
}
}

class Product implements Discountable
{
public function getDiscount(): float
{
return $this->isOnSale() ? 0.2 : 0.1;
}
}

Теперь:

function calculateDiscount(Discountable $entity) {
return $entity->getDiscount();
}

Вот это DRY без боли.

Ключевые итоги (для тех, кто читает по диагонали)

  • DRY ≠ убрать дублирование любой ценой
  • KISS почти всегда должен идти первым
  • Абстракции - это долг, а не улучшение
  • Читаемость важнее “красоты”
  • Лучше повторить код, чем усложнить систему

В начале был вопрос: почему “чистый” код становится нечитаемым?

Ответ простой.

Потому что разработчики оптимизируют код для себя, а не для будущего читателя.

А этот читатель… это ты через 3 месяца.

Хочешь писать код, который не будут проклинать?

Держи правило:

Сначала сделай просто. Потом - правильно. И только потом - красиво.

И если придется выбирать:

Выбирай KISS. DRY подождёт.