Beberapa bahasa pemrograman seperti misalnya Scala memiliki konsep Option
tipe (juga disebut Maybe
), yang dapat mengandung nilai atau tidak.
Dari apa yang saya baca tentang mereka, mereka dianggap secara luas sebagai cara terbaik untuk menangani masalah ini daripada null
, karena mereka secara eksplisit memaksa programmer untuk mempertimbangkan kasus-kasus di mana mungkin tidak ada nilai daripada hanya meledak saat runtime.
Pengecualian yang diperiksa di Jawa di sisi lain tampaknya dianggap ide yang buruk, dan Jawa tampaknya menjadi satu-satunya bahasa yang digunakan secara luas yang mengimplementasikannya. Tetapi ide di balik mereka tampaknya agak mirip dengan Option
tipe, untuk secara eksplisit memaksa programmer untuk berurusan dengan fakta bahwa pengecualian mungkin dilemparkan.
Apakah ada beberapa masalah tambahan dengan Pengecualian yang diperiksa yang Option
tidak dimiliki tipe? Atau apakah ide-ide ini tidak sama dengan yang saya pikirkan, dan ada alasan bagus untuk memaksa penanganan eksplisit untuk Opsi dan bukan untuk Pengecualian?
sumber
Either e a
tipe data.Jawaban:
Karena
Option
s adalah komposer. Ada banyak metode yang berguna padaOption
yang memungkinkan Anda untuk menulis kode ringkas, sementara masih memungkinkan kontrol yang tepat pada aliran:map
,flatMap
,toList
,flatten
dan banyak lagi. Ini disebabkan oleh fakta bahwa ituOption
adalah sejenis monad tertentu, beberapa benda yang kita tahu betul bagaimana menyusunnya. Jika Anda tidak memiliki metode ini dan harus selalu mencocokkan polaOption
, atauisDefined
sering menelepon , mereka tidak akan berguna.Sebaliknya, sementara pengecualian yang diperiksa menambah keamanan, tidak banyak yang dapat Anda lakukan selain menangkapnya atau membiarkannya menggelembungkan tumpukan (dengan pelat tambahan dalam deklarasi tipe).
sumber
try {/* bunch of complex code involving calls to 50 different methods that may throw SomeCheckedException */} catch(SomeCheckedException e) {/* operation failed, do something */}
danfromMaybe someDefaultValue (something >>= otherThing >>= ...50 other functions that may return Nothing...)
apa sebenarnya? Selain fakta bahwa mantan memberi Anda rincian lebih lanjut tentang apa yang salah.Sementara terkait, objek pengecualian dan Mungkin tidak berurusan dengan jenis masalah yang sama.
Pengecualian
Pengecualian benar-benar bersinar ketika Anda harus berurusan dengan non-lokal dengan situasi luar biasa (yang dalam beberapa kasus terjadi kesalahan). Misalnya Anda mengurai csv, dan ingin melindungi diri sendiri dari garis dengan pemformatan yang salah. Tempat di mana Anda menemukan ada sesuatu yang salah mungkin beberapa panggilan fungsi menjauh dari iterasi garis. Jika Anda melempar pengecualian pada level terdalam (di mana Anda mengetahui tentang masalah format), Anda bisa menangkapnya dalam loop, mencatat kesalahan, dan melanjutkan ke baris berikutnya. Anda tidak perlu mengubah apa pun di sisa kode.
Pengecualian yang diperiksa menambah banyak rasa sakit karena semua fungsi antara harus menyatakan tipe yang bisa dibuang. Fitur ini mengalahkan tujuan awal, itulah sebabnya mereka tidak populer saat ini.
Mungkin benda
Mungkin objek harus dipilih ketika Anda dapat menangani "kegagalan" secara lokal. Dalam hal itu, mereka adalah pengganti untuk kode pengembalian + lulus dengan referensi api atau jenis yang dapat dibatalkan.
Keuntungan dari objek Maybe adalah Anda secara eksplisit menyatakan bahwa ada sesuatu yang salah. Dalam haskell, objek non mungkin harus memiliki nilai, atau program tidak akan dikompilasi.
Masalah dengan tipe nullable adalah Anda harus memeriksa null setiap saat agar benar-benar aman. Status "sesuatu mungkin salah" adalah yang standar.
Masalah dengan kode pengembalian + lewat ref apis adalah bahwa mereka kurang dapat dibaca oleh kebanyakan orang.
sumber
karena dengan
Maybe
Anda dapat menunda menangani kesalahan sampai Anda benar-benar membutuhkan nilai (yang mungkin beberapa metode panggilan)sedangkan pengecualian yang diperiksa perlu ditangani di lokasi panggilan
satu-satunya terbalik dari pengecualian adalah bahwa lebih banyak informasi dapat disampaikan tentang mengapa itu gagal (kecuali seseorang mengembangkan bidang
MaybeError
dengan throwable ketika itu kesalahan)sumber
Maybe
jenis dengan penanganan kesalahan. Pengecualian digunakan untuk melaporkan kesalahan, jenis opsi digunakan untuk mewakili hasil dari fungsi parsial. Fungsi sebagian yang dikembalikanNothing
bukanlah kesalahan.