Что считается «грязным кодом» в проекте?

Ответ

Грязный код — это код с низкой читаемостью и сопровождаемостью, который нарушает принципы чистого кода (Clean Code) и проектирования. Я сталкивался с такими основными признаками:

  1. Неинформативные имена: $data, $tmp, function process(). Вместо этого я использую $userOrders, $cachedResponse, function calculateMonthlyRevenue().
  2. Дублирование (DRY-нарушение): Одна и та же логика валидации email в 5 разных местах. Я выношу это в отдельный метод или класс EmailValidator.
  3. Длинные методы и классы: Метод на 200 строк или класс, отвечающий за всё. Я стремлюсь к методам, которые помещаются на экран (~20-30 строк), и классам с одной ответственностью (SRP).
  4. Магические числа и строки:
    // Плохо (грязно)
    if ($user->status == 3) { ... }
    // Хорошо (чисто)
    class UserStatus {
        public const ACTIVE = 3;
    }
    if ($user->status == UserStatus::ACTIVE) { ... }
  5. Глубокие вложенности: Цепочки if внутри if внутри for. Я рефакторю это через ранний возврат (early return), вынос в отдельные методы или использование полиморфизма.
  6. Отсутствие типизации (в PHP): Использование массивов array вместо DTO или отсутствие объявлений типов для аргументов и возвращаемых значений. Я всегда включаю strict_types=1 и использую типизацию.

Пример рефакторинга:

// Было (грязно)
function f($a) {
    if ($a > 10) {
        $b = $a * 2;
        echo $b;
    } else {
        echo "no";
    }
}

// Стало (чисто)
class DiscountCalculator {
    private const THRESHOLD = 10;
    private const MULTIPLIER = 2;

    public function calculateAndOutput(int $price): void {
        if (!$this->isEligibleForDiscount($price)) {
            echo "No discount applied";
            return;
        }
        $discountedPrice = $this->applyDiscount($price);
        echo $discountedPrice;
    }

    private function isEligibleForDiscount(int $price): bool {
        return $price > self::THRESHOLD;
    }

    private function applyDiscount(int $price): int {
        return $price * self::MULTIPLIER;
    }
}

Ответ 18+ 🔞

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

Вот на что я обычно смотрю и сразу понимаю, что тут пиздец:

  1. Имена, от которых мозг вскипает. $data, $tmp, function process(). Ну серьёзно, чувак? Это как назвать собаку «Животное». Я стараюсь, чтобы имя само всё говорило: $userOrders, $cachedResponse, function calculateMonthlyRevenue(). Э, бошка, думай!

  2. Одно и то же по десять раз (нарушение DRY). Представь, логика проверки email размазана в пяти местах. Потом баг фиксишь в одном, а в остальных четырёх забываешь. Это же чистая манда с ушами. Выноси это в EmailValidator и спи спокойно.

  3. Методы-гиганты и классы-монстры. Метод на 200 строк — это уже не метод, а целая сага. Класс, который делает всё: от запросов к базе до отправки писем и рендеринга HTML. Это пидарас шерстяной, который нарушает принцип одной ответственности. Я стремлюсь к методам, которые на экране помещаются, и классам, которые знают своё место.

  4. Магические числа и строки — корень всех зол. Смотри:

    // Плохо (грязно, как сапог бомжа)
    if ($user->status == 3) { ... } // А что такое 3? Активный? Забаненный? В отпуске?
    // Хорошо (чисто и понятно)
    class UserStatus {
        public const ACTIVE = 3;
    }
    if ($user->status == UserStatus::ACTIVE) { ... } // А, всё, теперь ясно!

    Раньше я и сам так писал, а потом сам от себя охуел, когда через месяц пытался понять, что это за цифра 42 в середине формулы.

  5. Вложенности, как матрёшки. if внутри if внутри for внутри while. Глаза сломаешь, пока поймёшь, где чей else. Рецепт прост: ранний возврат (early return), вынос кусков в отдельные мелкие методы. Не усложняй, чувак.

  6. В PHP особенно грешат отсутствием типизации. Массивы array вместо нормальных объектов, никаких declare(strict_types=1). Это доверия ебать ноль к такому коду. Я теперь строго типизирую всё, что можно. Меньше сюрпризов, больше сна.

Смотри, как можно из говна конфетку сделать:

// Было (грязно, пиздопроебибна)
function f($a) {
    if ($a > 10) {
        $b = $a * 2;
        echo $b;
    } else {
        echo "no";
    }
}

// Стало (чисто, можно в рамочку)
class DiscountCalculator {
    private const THRESHOLD = 10; // Вон, магическое число стало константой
    private const MULTIPLIER = 2;

    public function calculateAndOutput(int $price): void { // Типы на месте!
        if (!$this->isEligibleForDiscount($price)) {
            echo "No discount applied";
            return; // Ранний возврат, никаких лишних else
        }
        $discountedPrice = $this->applyDiscount($price);
        echo $discountedPrice;
    }

    private function isEligibleForDiscount(int $price): bool {
        return $price > self::THRESHOLD;
    }

    private function applyDiscount(int $price): int {
        return $price * self::MULTIPLIER;
    }
}

В общем, суть в том, чтобы писать код не для компа, а для такого же чувака, как ты, который придёт сюда через полгода, возможно, с похмелья. И чтобы он не сказал «ёб твою мать», а кивнул с уважением.