Vamos fingir que temos um serviço que chama um processo de negócios. Esse processo chamará a camada de dados para criar um objeto do tipo A no banco de dados.
Depois, precisamos chamar novamente outra classe da camada de dados para criar uma instância do tipo B no banco de dados. Precisamos passar algumas informações sobre A para uma chave estrangeira.
No primeiro método, criamos um objeto (estado de modificação) e retornamos seu ID (consulta) em um único método.
No segundo método, temos dois métodos, um (createA) para o salvamento e o outro (getId) para a consulta.
public void FirstMethod(Info info)
{
var id = firstRepository.createA(info);
secondRepository.createB(id);
}
public void SecondMethod(Info info)
{
firstRepository.createA(info);
var key = firstRepository.getID(info);
secondRepository.createB(key);
}
Pelo meu entendimento, o segundo método segue a separação da consulta de comando mais completamente. Mas acho um desperdício e contra-intuitivo consultar o banco de dados para obter o objeto que acabamos de criar.
Como você reconcilia o CQS com esse cenário?
Apenas o segundo método segue o CQS e, em caso afirmativo, é preferível usá-lo neste caso?
fonte
Respostas:
O CQS é uma diretriz e não uma regra absoluta. Veja o artigo da wiki para exemplos de atividades impossíveis sob CQS estrito.
No entanto, nesse caso, se você quiser manter o CQS, poderá criar o ID no lado do cliente (como um GUID) ou o cliente poderá solicitar um ID do sistema antes de criar qualquer objeto, o que parecer mais limpo. eu do que criar o objeto e depois consultá-lo (mas é mais difícil do que apenas usar uma coluna de identidade).
Pessoalmente, eu apenas retornaria o ID e o chamaria de uma daquelas situações em que o CQS não é um bom ajuste.
Outro bom artigo com exemplos: Martin Fowler
fonte
Se você segue uma metodologia e ela parece levá-lo a caminhos ruins, você deve reavaliá-la.
Vejo que o identificador de um objeto recém-criado é uma coisa válida para ter como parâmetro de retorno - não é apenas conveniente, mas também é "bom" - como você pode ver, o código é melhor quando o faz.
De qualquer forma, não estou familiarizado com "separação de consulta de comando", mas duvido muito que ele não permita que os comandos retornem informações sobre a execução do comando e, se houver, lixeira - o sucesso / falha está sempre lá, e eu faço não pense que "seu objeto foi criado OK" de "seu objeto foi criado OK e seu ID é xxx" para ser muito diferente.
fonte
Somente o segundo método segue o CQS.
Considero o CQS uma diretriz para incentivar boas práticas de codificação. Use boas práticas de codificação durante o desenvolvimento e, se descobrir mais tarde que esse método contém código crítico de recursos, você ainda poderá otimizá-lo.
Otimização prematura é a raiz de todo o mal :)
fonte