PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Когда нужен Command Query Separation?

Продвинутые темы

Command Query Separation (CQS) нужен, когда важно чётко разделить операции на команды (изменяют состояние, ничего не возвращают) и запросы (возвращают данные, ничего не меняют) — для предсказуемости и понятности кода.

Принцип CQS

Метод должен быть либо командой, либо запросом, но не тем и другим:

  • Command — меняет состояние, возвращает void (или статус).
  • Query — возвращает данные, не меняет состояние (не имеет побочных эффектов).
// Плохо — и меняет, и возвращает
function addAndGetCount(item) {
  this.items.push(item);
  return this.items.length;
}

// CQS — раздельно
function add(item) { this.items.push(item); }      // команда
function getCount() { return this.items.length; }  // запрос

Когда нужен

  • Предсказуемость — запрос можно вызывать без опасений побочных эффектов (кеширование, повтор безопасны).
  • Понятность — по сигнатуре ясно, меняет ли метод состояние.
  • Тестируемость — запросы легко тестировать (чистые).
  • Сложная доменная логика — разделение упрощает рассуждение о коде.

CQS против CQRS

  • CQS — принцип уровня методов (команда vs запрос).
  • CQRS — архитектурный паттерн: раздельные модели для чтения и записи (разные пути, иногда разные БД). Масштаб больше, для сложных систем.

Компромиссы

Строгое CQS не всегда удобно (иногда полезно вернуть результат команды, например id созданного). Применяют прагматично.

Коротко для собеседования

CQS (Command Query Separation) разделяет методы на команды (меняют состояние, ничего не возвращают) и запросы (возвращают данные без побочных эффектов). Нужен для предсказуемости (запросы безопасно повторять/кешировать), понятности и тестируемости. Расширение — CQRS (раздельные модели чтения/записи). Применяют прагматично.

Другие вопросы раздела