Come utilizzare i metodi separati?

7

Tra le altre cose, il CQRS ha la regola che ognuno dei metodi ha una sola responsabilità. Quindi non possiamo avere questo nel modello:

public class Store {
    public Item getOrCreateItem(int id)
    {
        //logic
    }
     //....
}

e questo nel controller:

Store store = new Store();
Item item = store.getItem(1);

Dobbiamo avere questo nel modello:

public class Store {
    public Item createItem()
    {
        //logic
    }
    public Item getItem(int id)
    {
        //logic
    }
     //....
}

che porta a ciò nel controller:

Store store = new Store();
Item item = store.getItem(1);
if (item !== null) {
    Item item = store.createItem();
}

Ma ora abbiamo molto codice nel controller ...

C'è un modo migliore per separare i metodi piuttosto che avere il codice aggiuntivo nel controller, che dovrebbe contenere un piccolo codice?

    
posta losasafo 22.02.2018 - 21:53
fonte

2 risposte

20

Oh, per gridare strong.

Il controller non ha nulla a che fare con ciò che la tua implementazione di getThingy() ha dietro. Se getThingy() crea o elimina una copia memorizzata nella cache non è affare. L'unica ragione per cui questo dettaglio di implementazione è trapelato dallo store e nel controller è stato perché non ti fidi del negozio solo per "farti un po '". Una volta che inizi a pensare, sai "come", dall'esterno, all'improvviso sei intrappolato nel fare ciò che ci si aspetta. Questa non è astrazione.

Se stai pensando "ma i getter non dovrebbero essere fabbriche" allora va bene. Chiamalo thingy() .

Se stai pensando "ma ho altre cose che hanno bisogno di ottenere cose differenti", allora va bene. Chiamalo controllersThingy() .

Se tutto quello che chiedo è un coso, allora dammi il mio coso. Non mi interessa come. Smettila di dirmi come.

    
risposta data 22.02.2018 - 23:28
fonte
2

In genere, si avrebbe un servizio che fornirebbe questo tipo di funzionalità. Il controller chiamerebbe qualcosa come StoreService.EnsureItemExists (1).

Probabilmente il modello non dovrebbe fare molto: la maggior parte della logica aziendale dovrebbe risiedere nel servizio.

    
risposta data 22.02.2018 - 22:03
fonte

Leggi altre domande sui tag