C'è qualche ragione per non usare Optional come argomento del metodo nel caso in cui tu sappia che l'argomento è qualcosa che può o non può essere necessario?

10

Con Java 8, ho visto sempre più articoli sull'uso di Option / Optional. Capisco cosa stanno cercando di rappresentare, e vedo molti esempi di questi che vengono usati come ritorni. Tuttavia, quello che non vedo è che sono usati come argomenti metodo / funzione in linguaggi che non hanno la sintassi per i parametri default / opzionali.

C'è qualche ragione per non usare Optional come argomento del metodo nel caso in cui tu sappia che l'argomento è qualcosa che può o non può essere necessario? Ecco un esempio che potrei pensare:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
    
posta Nicholas 13.05.2014 - 19:14
fonte

2 risposte

6

Un motivo è che concettualmente, firstName , middleName e lastName sono logicamente un argomento , non tre. Sono tutte parti di un tutto più grande, e si può immaginare che siano quasi sempre passati insieme. Nei linguaggi funzionali sarebbero probabilmente passati come una tupla o un record; A Java mancano quelli, quindi probabilmente sarebbero aggregati in una classe Name. Tieni presente che se hai bisogno di comporre le funzioni che accettano e restituiscono nomi completi, non saresti in grado di farlo senza aggregarli, dopotutto puoi solo restituire un valore.

Forse non emerge molto spesso che un valore è opzionale e non fa parte di un insieme più grande. Se la funzione richiede un certo valore per fare il suo lavoro, allora quella funzione non dovrebbe accettare un Optional . Se hai bisogno di concatenare operazioni che potrebbero non restituire un valore, interrompendo con Nothing se una funzione non riesce, puoi concatenare le chiamate a flatMap , e se vuoi fallire con un'eccezione puoi usare get() in qualsiasi fase del percorso o alla fine della catena.

Se un valore è veramente facoltativo e una funzione fa due cose diverse in base alla sua presenza o assenza, questo è un odore di codice a meno che la funzione non sia un wrapper di due funzioni più piccole che fanno una cosa ciascuna, e quella particolare combinazione di decisioni è molto comune.

Non penso che sia così tanto sbagliato che sia un caso d'uso relativamente raro.

    
risposta data 13.05.2014 - 19:42
fonte
5

Non ci sono molte lingue che non supportano gli argomenti predefiniti, quindi questo non è un uso comune. Personalmente ritengo che il tuo utilizzo non sia terribile, ma non sarà idiota Java. Molto intenzionalmente, Java non ha argomenti predefiniti, per forzare invece l'uso dell'overloading, che ha il vantaggio che il compilatore controlla i tuoi argomenti invece di richiedere istruzioni if all'interno della funzione.

In altre parole, stai per creare due diverse versioni della query: una con un secondo nome e l'altra senza. Se riesci a farlo in modo conciso, usare un'opzione è una buona idea. Se è abbastanza verboso da volerlo in due funzioni separate, puoi usare l'overloading e renderlo idiomatico.

    
risposta data 13.05.2014 - 19:29
fonte

Leggi altre domande sui tag