Ответ
Связанность (coupling) — это мера зависимости между модулями или компонентами программной системы. Высокая связанность усложняет поддержку и изменение кода, так как модификация одного модуля требует изменений в других.
Уровни связанности (от лучшего к худшему):
- Data coupling (связь по данным): Модули общаются только через передачу простых параметров.
- Stamp coupling (связь по структуре): Модули передают составные структуры данных (например, объекты), но используют только их часть.
- Control coupling (связь по управлению): Один модуль передает другому флаг или данные, явно управляющие его логикой.
- Common coupling (общая связь): Модули используют общие глобальные данные.
- 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);
}
}
Почему важна слабая связанность: Она повышает тестируемость (легко подменить зависимости заглушками), переиспользуемость и упрощает рефакторинг системы.