← Назад к вопросам

Какие встречал антипаттерны в своем проекте?

2.0 Middle🔥 142 комментариев
#Архитектура и паттерны

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Встречавшиеся антипаттерны в PHP-проектах

За свою карьеру я сталкивался с множеством антипаттернов, которые значительно усложняли поддержку, развитие и масштабирование проектов. Вот наиболее распространенные и проблемные из них.

1. God Object / Божественный объект

Один из самых частых и разрушительных антипаттернов — класс, который знает и делает слишком много.

class ApplicationManager {
    public function handleUserRegistration($data) { /* ... */ }
    public function processPayment($order) { /* ... */ }
    public function generateReport($params) { /* ... */ }
    public function sendNotifications($users) { /* ... */ }
    public function updateCache($keys) { /* ... */ }
    // ... 40+ других методов
}

Проблемы: Нарушение SRP (Single Responsibility Principle), монолитная архитектура, невозможность тестирования отдельных компонентов, высокий риск побочных эффектов при изменениях.

2. Spaghetti Code / Спагетти-код

Характерен для проектов без четкой архитектуры, где бизнес-логика, представление и данные перемешаны.

// index.php - типичный пример
$db = new mysqli(...);
$user_id = $_GET['id'];

if ($user_id) {
    $result = $db->query("SELECT * FROM users WHERE id = $user_id");
    $user = $result->fetch_assoc();
    
    if ($user['status'] == 'active') {
        // HTML прямо в логике
        echo "<div class='user'>" . htmlspecialchars($user['name']) . "</div>";
        
        // Еще SQL-запросы
        $orders = $db->query("SELECT * FROM orders WHERE user_id = $user_id");
        while ($order = $orders->fetch_assoc()) {
            // Логика обработки заказов...
        }
    }
}
// ... и так на 1000+ строк

3. Magic Numbers and Strings / Магические числа и строки

Жестко закодированные значения, разбросанные по коду, делают его нечитаемым и хрупким.

if ($user->status == 5) { // Что такое 5?
    $discount = $total * 0.15; // Почему 0.15?
}

$query = "WHERE type = 'premium_plus'"; // А если изменится название типа?

Решение: Использование констант, Enum-ов, конфигурационных файлов.

4. Circular Dependency / Циклическая зависимость

Когда два или более класса зависят друг от друга, создавая тупиковую архитектуру.

class UserService {
    private $notificationService;
    
    public function __construct(NotificationService $ns) {
        $this->notificationService = $ns;
    }
    
    public function register($user) {
        $this->notificationService->sendWelcome($user);
    }
}

class NotificationService {
    private $userService;
    
    public function __construct(UserService $us) { // Циклическая зависимость!
        $this->userService = $us;
    }
}

5. Premature Optimization / Преждевременная оптимизация

Разработчики добавляют сложные оптимизации без доказанной необходимости.

// Сложная система кэширования для данных, которые почти не меняются
class UserRepository {
    private $cacheLayer;
    private $redis;
    private $memcached;
    
    public function getUser($id) {
        if ($user = $this->redis->get("user:$id")) {
            return $user;
        }
        if ($user = $this->memcached->get("user_$id")) {
            $this->redis->set("user:$id", $user, 3600);
            return $user;
        }
        // ... и только потом простой SQL-запрос
    }
}

6. Lava Flow / Лавовый поток

Унаследованный код, назначение которого никто не понимает, но все боятся удалять.

// legacy_helper.php - 10-летний файл
function processDataXXX($input) {
    // Загадочные преобразования
    $temp = $input * 2 + 17;
    if (strlen($temp) > 5) {
        $temp = substr($temp, 0, -2);
    }
    // Кто-то где-то это использует? Неизвестно...
    return $temp;
}

7. Copy-Paste Programming / Копипаста

Дублирование кода — самый распространенный антипаттерн.

// В 10 разных местах проекта
function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}

// И еще 10 вариантов той же проверки
function isEmailValid($email) {
    return preg_match('/^[^@]+@[^@]+\.[^@]+$/', $email);
}

8. Sequential Coupling / Последовательное связывание

Когда методы объекта должны вызываться в строго определенном порядке.

class OrderProcessor {
    private $isValidated = false;
    private $isPaid = false;
    
    public function validate() { /* ... */ $this->isValidated = true; }
    public function processPayment() { 
        if (!$this->isValidated) {
            throw new Exception('Call validate() first!');
        }
        // ...
    }
    public function ship() {
        if (!$this->isValidated || !$this->isPaid) {
            throw new Exception('Wrong method order!');
        }
        // ...
    }
}

9. Yo-yo Problem / Проблема йо-йо

Чрезмерная фрагментация наследования, когда для понимания логики нужно прыгать по множеству классов.

class A { public function process() { /* ... */ } }
class B extends A { public function process() { parent::process(); /* ... */ } }
class C extends B { public function process() { parent::process(); /* ... */ } }
// И так 6 уровней в глубину

Борьба с антипаттернами: практические подходы

  1. Регулярные рефакторинги — выделять время на улучшение кодовой базы
  2. Статический анализ — использовать PHPStan, Psalm для автоматического обнаружения проблем
  3. Code Review — обязательный процесс проверки всех изменений
  4. Принципы SOLID и паттерны проектирования — сознательное применение
  5. Тестирование — покрытие кода тестами позволяет безопасно рефакторить
  6. Документация — описание сложных решений и бизнес-логики

Вывод: Антипаттерны — не приговор, а естественная часть эволюции проекта. Ключевой навык — вовремя их распознавать и системно исправлять, не допуская накопления технического долга, который в конечном итоге замедляет развитие и увеличивает стоимость поддержки проекта в разы.

Какие встречал антипаттерны в своем проекте? | PrepBro