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

9

Facciamo finta che abbiamo un servizio che chiama un processo aziendale. Questo processo chiamerà sul livello dati per creare un oggetto di tipo A nel database.

Successivamente dobbiamo chiamare di nuovo su un'altra classe del livello dati per creare un'istanza di tipo B nel database. Abbiamo bisogno di passare alcune informazioni su A per una chiave straniera.

Nel primo metodo creiamo un oggetto (modifica lo stato) e restituiamo il suo ID (query) in un unico 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);
    }

Da quanto ho capito, il secondo metodo segue in modo più completo la separazione delle query dei comandi. Ma trovo inutile e contro-intuitivo interrogare il database per ottenere l'oggetto che abbiamo appena creato.

Come si concilia il CQS con uno scenario simile?

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

    
posta Gilles 12.12.2011 - 18:53
fonte

3 risposte

10

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

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 dal sistema prima di creare qualsiasi oggetto, che mi sembra più pulito che creare l'oggetto, quindi interrogarlo (ma è più difficile che usare solo una colonna Identity).

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

Un altro buon articolo con esempi: Martin Fowler

    
risposta data 14.11.2012 - 23:44
fonte
3

Se segui una metodologia e sembra che ti porti in cattivi percorsi, dovresti riconsiderarla.

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 è migliore quando lo fa.

In ogni caso, non ho familiarità con "command query separation" ma dubito strongmente che non consenta ai comandi di restituire informazioni sull'esecuzione del comando, e se lo fa, basta trascinarlo: successo / fallimento è sempre lì, e non penso che "il tuo oggetto sia stato creato OK" da "il tuo oggetto è stato creato OK e il suo id è xxx" per essere molto diverso.

    
risposta data 12.12.2011 - 19:35
fonte
-1

Solo il secondo metodo segue CQS.

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

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

    
risposta data 12.12.2011 - 21:15
fonte

Leggi altre domande sui tag