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


11

Con Java 8, ho visto sempre più articoli sull'uso di Opzione / Opzionale. Capisco cosa stanno cercando di rappresentare e vedo molti esempi di loro che vengono utilizzati come resi. Tuttavia, ciò che non vedo è che vengono utilizzati come argomenti metodo / funzione in lingue che non hanno la sintassi per i parametri predefiniti / opzionali.

C'è qualche motivo per non usare Optionalcome argomento del metodo nel caso in cui si sappia che l'argomento è qualcosa che può o non può essere necessario? Ecco un esempio che mi viene in mente:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

Questo è un uso comune per loro in Haskell, che inoltre non ha argomenti predefiniti (dolore al curry).
Daniel Gratzer,

Vedi la mia risposta a una domanda Stack Overflow correlata. In breve, Optionalè inteso principalmente per i valori di ritorno che potrebbero essere assenti. Altri usi sono possibili, ovviamente, ma sono ingombranti e probabilmente di cattivo stile.
Stuart Marks

Risposte:


6

Una ragione è che concettualmente, firstName, middleName, e lastNamesono logicamente un argomento, non tre. Sono tutte parti di un tutto più grande e si può immaginare che siano quasi sempre passate insieme. In linguaggi funzionali sarebbero probabilmente passati come tupla o disco; A Java mancano quelli, quindi probabilmente verrebbero aggregati in una classe Name. Si noti che se fosse necessario comporre funzioni che accettano e restituiscono nomi completi, non si sarebbe in grado di farlo senza aggregarli: dopo tutto, è possibile restituire un solo valore.

Forse non capita spesso che un valore sia facoltativo e che non faccia 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 è necessario concatenare operazioni che potrebbero non restituire un valore, interrompere Nothingse una funzione lungo la strada fallisce, è possibile concatenare le chiamate a flatMap, e se si desidera fallire con un'eccezione, è possibile utilizzare get()in qualsiasi momento o fine della catena.

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

Non penso che sia così tanto che è sbagliato in quanto è un caso d'uso relativamente insolito.


5

Non ci sono molte lingue che non supportano gli argomenti predefiniti, quindi questo non è un uso comune. Personalmente penso che il tuo utilizzo non sia terribile, ma non sarà un linguaggio idiomatico. Java molto intenzionalmente non ha argomenti predefiniti, per forzare invece l'uso del sovraccarico, il che ha il vantaggio che il compilatore controlla gli argomenti invece di richiedere ifistruzioni all'interno della funzione.

In altre parole, realizzerai due diverse versioni della query: una con un secondo nome e una senza. Se riesci a farlo in modo conciso, usare un'opzione è una buona idea. Se è abbastanza prolisso da volerlo comunque in due funzioni separate, puoi anche usare il sovraccarico e renderlo idiomatico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.