/ #cqs #design patterns 

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!

Referências

Deixe seu comentário