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

В чем разница между Cohesion и Coupling?

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

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

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

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

Разница между Cohesion (Связность) и Coupling (Связанность)

В разработке ПО, особенно в контексте объектно-ориентированного программирования и архитектуры, Cohesion и Coupling — это два фундаментальных принципа, которые напрямую влияют на качество кода, гибкость и сопровождаемость системы. Они представляют собой взаимодополняющие, но противоположные по своей сути концепции.

🧩 Cohesion (Связность)

Cohesion определяет, насколько тесно связаны обязанности внутри одного модуля, класса или метода. Высокая связность означает, что элемент системы выполняет одну четко определенную задачу, а его внутренние части логически объединены общей целью.

Типы связности (от лучшего к худшему):

  • Функциональная (Functional): Элемент выполняет одну четкую задачу. Идеал.
    class UserPasswordHasher {
        public function hash(string $password): string {
            return password_hash($password, PASSWORD_BCRYPT);
        }
        // Только операции, связанные с хешированием пароля
    }
    
  • Последовательная (Sequential): Выходные данные одной части являются входными для другой.
  • Информационная (Communicational): Части модуля работают с одними и теми же данными.
  • Временная (Temporal): Части объединены только тем, что выполняются в одно время (например, метод initialize()).
  • Логическая (Logical): Части логически относятся к одной категории, но функционально разные (антипаттерн).
  • Случайная (Coincidental): Части не имеют видимой связи. Наихудший вариант.

Цель: Высокая связность (High Cohesion). Класс OrderCalculator должен только вычислять суммы, OrderRepository — только работать с БД, OrderValidator — только проверять данные.

🔗 Coupling (Связанность)

Coupling описывает степень зависимости между модулями, классами или компонентами. Он показывает, насколько изменения в одном модуле могут повлиять на другой. Низкая связанность — ключ к созданию модульной и тестируемой системы.

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

  • Отсутствующая (No Coupling): Модули полностью независимы (редко достижимо).
  • По данным (Data Coupling): Модули общаются через передачу простых параметров. Желаемый уровень.
    // Низкая связанность: передача примитивных данных
    class NotificationService {
        public function sendWelcomeEmail(string $userEmail, string $userName): void {
            // Отправка email
        }
    }
    
  • По штампу (Stamp Coupling): Передается структура данных (объект, массив), но используется только её часть.
  • По управлению (Control Coupling): Один модуль управляет логикой другого (например, через флаги).
  • Внешняя (External Coupling): Зависимость от внешних систем (БД, API).
  • Общая (Common Coupling): Модули используют глобальные данные.
  • Содержательная (Content Coupling): Один модуль напрямую изменяет внутренние данные другого. Наихудший вариант (нарушение инкапсуляции).

Цель: Низкая связанность (Low Coupling). Достигается через интерфейсы, внедрение зависимостей (DI), паттерны проектирования (например, Наблюдатель, Стратегия).

// Достижение низкой связанности через интерфейс и DI
interface LoggerInterface {
    public function log(string $message): void;
}

class OrderProcessor {
    private LoggerInterface $logger; // Зависим от абстракции, а не от конкретного класса

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

    public function process(Order $order): void {
        // Логика обработки
        $this->logger->log('Order processed: ' . $order->getId());
    }
}

📊 Ключевые различия и взаимосвязь

АспектCohesion (Связность)Coupling (Связанность)
Объект оценкиВнутренняя структура одного модуля/класса.Связи между двумя или более модулями.
Основной вопрос"Насколько сфокусирован и единообразен этот модуль?""Насколько этот модуль зависит от других?"
Идеальное состояниеВысокая связность (одна ответственность).Низкая связанность (минимальные зависимости).
Антипаттерн"Божественный объект (God Object)" — класс, который делает всё."Спагетти-код" — запутанная сеть жестких зависимостей.
Принципы SOLIDПринцип единственной ответственности (SRP) напрямую ведёт к высокой связности.Принцип инверсии зависимостей (DIP) и принцип открытости/закрытости (OCP) ведут к низкой связанности.

🎯 Практическое правило и вывод

Главная цель проектирования — стремиться к модулям с высокой связностью и низкой связанностью.

  • Высокая связность упрощает понимание, тестирование и повторное использование кода.
  • Низкая связанность уменьшает риск распространения изменений (ripple effect), облегчает рефакторинг и модульное тестирование.

Эти принципы лежат в основе чистой архитектуры, микросервисов (где сервисы стремятся быть максимально автономными — высокая связность внутри и низкая связанность между ними) и в целом любого поддерживаемого PHP-приложения. Пренебрежение ими ведёт к созданию хрупкой, жесткой и непереиспользуемой кодовой базы.

В чем разница между Cohesion и Coupling? | PrepBro