Что такое связанность (coupling) в коде?

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

Ответ

Связанность (coupling) — это мера зависимости между модулями или компонентами программной системы. Высокая связанность усложняет поддержку и изменение кода, так как модификация одного модуля требует изменений в других.

Уровни связанности (от лучшего к худшему):

  1. Data coupling (связь по данным): Модули общаются только через передачу простых параметров.
  2. Stamp coupling (связь по структуре): Модули передают составные структуры данных (например, объекты), но используют только их часть.
  3. Control coupling (связь по управлению): Один модуль передает другому флаг или данные, явно управляющие его логикой.
  4. Common coupling (общая связь): Модули используют общие глобальные данные.
  5. Content coupling (содержательная связь): Один модуль напрямую изменяет внутренние данные или логику другого (например, через goto или изменение приватных полей).

Пример слабой связанности (предпочтительный):

// Модуль OrderProcessor зависит только от абстракции PaymentGateway.
class OrderProcessor {
    private PaymentGateway $paymentGateway;

    public function __construct(PaymentGateway $gateway) {
        $this->paymentGateway = $gateway; // Внедрение зависимости
    }

    public function process(Order $order): void {
        $this->paymentGateway->charge($order->getAmount());
    }
}

Пример сильной связанности (проблемный):

// OrderProcessor жестко зависит от конкретного класса PayPal и способа получения данных.
class OrderProcessor {
    public function process(int $orderId): void {
        $payment = new PayPal(); // Прямое создание зависимости
        $order = Order::find($orderId); // Статический вызов, привязка к глобальному состоянию
        $payment->charge($order->amount);
    }
}

Почему важна слабая связанность: Она повышает тестируемость (легко подменить зависимости заглушками), переиспользуемость и упрощает рефакторинг системы.