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 Optional
comme 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)
java
functional-programming
java8
Nicolas
la source
la source
Optional
est 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.Réponses:
L' une des raisons est que sur le plan conceptuel,
firstName
,middleName
etlastName
sont 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 enNothing
cas 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'utiliserget()
à 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.
la source
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
if
instructions à 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.
la source