La séparation commande / requête s'applique-t-elle à une méthode qui crée un objet et renvoie son ID?

12

Imaginons que nous ayons un service qui appelle un processus métier. Ce processus fera appel à la couche de données pour créer un objet de type A dans la base de données.

Ensuite, nous devons appeler à nouveau sur une autre classe de la couche de données pour créer une instance de type B dans la base de données. Nous devons transmettre des informations sur A pour une clé étrangère.

Dans la première méthode, nous créons un objet (modifier l'état) et renvoyons son ID (requête) dans une seule méthode.

Dans la deuxième méthode, nous avons deux méthodes, une (createA) pour la sauvegarde et l'autre (getId) pour la requête.

    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);
    }

D'après ma compréhension, la deuxième méthode suit plus complètement la séparation des requêtes de commande. Mais je trouve inutile et contre-intuitif d'interroger la base de données pour obtenir l'objet que nous venons de créer.

Comment conciliez-vous CQS avec un tel scénario?

Seule la deuxième méthode suit-elle le CQS et dans l'affirmative, est-il préférable de l'utiliser dans ce cas?

Gilles
la source
2
si A et B sont créés avec une fréquence quelconque, je créerais probablement une procédure stockée à la fois, puis vous supprimez le potentiel d'avoir un B créé en premier ou un A créé sans B si ce sont des problèmes.
Ryathal
Intervenir tard dans le jeu pour offrir la possibilité d'utiliser un paramètre de sortie. Ce n'est techniquement pas une valeur de retour! ;)

Réponses:

13

CQS est une ligne directrice plutôt qu'une règle absolue. Voir l' article wiki pour des exemples d'activités qui sont impossibles sous CQS strict.

Cependant, dans ce cas, si vous souhaitez conserver CQS, vous pouvez soit créer l'ID côté client (tel qu'un GUID), soit le client peut demander un ID au système avant de créer des objets, ce qui semble plus propre à moi que de créer l'objet puis de l'interroger (mais c'est plus difficile que de simplement utiliser une colonne d'identité).

Personnellement, je retournerais simplement l'ID et l'appellerais l'une de ces situations où CQS ne convient pas.

Un autre bon article avec des exemples: Martin Fowler

Misko
la source
3

Si vous suivez une méthodologie et qu'elle semble vous conduire sur de mauvais chemins, vous devez la réévaluer.

Je vois que l'identifiant d'un objet nouvellement créé est une chose valide à avoir comme paramètre de retour - ce n'est pas seulement pratique, mais c'est aussi "bon" - comme vous pouvez le voir, le code est meilleur quand il le fait.

Dans tous les cas, je ne suis pas familier avec la "séparation des requêtes de commande", mais je doute fortement qu'elle empêche les commandes de renvoyer des informations sur l'exécution de la commande, et si c'est le cas, il suffit de la jeter - le succès / l'échec est toujours là, et je le fais pense pas que "votre objet a été créé OK" de "votre objet a été créé OK et son identifiant est xxx" pour être très différent.

alex
la source
-1

Seule la deuxième méthode suit CQS.

Je considère le CQS comme une ligne directrice pour encourager les bonnes pratiques de codage. Utilisez les bonnes pratiques de codage pendant le développement et si vous découvrez plus tard que cette méthode contient du code critique pour les ressources, vous pouvez toujours l'optimiser.

L'optimisation prématurée est la racine de tout Mal :)

cheesus dit d'arrêter de tirer des mods
la source
Qu'est-ce qui est particulièrement bon dans la deuxième méthode?
CheatEx
Je n'ai pas dit que la deuxième méthode était «bonne». J'ai dit qu'il suit le paradigme CQS. Si vous ne suivez pas CQS, je suppose que la deuxième méthode n'est pas bonne pour vous. Si vous voulez savoir pourquoi certaines personnes essaient de suivre CQS, voir http://en.wikipedia.org/wiki/Command-query_separation
cheesus dit d'arrêter de tirer les mods
Vous avez dit que CQS encourage de bonnes pratiques de codage, si c'est vrai, alors nous devrions observer une sorte de «bonté» dans la deuxième méthode. Où est-ce?
CheatEx
Apparemment, vous n'avez pas lu le lien que j'ai fourni. CQS slogan: Poser une question ne devrait pas changer la réponse . Dans votre première méthode, vous avez une méthode ('createA') qui fournit une 'réponse', mais elle change la réponse à chaque fois que vous demandez. Dans la deuxième méthode, vous n'avez pas cela, c'est la «bonté» en elle. Pour être clair: je ne suis pas puriste CQS, je ne le suis pas à chaque fois.
cheesus dit d'arrêter de tirer les mods