Dove devo posizionare le convalide della logica aziendale?

1

Stiamo vivendo una discussione accesa su questo al lavoro: Per semplicità, userò degli esempi nella domanda.

Supponiamo che ci sia un'applicazione con un modulo di richiesta account, per il quale abbiamo questi requisiti:

  1. Le date e l'email devono corrispondere a un'espressione regolare
  2. Se l'utente ha già una richiesta di account, non dovrebbe richiedere un altro

Il problema è: dove verificare il secondo requisito?

  1. Se controlliamo il controller, dovremmo accedere al database da lì ed è una logica aziendale, quindi non sembra giusto.

  2. Se verifichiamo sul livello aziendale, dovremmo in qualche modo restituire le informazioni di convalida in caso di convalida fallita. Fare questo richiederebbe:

    • Ogni metodo di business ha un parametro "out";
    • Dobbiamo incapsulare il nostro oggetto di ritorno in un oggetto "risposta" con le informazioni di convalida
    • L'uso delle eccezioni in caso di convalide fallite (che, secondo me, rientra nell'anti-pattern dell'uso di eccezioni per il flusso di programma).

Come dovremmo progettare questo?

    
posta JSBach 20.01.2015 - 14:22
fonte

2 risposte

2

Vai per la seconda soluzione. Il tuo AccountRequestValidator utilizza le informazioni db e alcune regole per determinare se la richiesta è valida o meno. Quindi usa un oggetto "risposta", ma non crearne uno tu stesso se usi un linguaggio che ha già implementato quello per te come Scala o Haskell. Questo tipo è solitamente chiamato Either . Dovrebbe generare un'eccezione se non è in grado di verificare se la convalida è valida, per qualsiasi motivo possa esserci.

Il tuo codice sarebbe quindi simile a:

AccountRequestValidator validator = new AccountRequestValidator(db)
AccountRequest request = //...
try {
    Either<RequestAllowed, RequestForbidden> validationResult = validator.validate(request )
    //Do sth. with validationResult
}
catch (Exception e) {
    //Was unable to check if the request is valid...
}

Se usi Java, considera l'utilizzo di Google Java funzionale . Ha il proprio tipo Either definito .

    
risposta data 20.01.2015 - 14:54
fonte
2

La convalida della validità del formato su singoli campi dovrebbe avvenire il più vicino possibile al punto di ingresso nel codice. In questo caso dovrebbe essere il più vicino possibile all'interfaccia utente. Una ragione per questo è che questo ti permette di assumere valori appropriati da quel punto in poi. Un altro è che questo ti permette di controllare prima di processare qualsiasi cosa che porti anche vantaggi funzionali.

Convalidare cose come, è questo account già creato è una cosa completamente diversa e dovrebbe risiedere nella logica di business. Per approfondire le tue preoccupazioni qui. Mai e poi mai usare le eccezioni per la logica! Le eccezioni sono esattamente per questo, eccezioni. Qualcosa di inaspettato è andato storto, quindi si verifica un'eccezione. Personalmente non sono nemmeno un fan dei parametri e andrei a cercare l'oggetto risposta. Inoltre, ti incoraggio a non estrapolare funzionalità come questa in un set separato di oggetti, in cui puoi personalizzare le tue classi per imitare da vicino le tue esigenze funzionali invece del tuo modello di dati.

HTH.

    
risposta data 20.01.2015 - 14:56
fonte

Leggi altre domande sui tag