**CQS**


## Command Query Separation
### Important Principle of Imperative Programming
Bertrand Meyerd의 Eiffel 프로그래밍 언어에서 고안되었다
모든 메소드는 한번의 액션에서 상태를 변경하는 커맨드든 데이터를 반환하는 쿼리든 한가지 액션만 취해야 한다는 것
**요청에 대한 행동을 할때 대답을 변경하지 말라는 것**
**다시말해 상태변경과 데이터 반환이 따로 구현되어야 한다는 말이다 get, set 의 이론근간**
메소드는 값을 반환할 때 referentially transparent(시스템의 상태를 변경하지 않을 때 함수를 referentially transparent하다고 함)해야 하며 사이드 이펙트를 유발하지 말아야 한다
많이 사용될 수 있으나 이로 인해 가장 흔하게 생기는 문제는 [Race Condition](https://texonom.com/race-condition-ea56eabea2274bff9172711f4aad9d07) 

- **Query - **결과값을 반환하고, 시스템의 관찰가능한 상태를 변화시키지 않는다. 따라서 부작용에서 자유롭다.(free of side effects)
- **command - **결과를 반환하지 않고, 대신 시스템의 상태를 변화시킨다.



> [Command와 Query, CQS 알아보기](https://shoark7.github.io/programming/knowledge/command-and-query-method)

> [CQS - Command Query Separation](https://opennote46.tistory.com/167)

> [Command-query separation - Wikipedia](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)






