Command Query Seperation (CQS) - 변경과 반환 양다리 금지

1 minute read

CQS는 간단하게 설명하면 멤버 변수를 변경하는 동작과 멤버 변수 값을 반환하는 동작 중 하나의 동작으로만 멤버 함수를 구현하는 원칙이다. 양다리는 금지.

public:
    int IncreaseAndReturnCount() { ++m_count; return m_count; }
private:
    int m_count;

IncreateAndRetrunCount()m_count 의 값을 변경하고 m_count 의 값을 반환한다. 이렇게 양다리를 걸치는 경우 CQS 원칙을 어기게 된다.

public:
    void    IncreaseCount()  { ++m_count; }
    int     GetCount() const { return m_count; }
private:
    int m_count;

IncreaseCount()m_count 의 값을 변경하는 Command이고 GetCount()m_count 의 값을 반환하는 Query이다. Query는 멤버 변수를 변경하지 않기 때문에 C++에서 함수 선언 뒤에 const 접미사를 붙여 상수 멤버 함수로 선언할 수 있다. 즉, C++에서 상수 멤버 함수로 선언할 수 있으면 query라고 생각하면 된다. 그 외에는 Command이거나 양다리를 걸치는 잡종이다.

상태를 변경하는 멤버 함수와 변경하지 않고 값만 반환하는 멤버 함수의 구분이 명확해 코드를 읽는데 도움을 주는 게 CQS의 가장 큰 장점이다. C++은 상수 멤버 함수라는 언어적 차원의 도움까지 받을 수 있다. 약속을 어기면 컴파일 타이밍에 뒤통수를 바로바로 쳐주니 컴파일러와 하는 약속은 많을수록 좋다.

C++에서 함수를 구현할 때 함수에서 상태를 변경시키지 않는 객체를 인자(argument)로 전달 받을 때, 함수 매개변수(parameter) 정의를 const T& 로 하는 좋은 습관(당연한 구현)이 자연스럽게 가르쳐 주는 원칙 같다. 물론 CQS같은 원칙이 있는지 알면 더 빨리 익힐 수 있겠지.

참고