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?
la source
Réponses:
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
la source
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.
la source
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 :)
la source