글
명령과 질의 분리(command query separation)
- 질의 결과를 반환하고, 시스템의 주요 상태를 변경하지 않기 때문에 얘기치 않은 현상을 고려할 필요가 없는 메소드
- 명령시스템 상태를 변환하고 값을 반환하지 않는 메소드
명령이라는 용어는 다른 상황에서도 자주 사용되기 때문에 나는 수정자 (modifiers)라는 용어를 더 선호하고, 'mutators' 라는 용어도 종종 사용된다.
이러한 원칙의 진정한 가치는 객체의 상태를 변환하는 메소드를 그렇지 않은 메소드와 구분하는 것은 생각보다 엄청난 편리함을 주기 때문이다. 왜냐하면, 질의 메소드로 분류된 것은 순서나 위치 등에 구애를 받지 않고 마음껏 사용할 수 있기 때문이다. 수정 메소드의 경우에 한하여 보다 주의를 요한다.
이러한 원칙에서 반환 타입은 상황에 따라 주어지는 것으로 인식된다. 이것은 훌륭한 관습이고 오랜 시간 동안 유익하여 쓰여졌다. Java에서 Collection을 순회(iterating)할 때 주로 사용하는 코드 유형(idiom)을 떠올려보자: next 메소드는 Collection이 포함하는 다음 항목을 반환함과 동시에 다음 항목으로 커서를 움직인다. 개인적으로는 advance 와current 메소드로 이를 나눠서 처리하는 것을 선호한다.
명령-질의 분리를 절대적으로 선호했음에도 예외를 두었다. Stack 에서 pop 은 상태를 수정하는 수정자의 전형적인 예가 될 수 있다. Meyer 는 pop 의 사용을 피할 수 있지만, 이는 유용한 표현법임을 인정했다. 그래서, 나는 이 원칙을 가능하면 따르려 하지만, pop 과 같은 경우를 만나면 원칙을 따르지 않을 것이다.
프로그래밍 언어 자체가 이러한 개념을 지원한다면 좋을 것이다. 프로그래밍 언어가 상태를 변화시키는 메소드를 발견해낸다거나 그렇지 못하더라도 프로그래머가 이를 표기할 수 있게 하는 것을 생각해볼 수 있다. 주목할만한 상태(Observable State)에 대한 판단 규칙을 마련하는 것이 쉽지 않아 프로그래밍 언어의 자동검출이 어려울 것이다. 프로그래머가 이를 표기하는 방법이 다소 합리적인 것 같지만 이러한 경우를 접하기는 어렵다. 유일한 사례는 C++ 의 수정자에 const를 부여한 경우다.