Что такое High Cohesion в FSD

Ответ

High Cohesion в FSD (Feature-Sliced Design) означает, что модули или слои приложения должны быть тесно связаны внутри своей функциональной области, но слабо связаны с другими. Это повышает читаемость и поддерживаемость кода.

Пример:

// Плохо: низкая связность (разные ответственности в одном модуле)
function fetchUserAndRenderProfile(userId) {
  // Загрузка данных
  const user = await api.fetchUser(userId);
  // Рендеринг
  renderProfile(user);
}

// Хорошо: высокая связность (разделение на feature-слои)
// features/profile/api.ts
export const fetchUserProfile = (userId) => api.fetchUser(userId);

// features/profile/ui/Profile.tsx
export const Profile = ({ user }) => <div>{user.name}</div>;

Ключевые принципы:

  • Каждый модуль решает одну четкую задачу
  • Логика группируется по бизнес-назначению
  • Минимизация зависимостей между слоями

Ответ 18+ 🔞

А, слушай, вот эта ваша High Cohesion в FSD, ну это ж, блядь, элементарно, Ватсон! Это когда всё, что по одной теме, лежит в одной куче, а не разбросано по проекту, как говно по тарелке.

Представь, ты пишешь профиль пользователя. И вот, мудак, ты в одном файле и данные тянет, и на экран рисует, и ещё, нахуй, аватарку в облако загружает! Это пиздец, чувак. Это низкая связность, или, как я это называю, «спагетти-код на минималках». Открываешь такой модуль — а там овердохуища всего, и хуй разберёшь.

А должно быть вот так, красиво, по слоям, как в хорошем торте «Наполеон», блядь:

// features/profile/api.ts — тут только запросы, чистая логика данных, ебать её в сраку
export const fetchUserProfile = (userId) => api.fetchUser(userId);

// features/profile/ui/Profile.tsx — а тут уже, сука, только вёрстка, принимает данные и рисует
export const Profile = ({ user }) => <div>{user.name}</div>;

Видишь разницу? В первом случае — манда с ушами. Во втором — каждый модуль, как солдат, знает свой манёвр. Один — стреляет (запрашивает), другой — красиво марширует (рисует).

Короче, правила простые, ёпта:

  • Один модуль — одна чёткая задача. Не «сделать всё», а «получить юзера» или «показать аватар».
  • Группируй всё по смыслу, по фиче. Всё для профиля — в features/profile. Всё для корзины — в features/cart. Не тащи логику корзины в модуль авторизации, ты чё, ебобо?
  • Своди зависимости между слоями к минимуму. UI не должен лезть в API напрямую, как голодный студент в холодильник к соседу. Используй прослойки, хуле.

Соблюдаешь это — код становится читаемым, как анекдот про Штирлица. Нарушаешь — получаешь монстра, которого через месяц и сам, блядь, боишься трогать. Чих-пых тебя в сраку, делай красиво!