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

Ответ

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

Coupling (связанность) — степень зависимости между модулями. Низкая связанность — хорошо, т.к. изменения в одном модуле меньше влияют на другие.

Пример:

// Высокая связность (хорошо)  
class Cart {
  addItem() { /* логика добавления */ }
  removeItem() { /* логика удаления */ }
}

// Низкая связанность (хорошо)  
class Payment {
  process(order) { /* обращается к Order через интерфейс */ }
}

Идеал: высокая связность внутри модуля + низкая связанность между модулями.

Ответ 18+ 🔞

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

Вот представь, у тебя есть кухня. Идеальная кухня, блядь. На ней всё для готовки: ножи, доска, плита, сковородки. Это высокая связность (Cohesion). Всё на одной площади и для одной ебанной цели — жрачку сделать. Не надо бегать в гараж за сковородкой или в спальню за ножом. Всё тут, под рукой, логично и удобно. Так и в коде: если модуль (класс, файл) делает одно дело и все его функции — про это дело, это офигенно.

А теперь связанность (Coupling). Это про то, насколько твоя кухня завязана на другие комнаты. Допустим, у тебя холодильник в подвале, вода только из колонки во дворе, а газ — от соседа через шланг в окно. Это пиздец какая высокая связанность с внешним миром. Сосед перекроет газ — ты с голоду сдохнешь. Трубу во дворе порвёт — всё, пизда, мыть нечем.

А низкая связанность — это когда у тебя на кухне своя ёбнутая мини-электростанция, свой скважинный насос и газовая цистерна под окном. Ну или, в идеале, всё электрическое и от одной розетки, но с стабилизатором. Отключили свет во всём городе — а тебе похуй, у тебя свой генератор. Изменения снаружи тебя почти не ебут.

Пример из кода, чтобы не обосраться:

# Высокая связность (хорошо) — всё для одной цели, как ножи на кухне.
class Корзина:
    def добавить_товар(self): # логика добавления
        pass
    def удалить_товар(self): # логика удаления
        pass
    def посчитать_итого(self): # логика подсчёта
        pass
# Всё в одном месте, про одну сущность. Красота.

# Низкая связанность (хорошо) — общаемся через договорённости, а не через жопу.
class Оплата:
    def провести_платёж(self, заказ: ИнтерфейсЗаказа): # принимает НЕ конкретный класс, а интерфейс/абстракцию
        сумма = заказ.получить_сумму() # ему похуй, что там внутри, главное чтобы метод был
        # ... логика оплаты

Видишь? Класс Оплата не лезет в кишки конкретной корзины. Ему скармливают любой объект, у которого есть метод получить_сумму(). Сломался или изменился класс Корзина — классу Оплата часто похуй. Это и есть низкая связанность.

Идеал, к которому все ебутся, но редко достигают: внутри каждого модуля (класса) — полный порядок и одна ответственность (высокая связность), а между собой эти модули общаются через чёткие, простые договорённости, как дипломаты (низкая связанность). Тогда систему можно собирать как лего, а не как говно с палками и скотчем, которое развалится от чиха.