Home CQRS, direto ao ponto
Post
Cancelar

CQRS, direto ao ponto

Com todo o seu charme, essa é daquelas expressões em inglês que arrepia a espinha de qualquer iniciante, e que todo profissional quando compreende o conceito, repete com orgulhos nos olhos. (veja abaixo como é a pronúncia)

CQRS é a abreviação de Command and Query Responsibility Segregation.\

O que isso quer dizer?

Não misture “leitura dos dados” com “gravação dos dados”!

Quando usar

Sempre que possível. O “papo” de over-engineering não se encaixa tão bem aqui, uma vez que não é tão complexo assim.
Claro, sem hipocrisia, numa distribuição orientada à microservices, existe chance de ser um trabalho chato e menos justificável.

Como implementar

Existem duas técnicas, no qual vi ser as mais comuns:

1 - Criando classes distintas, separando propriedades editáveis de dados disponíveis para consulta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public class CreatePlayer
    {
        public string Name { get; set; }
        public string Alias { get; set; }
        public string DefaultPassword { get; set; }
    }

    public class UpdatePlayer
    {
        public string Name { get; set; }
        public string Alias { get; set; }
        public string Password { get; set; }
    }

    public class FindPlayer
    {
        public Guid ID { get; set; }
        public string Name { get; set; }
        public string Alias { get; set; }
        public DateTime CreatedTime { get; set; }
    }

2 - Separando acessos distintos de leitura e escrita, de preferência com credenciais diferentes para acesso à base de dados.

Um método deve ser Command ou Query, nunca ambos.
Command se refere às funções de criação, alteração ou exclusão.
E por eliminação, Query são as consultas.

Benefícios

- Princípio da responsabilidade única

Ao separar os métodos, já encontrará o código quebrado para uma única responsabilidade, o que facilitará na implementação de cobertura de testes, e também na própria manutenção.

- Dimensionamento Independente

Caso tenha um software com mais requisições de leituras do que gravação, é ideal usar dois bancos de dados separados, podendo dimensionar os seus modelos de forma independente.

Além disso, podemos desnormalizar o banco de dados de leitura, o que resultará em consultas simples, junções menos complexas, e tempo de resposta rápido.

- Separação de preocupação

As regras de persistência e atualização dos dados não irão influenciar nas consultas, e entregar credenciais distintas trará menores preocupações no acesso aos dados.
Não basta estar blindado ao “sql-injection”, mas também a atenção para erros humanos, o que acontece com frequência em projetos de objetos dinamicamente mapeados por um ORM.

CQRS é simples, mas que traz preocupações reais do mundo corporativo, e este conceito será referenciado em outros textos futuros, principalmente sobre tópicos relacionados à segurança da informação.

Esta postagem está licenciada sob CC BY-NC-ND 4.0 pelo autor.