Что такое Command Query Separation

Ответ

Command Query Separation (CQS) — это принцип проектирования, который разделяет операции на команды (изменяющие состояние) и запросы (возвращающие данные).

Ключевые идеи:

  • Команды выполняют действия (например, сохранение данных), но не возвращают значения.
  • Запросы возвращают данные, но не изменяют состояние системы.

Пример:

// Команда (изменяет состояние)
function updateUser(user) {
  database.save(user); // нет return
}

// Запрос (возвращает данные)
function getUser(id) {
  return database.find(id); // не изменяет состояние
}

Плюсы:

  • Четкое разделение логики.
  • Упрощение тестирования и понимания кода.

Минусы:

  • Иногда сложно строго соблюдать (например, если метод должен и изменять состояние, и возвращать данные).

Применяется в паттернах (CQRS) и API-дизайне (REST, GraphQL).

Ответ 18+ 🔞

Слушай, а вот есть такая штука — Command Query Separation, или CQS, если по-пацански. Принцип, который как будто говорит: «Мужик, определись — ты либо ешь, либо на хуй иди». Суть проще пареной репы: всё, что ты делаешь в коде, делится на две категории.

Первая — команды. Это когда ты что-то меняешь, но нихуя не возвращаешь. Как будто взял и плюнул в асфальт — состояние мира изменил, а обратно тебе ни ответа, ни привета. Чисто действие, блядь.

Вторая — запросы. Это когда ты спрашиваешь данные, но ни одной переменной вокруг не трогаешь. Как будто подглядываешь в замочную скважину — всё видишь, но дверь на месте, и баба в комнате не оборачивается. Чисто наблюдение, ёпта.

Смотри, как это выглядит в жизни:

// Это команда, сука. Сохранил юзера и пошёл на хуй, ничего не возвращаю.
function updateUser(user) {
  database.save(user); // Никакого return, только изменение.
}

// А это запрос, блядь. Нашёл юзера по айди и вернул его, но базу не тронул ни на йоту.
function getUser(id) {
  return database.find(id); // Чисто данные, состояние системы — свято.
}

Плюсы, блядь, очевидны: Код становится как шкаф у немецкой домохозяйки — всё по полочкам, всё понятно. Тестировать — одно удовольствие, потому что команды и запросы не путаются под ногами. Архитектура прозрачная, как слёзы ребёнка, которого только что отлучили от титьки.

Но есть и минусы, ёпта: Иногда жизнь, сука, сложнее. Вот представь: метод должен и состояние поменять, и что-то тебе вернуть. А принцип орёт: «Либо одно, либо другое, пидор!» Приходится выкручиваться, дробить логику, а это иногда выглядит как попытка засунуть диван в унитаз — вроде и нужно, но неебически неудобно.

Применяется эта философия, кстати, в серьёзных паттернах вроде CQRS, да и в дизайне API (REST, GraphQL) её дух витает. В общем, штука мощная, но требующая дисциплины, чтобы не превратить код в бардак, где команды с запросами ебутся как кошки в марте.