CQS (Command Query Separation)
상태 변경과 상태 조회를 한 함수에 섞지 말라! 독자(협업자)를 헷갈리게 하지 말라.
-
Command (명령) : 시스템의 상태를 변경하는 함수. → side effect 있음 → 예: authorizer.login(userName, password); 👉 아무것도 반환하지 않는 것이 원칙.
-
Query (조회) : 시스템의 상태를 조회하거나 계산 결과를 반환하는 함수. → side effect 없음 → 예: authorizer.getUser(userName); 👉 상태를 변경하면 안됨.
// ❌ 나쁜 예
User u = authorizer.login(userName, password);
// login이 상태를 바꾸고, User 객체까지 반환해버림 → CQS 위반
// ✅ 좋은 예
authorizer.login(userName, password); // Command: 상태 변경
User u = authorizer.getUser(userName); // Query: 상태 조회