함수를 값을 돌려주는 질의(query)와 상태를 바꾸는 명령(command) 중 하나로만 만들라는 원칙. 질의 함수는 겉으로 관찰되는 부수 효과(Side Effect)가 없어야 한다.
// before: 이름에 And가 들어간 함수
function getTotalOutstandingAndSendBill() { ... }
// after
function totalOutstanding() { return invoices.reduce((t, i) => t + i.amount, 0) }
function sendBill() { emailGateway.send(formatBill(customer)) }- 부수 효과 없는 질의는 몇 번을 불러도, 어디로 옮겨도 안전하다. 이용할 때 신경 쓸 것이 거의 없다
- 함수 이름에 "And"가 들어가면 두 가지 일을 하고 있다는 신호다
- 심플 디자인 강의는 같은 이야기를 "Mutator와 Accessor를 구분하라"로 한다. 함수를 추출할 때도 부수 효과를 섞지 말라는 것이다
참조 투명성(Referential Transparency)
같은 입력에 항상 같은 결과를 내는 성질. 질의 함수가 가변 전역 변수를 읽으면 이 성질을 잃는다. 이럴 땐 그 값을 매개변수로 받게 하면 되찾을 수 있다(질의 함수를 매개변수로 바꾸기, Replace Query with Parameter). 반대로 함수가 스스로 쉽게 구할 수 있는 값을 매개변수로 받는 것은 일종의 중복이다(매개변수를 질의 함수로 바꾸기, Replace Parameter with Query). 둘 사이의 균형점은 프로젝트를 진행하며 옮겨 다닌다.
React 렌더 함수에 요구하는 순수성(React의 규칙과 렌더 순수성)과 부수 효과를 Effect로 분리하는 방식(부수 효과와 Effect)도 같은 원칙의 응용이다. 질의를 반복 호출해도 안전하다는 점은 서버 쪽 멱등성(Idempotency)과도 닮았다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Separate Query from Modifier · Refactoring.Guru: Separate Query from Modifier · Martin Fowler: Command Query Separation · 인프런 『심플 디자인』 박영록