Apakah ada alasan untuk tidak menggunakan Opsional sebagai argumen metode dalam kasus di mana Anda tahu argumen itu sesuatu yang mungkin atau mungkin tidak diperlukan?


11

Dengan Java 8, saya telah melihat lebih banyak artikel tentang penggunaan Option / Opsional. Saya mengerti apa yang mereka coba wakili, dan saya melihat banyak contoh mereka digunakan sebagai pengembalian. Namun yang tidak saya lihat adalah mereka digunakan sebagai metode / argumen fungsi dalam bahasa yang tidak memiliki sintaks untuk parameter default / opsional.

Apakah ada alasan untuk tidak menggunakan Optionalmetode argumen dalam kasus di mana Anda tahu argumen itu sesuatu yang mungkin atau mungkin tidak diperlukan? Inilah contoh yang bisa saya pikirkan:

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

Ini adalah penggunaan umum untuk mereka di Haskell, yang juga tidak memiliki argumen default (currying pain).
Daniel Gratzer

Lihat jawaban saya untuk pertanyaan Stack Overflow terkait. Secara singkat, Optionaldimaksudkan terutama untuk nilai pengembalian yang mungkin tidak ada. Penggunaan lain mungkin, tentu saja, tetapi rumit dan cenderung gaya yang buruk.
Stuart Marks

Jawaban:


6

Salah satu alasannya adalah bahwa secara konseptual, firstName, middleName, dan lastNamesecara logis satu argumen, bukan tiga. Mereka semua adalah bagian dari keseluruhan yang lebih besar, dan orang dapat membayangkan bahwa mereka hampir selalu disatukan. Dalam bahasa-bahasa fungsional, mereka kemungkinan diteruskan sebagai tuple atau rekaman; Java tidak memiliki itu, jadi mereka mungkin akan digabungkan menjadi kelas Nama. Perhatikan bahwa jika Anda perlu membuat fungsi yang mengambil dan mengembalikan nama lengkap, Anda tidak akan bisa tanpa menggabungkannya - Anda hanya dapat mengembalikan satu nilai.

Mungkin itu hanya tidak muncul terlalu sering bahwa suatu nilai adalah opsional dan juga bukan bagian dari keseluruhan yang lebih besar. Jika fungsi membutuhkan nilai tertentu untuk melakukan tugasnya, maka fungsi itu tidak boleh menerima Optional. Jika Anda perlu untuk rantai operasi yang mungkin tidak mengembalikan nilai, dibatalkan dengan Nothingjika ada fungsi di sepanjang jalan gagal, Anda dapat membuat panggilan ke flatMap, dan jika Anda ingin gagal dengan pengecualian Anda dapat menggunakan get()di setiap langkah atau di ujung rantai.

Jika nilai benar-benar opsional dan fungsi melakukan dua hal berbeda berdasarkan ada atau tidaknya, itu adalah bau kode kecuali fungsi adalah pembungkus dari dua fungsi yang lebih kecil yang melakukan satu hal masing-masing, dan bahwa kombinasi keputusan tertentu sangat umum.

Saya tidak berpikir itu terlalu banyak sehingga itu salah karena ini adalah kasus penggunaan yang relatif tidak umum.


5

Tidak banyak bahasa yang tidak mendukung argumen default, jadi ini bukan penggunaan umum. Saya pribadi berpikir penggunaan Anda tidak buruk, tetapi itu tidak akan menjadi Java yang idiomatis. Java dengan sangat sengaja tidak memiliki argumen default, untuk memaksa penggunaan overloading sebagai gantinya, yang memiliki keuntungan dari kompiler memeriksa argumen Anda alih-alih membutuhkan ifpernyataan di dalam fungsi.

Dengan kata lain, Anda akan membuat dua versi kueri yang berbeda: satu dengan nama tengah dan satu tanpa. Jika Anda bisa melakukan itu secara ringkas, menggunakan opsi adalah ide yang bagus. Jika cukup jelas bahwa Anda menginginkannya dalam dua fungsi terpisah, Anda dapat menggunakan overloading dan membuatnya idiomatis.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.