La separazione comando / query si applica a un metodo che crea un oggetto e restituisce il suo ID?


12

Facciamo finta di avere un servizio che chiama un processo aziendale. Questo processo richiamerà il livello dati per creare un oggetto di tipo A nel database.

Successivamente è necessario richiamare un'altra classe del livello dati per creare un'istanza di tipo B nel database. Dobbiamo passare alcune informazioni su A per una chiave esterna.

Nel primo metodo creiamo un oggetto (modifica stato) e restituiamo il suo ID (query) in un singolo metodo.

Nel secondo metodo abbiamo due metodi, uno (createA) per il salvataggio e l'altro (getId) per la query.

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

Dalla mia comprensione, il secondo metodo segue la separazione delle query di comando in modo più completo. Ma trovo inutile e controintuitivo interrogare il database per ottenere l'oggetto che abbiamo appena creato.

Come conciliare CQS con un tale scenario?

Solo il secondo metodo segue CQS e in tal caso è preferibile utilizzarlo in questo caso?


2
se A e B sono creati insieme a qualsiasi frequenza, probabilmente farei creare una procedura memorizzata contemporaneamente, e quindi si taglia fuori il potenziale di creare prima una B o una A senza B se questi sono problemi.
Ryathal,

Entrare in ritardo nel gioco per offrire la possibilità di utilizzare un parametro out. Tecnicamente non è un valore di ritorno! ;)

Risposte:


13

CQS è una linea guida piuttosto che una regola assoluta. Vedi l' articolo wiki per esempi di attività impossibili in CQS rigoroso.

Tuttavia, in questo caso, se si desidera mantenere CQS, è possibile creare l'ID sul lato client (come un GUID) oppure il client potrebbe richiedere un ID al sistema prima di creare qualsiasi oggetto, che risulta più pulito rispetto alla creazione dell'oggetto e quindi alla sua ricerca (ma è più difficile del semplice utilizzo di una colonna di identità).

Personalmente restituirei semplicemente l'ID e lo chiamerei una di quelle situazioni in cui CQS non è adatto.

Un altro buon articolo con esempi: Martin Fowler


3

Se segui una metodologia e sembra che ti porti su cattive strade, dovresti rivalutarla.

Vedo che l'identificatore di un oggetto appena creato è una cosa valida da avere come parametro di ritorno - non è solo conveniente, ma è anche "buono" - come puoi vedere il codice è meglio quando lo fa.

In ogni caso, non ho familiarità con la "separazione di query di comando", ma dubito fortemente che non consente ai comandi di restituire informazioni sull'esecuzione del comando e, in caso affermativo, semplicemente cestinarlo - il successo / fallimento è sempre lì, e lo faccio non pensare che "l'oggetto è stato creato OK" da "l'oggetto è stato creato OK e il suo ID è xxx" per essere molto diverso.


-1

Solo il secondo metodo segue CQS.

Considero CQS una linea guida per incoraggiare le buone pratiche di codifica. Approfitta delle buone pratiche di codifica durante lo sviluppo e, se scopri in seguito che questo metodo contiene codice critico per le risorse, puoi comunque ottimizzarlo.

L'ottimizzazione prematura è la radice di tutti i mali :)


Cosa c'è di particolarmente buono nel secondo metodo?
CheatEx,

Non ho detto che il secondo metodo è "buono". Ho detto che segue il paradigma CQS. Se non segui CQS, suppongo che il secondo metodo non sia adatto a te. Se vuoi sapere perché alcune persone provano a seguire il CQS, vedi http://en.wikipedia.org/wiki/Command-query_separation
cheesus dice di smettere di sparare mod

Hai detto che CQS sta incoraggiando buone pratiche di codifica, se è vero, dovremmo osservare una sorta di "bontà" nel secondo metodo. Dov'è?
CheatEx,

Apparentemente non hai letto il link che ho fornito. CQS catch-frase: porre una domanda non dovrebbe cambiare la risposta . Nel tuo primo metodo, hai un metodo ('createA') che fornisce una 'risposta', ma cambia la risposta ogni volta che lo chiedi. Nel secondo metodo non hai questo, questa è la "bontà" in esso. Per essere chiari: non sono un purista CQS, non lo seguo ogni volta.
Cheesus dice di smettere di sparare mod
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.