Argümanın gerekebilecek veya gerekmeyebilecek bir şey olduğunu bildiğiniz durumlarda, İsteğe Bağlı yöntem argümanı olarak kullanılmamasının bir nedeni var mı?


11

Java 8 ile Option / İsteğe bağlı kullanımı hakkında daha fazla makale gördüm. Neyi temsil etmeye çalıştıklarını anlıyorum ve bunların birçok örneğinin geri dönüş olarak kullanıldığını görüyorum. Ancak ben görmüyorum onları varsayılan / isteğe bağlı parametreler sözdizimi olmayan dillerde yöntem / işlev bağımsız değişkenleri olarak kullanılıyor.

OptionalArgümanın gerekli olabilecek veya olmayabilecek bir şey olduğunu bildiğiniz durumda bir yöntem argümanı olarak kullanılmamasının bir nedeni var mı ? İşte aklıma gelen bir örnek:

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

Bu, Haskell'de onlar için yaygın bir kullanımdır, bu da varsayılan argümanlara sahip değildir (acıyı körüklemek).
Daniel Gratzer

İlgili Yığın Taşması sorusuna cevabımı görün . Kısaca, Optionalöncelikle bulunamayan dönüş değerleri için tasarlanmıştır. Diğer kullanımlar elbette mümkündür, ancak hantaldır ve muhtemelen zayıf bir stildir.
Stuart Marks

Yanıtlar:


6

Bunun bir nedeni kavramsal, yani firstName, middleNameve lastNamemantıksal olan bir argüman, üç değil. Hepsi daha büyük bir bütünün parçaları ve neredeyse her zaman birlikte geçtiklerini hayal edebiliyorlar. İşlevsel dillerde, muhtemelen bir kayıt ya da kayıt olarak geçerlerdi; Java bunlardan yoksundur, bu yüzden muhtemelen bir Name sınıfında toplanırlar. Tam adları alan ve döndüren işlevler oluşturmanız gerekiyorsa, bunları birleştirmeden yapamayacağınızı unutmayın - sonuçta yalnızca bir değer döndürebilirsiniz.

Belki de bir değerin isteğe bağlı olduğu ve daha büyük bir bütünün parçası olmadığı çok sık ortaya çıkmaz. İşlev , işini yapmak için belirli bir değer gerektiriyorsa , o işlev bir Optional. Değer döndürmeyebilecek işlemleri zincirlemeniz gerekiyorsa Nothing, yol boyunca herhangi bir işlev başarısız olursa aramaları zincirleyebilirsiniz, çağrıları zincirleyebilirsiniz flatMapve bir istisna ile başarısız olmak istiyorsanız get(), yolun herhangi bir adımında veya zincirin sonu.

Bir değer gerçekten isteğe bağlıysa ve bir işlev, varlığına veya yokluğuna bağlı olarak iki farklı şey yaparsa, işlev her biri bir şey yapan iki küçük işlevin bir sargısı değilse ve bu özel karar kombinasyonu çok yaygın değilse, bu bir kod kokusudur.

Nispeten yaygın olmayan bir kullanım durumu olduğu için yanlış olduğunu düşünmüyorum.


5

Varsayılan argümanları desteklemeyen çok fazla dil yoktur, bu nedenle bu yaygın bir kullanım değildir. Kişisel olarak kullanımınızın korkunç olmadığını düşünüyorum, ancak deyimsel Java olmayacak. Java çok kasıtlı olarak varsayılan argümanlara sahip değildir, bunun yerine aşırı yükleme kullanımını zorlar, bu da derleyicinin ifişlev içinde ifadeler istemek yerine argümanlarınızı kontrol etmesini sağlar.

Başka bir deyişle, sorgunun iki farklı sürümünü oluşturacaksınız: biri orta adı ve diğeri olmadan. Bunu kısa bir şekilde yapabiliyorsanız, bir seçenek kullanmak iyi bir fikirdir. Yine de iki ayrı işlevde olmasını isteyecek kadar ayrıntılı ise, aşırı yüklemeyi de kullanabilir ve deyimsel hale getirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.