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

«Что считается «грязным кодом» в проекте?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Грязный код — это код с низкой читаемостью и сопровождаемостью, который нарушает принципы чистого кода (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;
    }
}