Costruire nuovi oggetti con la convalida in Java

1

Sto utilizzando Playframework con Java e sto tentando di scegliere tra alcune scelte per la creazione di oggetti utente validi (che verranno poi mantenuti nel database nel mio livello aziendale). La riproduzione utilizza Moduli come supporto per la convalida.

Quindi, nella mia classe utente ...

public User {
    @FooConstraint
    private String fooParam;

}

Opzione 1: consente al costruttore di utenti di lanciare un'eccezione

public User(String fooParam){
    Form<User> userForm = formFactory.form(User.class);
    User user = new User(fooParam);
    userForm.fill(user);
    //Check if FooConstraint is violated
    if(userForm.hasErrors(){
        throw new IllegalArgumentException();
    }
    return user;
}

Opzione 2: metodo di fabbrica che restituisce un opzionale

public static Optional<User> userFactory(String fooParam){
    Form<User> userForm = formFactory.form(User.class);
    User user = new User(fooParam);
    userForm.fill(user);
    //Check if FooConstraint is violated
    if(userForm.hasErrors(){
        return Optional.empty();
    }
    return Optional.of(user);
}

Opzione 3: Lascia che il livello logico aziendale o il livello controller eseguano tutte le convalide.

Apprezzo qualsiasi aiuto con questo. Grazie!

    
posta Daniel 17.03.2018 - 22:56
fonte

2 risposte

3

La risposta giusta dipende interamente dalle esigenze del cliente. Stavi cercando di costruire un oggetto perché volevi usarlo. Ora, in un modo o nell'altro, non esisterà. Questo é un problema. Che cosa dovrebbe essere fatto a riguardo?

Usi opzionale quando la risposta corretta al problema è di non fare nulla. Opzionale non fa molto bene. Più facile leggere quindi i controlli nulli.

Le eccezioni vengono utilizzate quando il codice deve essere eseguito per risolvere il problema (in modo da catturare e gestire l'eccezione) o il ripristino è impossibile in modo da inviare un'eccezione che non verrà catturata e lasciare che l'applicazione muoia prima che sia non valida lo stato lo induce a corrompere i dati persistenti.

E ovviamente puoi controllare attentamente le cose prima di tentare di creare qualsiasi cosa ed evitare del tutto il problema. Ma quanto sono perfette queste partite, quindi è bene mettere un po 'di convalida vicino a dove conta.

    
risposta data 18.03.2018 - 15:55
fonte
3

@CandiedOrange la risposta va bene, dipende se sei o.k. con ignorando l'errore. Ma, per elaborare, dovresti considerare questa domanda:

Quanto raro o " eccezionale " è ottenere un fooParam non valido?

non valido
  1. Se stai leggendo da un database "rispettato", endpoint REST, ecc., gli input errati dovrebbero essere rari e dovresti inclinarti a lanciare un'eccezione.

  2. Se si tratta di input dell'utente, elementi che "rasentano" da siti Web disorganizzati, ecc., gli input non validi saranno più comuni e ignorare l'errore utilizzando un Optional è abbastanza ragionevole.

In generale, se ti aspetti "spazzatura", sii più tollerante. Se ti aspetti input puliti, sii severo.

    
risposta data 18.03.2018 - 17:04
fonte

Leggi altre domande sui tag