Ответ
Грязный код — это код с низкой читаемостью и сопровождаемостью, который нарушает принципы чистого кода (Clean Code) и проектирования. Я сталкивался с такими основными признаками:
- Неинформативные имена:
$data,$tmp,function process(). Вместо этого я использую$userOrders,$cachedResponse,function calculateMonthlyRevenue(). - Дублирование (DRY-нарушение): Одна и та же логика валидации email в 5 разных местах. Я выношу это в отдельный метод или класс
EmailValidator. - Длинные методы и классы: Метод на 200 строк или класс, отвечающий за всё. Я стремлюсь к методам, которые помещаются на экран (~20-30 строк), и классам с одной ответственностью (SRP).
- Магические числа и строки:
// Плохо (грязно) if ($user->status == 3) { ... } // Хорошо (чисто) class UserStatus { public const ACTIVE = 3; } if ($user->status == UserStatus::ACTIVE) { ... } - Глубокие вложенности: Цепочки
ifвнутриifвнутриfor. Я рефакторю это через ранний возврат (early return), вынос в отдельные методы или использование полиморфизма. - Отсутствие типизации (в 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+ 🔞
А, ну это же классика, ёпта! Грязный код — это как зайти в квартиру после студенческой вечеринки: носки на люстре, пивные банки в цветочных горшках, а в унитазе плавает тапок. Сопровождать такое — это волнение ебать, терпения ноль ебать.
Вот на что я обычно смотрю и сразу понимаю, что тут пиздец:
-
Имена, от которых мозг вскипает.
$data,$tmp,function process(). Ну серьёзно, чувак? Это как назвать собаку «Животное». Я стараюсь, чтобы имя само всё говорило:$userOrders,$cachedResponse,function calculateMonthlyRevenue(). Э, бошка, думай! -
Одно и то же по десять раз (нарушение DRY). Представь, логика проверки email размазана в пяти местах. Потом баг фиксишь в одном, а в остальных четырёх забываешь. Это же чистая манда с ушами. Выноси это в
EmailValidatorи спи спокойно. -
Методы-гиганты и классы-монстры. Метод на 200 строк — это уже не метод, а целая сага. Класс, который делает всё: от запросов к базе до отправки писем и рендеринга HTML. Это пидарас шерстяной, который нарушает принцип одной ответственности. Я стремлюсь к методам, которые на экране помещаются, и классам, которые знают своё место.
-
Магические числа и строки — корень всех зол. Смотри:
// Плохо (грязно, как сапог бомжа) if ($user->status == 3) { ... } // А что такое 3? Активный? Забаненный? В отпуске? // Хорошо (чисто и понятно) class UserStatus { public const ACTIVE = 3; } if ($user->status == UserStatus::ACTIVE) { ... } // А, всё, теперь ясно!Раньше я и сам так писал, а потом сам от себя охуел, когда через месяц пытался понять, что это за цифра 42 в середине формулы.
-
Вложенности, как матрёшки.
ifвнутриifвнутриforвнутриwhile. Глаза сломаешь, пока поймёшь, где чейelse. Рецепт прост: ранний возврат (early return), вынос кусков в отдельные мелкие методы. Не усложняй, чувак. -
В 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;
}
}
В общем, суть в том, чтобы писать код не для компа, а для такого же чувака, как ты, который придёт сюда через полгода, возможно, с похмелья. И чтобы он не сказал «ёб твою мать», а кивнул с уважением.