¿Hay alguna razón para no usar Opcional como argumento de método en el caso de que sepa que el argumento es algo que puede o no ser necesario?

11

Con Java 8, he visto más y más artículos sobre el uso de Opción / Opcional. Entiendo lo que intentan representar, y veo muchos ejemplos de ellos que se utilizan como devoluciones. Sin embargo, lo que no veo es que se utilicen como argumentos de método / función en lenguajes que no tienen la sintaxis para los parámetros predeterminados / opcionales.

¿Hay alguna razón para no usarlo Optionalcomo argumento de método en el caso de que sepa que el argumento es algo que puede o no ser necesario? Aquí hay un ejemplo que podría pensar:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
Nicholas
fuente
Este es un uso común para ellos en Haskell, que tampoco tiene argumentos predeterminados (dolor al curry).
Daniel Gratzer
Vea mi respuesta a una pregunta relacionada con el desbordamiento de pila. Brevemente, Optionalestá destinado principalmente a valores de retorno que pueden estar ausentes. Otros usos son posibles, por supuesto, pero son engorrosos y probablemente de mal estilo.
Stuart Marks

Respuestas:

6

Una de las razones es que, conceptualmente, firstName, middleName, y lastNameson lógicamente una discusión, no tres. Son todas partes de un todo más grande, y uno puede imaginar que casi siempre se pasan juntas. En lenguajes funcionales, probablemente se pasarían como una tupla o registro; Java carece de esos, por lo que probablemente se agregarían a una clase de Nombre. Tenga en cuenta que si necesita componer funciones que toman y devuelven nombres completos, no podría hacerlo sin agregarlos; después de todo, solo puede devolver un valor.

Tal vez simplemente no surja con mucha frecuencia que un valor sea opcional y tampoco sea parte de un todo más grande. Si la función requiere un cierto valor para hacer su trabajo, entonces esa función no debería aceptar un Optional. Si necesita encadenar operaciones que podrían no devolver un valor, abortando Nothingsi alguna función falla en el camino, puede encadenar llamadas flatMap, y si desea fallar con una excepción, puede usar get()en cualquier paso del camino o en el Fin de la cadena.

Si un valor es realmente opcional y una función hace dos cosas diferentes en función de su presencia o ausencia, es un olor a código a menos que la función sea una envoltura de dos funciones más pequeñas que hacen una cosa cada una, y esa combinación particular de decisiones es muy común.

No creo que sea tanto que esté mal, ya que es un caso de uso relativamente poco común.

Doval
fuente
5

No hay muchos idiomas que no admitan argumentos predeterminados, por lo que este no es un uso común. Personalmente, creo que su uso no es terrible, pero no será Java idiomático. Java, muy intencionalmente, no tiene argumentos predeterminados, para forzar el uso de sobrecarga, lo que tiene la ventaja de que el compilador verifica sus argumentos en lugar de requerir ifdeclaraciones dentro de la función.

En otras palabras, hará dos versiones diferentes de la consulta: una con un segundo nombre y otra sin él. Si puede hacerlo de manera concisa, usar una opción es una buena idea. Si de todos modos es lo suficientemente detallado como para quererlo en dos funciones separadas, también puede usar la sobrecarga y hacerlo idiomático.

Karl Bielefeldt
fuente