Y a-t-il une raison de ne pas utiliser Facultatif comme argument de méthode dans le cas où vous savez que l'argument est quelque chose qui peut ou non être nécessaire?

11

Avec Java 8, j'ai vu de plus en plus d'articles sur l'utilisation d'Option / Optional. Je comprends ce qu'ils essaient de représenter et j'en vois de nombreux exemples utilisés comme retours. Cependant, ce que je ne vois pas, c'est qu'ils sont utilisés comme arguments de méthode / fonction dans des langages qui n'ont pas la syntaxe des paramètres par défaut / facultatifs.

Y a-t-il une raison de ne pas utiliser Optionalcomme argument de méthode dans le cas où vous savez que l'argument est quelque chose qui peut ou non être nécessaire? Voici un exemple auquel je pourrais penser:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
Nicolas
la source
C'est une utilisation courante pour eux dans Haskell, qui n'a pas non plus d'arguments par défaut (currying pain).
Daniel Gratzer
Voir ma réponse à une question Stack Overflow connexe. En bref, Optionalest principalement destiné aux valeurs de retour qui peuvent être absentes. D'autres utilisations sont possibles, bien sûr, mais sont lourdes et sont probablement de mauvais style.
Stuart Marks

Réponses:

6

L' une des raisons est que sur le plan conceptuel, firstName, middleNameet lastNamesont logiquement un argument non pas trois. Ils font tous partie d'un ensemble plus grand, et on peut imaginer qu'ils sont presque toujours transmis ensemble. Dans les langages fonctionnels, ils seraient probablement transmis comme un tuple ou un enregistrement; Java en manque, ils seraient donc probablement agrégés dans une classe Name. Notez que si vous aviez besoin de composer des fonctions qui prennent et retournent des noms complets, vous ne pourriez pas le faire sans les agréger - vous ne pouvez retourner qu'une seule valeur, après tout.

Peut-être qu'il ne revient tout simplement pas très souvent qu'une valeur est facultative et ne fait pas partie d'un tout plus grand. Si la fonction requiert une certaine valeur pour faire son travail, alors cette fonction ne doit pas accepter un Optional. Si vous devez chaîner des opérations qui pourraient ne pas renvoyer de valeur, abandonner en Nothingcas d'échec d'une fonction en cours de route, vous pouvez chaîner les appels à flatMap, et si vous voulez échouer avec une exception, vous pouvez l'utiliser get()à n'importe quelle étape du processus ou à fin de chaîne.

Si une valeur est vraiment facultative et qu'une fonction fait deux choses différentes en fonction de sa présence ou de son absence, c'est une odeur de code, sauf si la fonction est un wrapper de deux fonctions plus petites qui font une chose chacune, et cette combinaison particulière de décisions est très courante.

Je ne pense pas que ce soit tellement mauvais que ce soit un cas d'utilisation relativement rare.

Doval
la source
5

Il n'y a pas beaucoup de langues qui ne prennent pas en charge les arguments par défaut, ce n'est donc pas un usage courant. Personnellement, je pense que votre utilisation n'est pas terrible, mais ça ne va pas être Java idiomatique. Java n'a pas intentionnellement d'arguments par défaut, pour forcer l'utilisation de la surcharge à la place, ce qui a l'avantage que le compilateur vérifie vos arguments au lieu d'exiger des ifinstructions à l'intérieur de la fonction.

En d'autres termes, vous allez créer deux versions différentes de la requête: une avec un deuxième prénom et une sans. Si vous pouvez le faire de manière concise, l'utilisation d'une option est une bonne idée. S'il est suffisamment verbeux pour que vous le souhaitiez de toute façon dans deux fonctions distinctes, vous pouvez également utiliser la surcharge et la rendre idiomatique.

Karl Bielefeldt
la source