Come posso raggruppare le funzioni correlate all'interno di un caso d'uso?

0

Contesto

Nel contesto di un'API GraphQL consideriamo questa query:

query {
    blogPosts {
        id
        title
        body
        author {
            id
            name
        }
        viewerCanEdit
        isLocked
    }
}

e questa mutazione:

mutation {
    editBlogPost(data: $input) {
        id
        title
        body
    }
}

La mia soluzione

Posso identificare i seguenti casi d'uso:

  • Visualizza tutti i post del blog
  • Modifica post del blog
  • Ottieni utente / autore per ID

Ogni caso d'uso può essere suddiviso in 4 passaggi logici e ognuno risponde a una domanda specifica:

  1. Autorizzazione: il visualizzatore può eseguire questa operazione?
  2. [opzionale] Verifica dell'oggetto: l'operazione può essere eseguita sull'oggetto?
  3. Richiesta di convalida: gli input provenienti dall'utente sono validi?
  4. Esecuzione: come posso eseguire questa operazione?

I motivi della divisione sono i seguenti:

  • 1) e 2) insieme determinano ad esempio viewerCanEdit autorizzazioni poiché non sono associate a una richiesta specifica
  • 2) potrebbe non esistere per operazioni specifiche (elenca tutti i post del blog, crea un nuovo post del blog)
  • 1) e 2) lanciano due diversi tipi di errori che dovrebbero essere trattati in modo diverso
  • 4) può essere eseguito solo se 3) è convalidato
  • un altro caso d'uso può aver bisogno solo di 3) e / o 4) per riutilizzare l'effettiva logica di esecuzione / validazione

Esempio

Ad esempio la mutazione sarebbe implementata logicamente come segue:

  1. L'utente è autorizzato a modificare un post sul blog solo se si tratta di un editor e se il post del blog è il suo
  2. Un post del blog può essere modificato solo se non è bloccato
  3. Una modifica è valida solo se il titolo e il corpo non sono vuoti
  4. Modifica effettiva del post del blog

Domanda

Questa sembra essere una vista estesa sul Command Pattern in cui aggiungo semplicemente 3 metodi aggiuntivi a ciascun comando per dividere l'esecuzione.

Come dovrei raggruppare queste funzioni? Devo avere una classe e 4 metodi per classe / caso d'uso o dovrei creare 4 classi diverse?

C'è un modello simile che gestisce questi problemi?

    
posta Shoe 27.06.2018 - 19:28
fonte

0 risposte

Leggi altre domande sui tag