CQS - Command Query Separation
O CQS (Command Query Separation) é um pattern introduzido por Bertrand Meyer no livro Object Oriented Software Construction, com a primeira edição publicada em 1988, e a segunda, revisada e expandida em 1997.
A idéia principal é que os métodos de uma aplicação podem ser comandos (commands) ou consultas (queries), mas nunca ambos.
Temos então:
Commands: métodos que alteram estado (mudam valores) sem retornar nenhum valor, e causam efeitos colaterais no sistema.
Queries: métodos que retornam valores, mas não alteram estado.
No exemplo acima, desconsidere questões como injeção de dependências e abstrações, é apenas um exemplo didático, ok?! ;)
Repare que as queries podem ser chamadas várias vezes em sequência produzindo sempre o mesmo resultado, e sem causar qualquer mudança de estado no sistema (sem efeitos colaterais). São consideradas funções puras.
O conceito de Pure Functions vem da programação funcional e são análogas à funções matemáticas, onde o valor de retorno será determinado pelos parâmetros de entrada, ou seja, se você passar sempre os mesmos valores de entrada terá sempre o mesmo resultado.
O uso adequado do CQS vai totalmente de encontro com o Princípio de Responsabilidade Única (SRP) do SOLID. Seus métodos tendem a ficar mais limpos e coesos.
Você verá que nem sempre é possível aplicar o CQS. Um bom exemplo disso está na clase Stack do .Net, o método Pop é ao mesmo tempo um Command e uma Query, pois ele remove o objeto da pilha (altera estado) e ao mesmo tempo retorna o objeto para quem chamou o método (consulta). Ele claramente viola o CQS, mas também não faz muito sentido separar essas responsabilidades em dois métodos diferentes devido sua natureza.
Conclusão
Em minha opinião, é uma boa idéia considerar o CQS como uma prática de programação que devemos sempre seguir. Também podemos abrir uma exceção à ele quando for necessário, conforme vimos acima com o exemplo da classe Stack.
Apenas para salientar, devemos levar em consideração que CQS não é CQRS (Command Query Responsibility Segregation), existe uma certa confusão entre os dois patterns hoje em dia, pretendo escrever mais sobre CQRS futuramente.
Espero que tenham gostado da dica de hoje, e se possível deixem suas críticas ou sugestões.
Abraços!