Terkadang saya memiliki fungsi yang harus mengembalikan benar atau salah. Tetapi terkadang tiga nilai yang mungkin lebih masuk akal.
Dalam beberapa tesis bahasa kasus akan ditangani dengan bilangan bulat atau dengan pengecualian.
Misalnya, Anda ingin menangani usia pengguna jika ia berusia di atas 18 tahun. Dan Anda memiliki fungsi seperti ini.
if(user.isAdult(country_code)){
//Go On
}else{
// Block access or do nothing
}
Tetapi dalam beberapa kasus tergantung bagaimana aplikasi Anda dibangun saya bisa melihat kasus di mana bidang ulang tahun tidak lengkap. Maka fungsi ini harus mengembalikan sesuatu yang tidak ditentukan.
switch(user.isAdult()){
case true:
// go on
break;
case undetermined:
//Inform user birthday is incomplete
case false:
//Block access
}
Seperti yang saya katakan kita bisa mengatasinya dengan Pengecualian dan Int, tapi saya akan merasa cukup seksi untuk memiliki embeded yang benar, salah, tidak ditentukan dalam bahasa daripada menggunakan beberapa konstanta yang didefinisikan di rumah.
Jawaban:
Ini dapat ditangani dengan enum, bilangan bulat, simbol (misalnya, Lisp, Ruby), jenis yang dapat dibatalkan (gunakan null sebagai keadaan tak tentu), jenis opsi (misalnya, ML), atau beberapa konstruksi serupa - tergantung pada bahasa Anda.
Jadi, sementara contoh dan alasan Anda masuk akal, saya tidak dapat melihatnya sebagai daftar prioritas fitur bahasa untuk dikembangkan.
sumber
null
. Dalam C / C ++ Anda dapat mengembalikan enum.Saya belum melihat kasus di mana ini perlu. Dalam contoh yang Anda berikan, jika bidang itu diperlukan, seharusnya sudah divalidasi di tempat lain.
isAdult()
secara inheren adalah metode dua-negara: Anda salah atau tidak. Tidak perlu membuatnya melakukan apa pun kecuali mengembalikan false jika menemukan data yang tidak dapat ditangani. Contohnya:sumber
.isAdult()
meminta pengguna itu sendiri, jika itu yang Anda inginkan, dan itu akan bekerja lebih baik.benar, salah, tidak dikenal
ya Tidak mungkin
di C # Anda dapat menggunakan bool nullable (Anda dapat mundur dengan ketakutan sekarang)
dalam MS-SQL, Anda dapat menggunakan bidang bit yang dapat dibatalkan (ditto)
sumber
unknown
.Dalam C ++, ini bisa ditangani dengan tipe tidak-
bool
kembali, atau dengan melemparkan pengecualian. Jika Anda ingin tipe pengembalian tiga nilai, gunakan aenum
. Ini tidak seksi, tetapi berhasil, dan yang lebih penting Anda dapat melakukannya tanpa mengacaukan bahasa untuk kita semua.Memiliki nilai
bool
tiga akan menyebabkan masalah. Bagaimana Anda menanganibool foo; ... if (foo)...
, dengan asumsifoo
mungkin memiliki salah satu dari ketiga nilai tersebut? Ada keuntungan memilikibool
variabel sedemikian rupa sehingga justru salah satu darifoo
dan!foo
benar setiap saat. Ini membantu alasan tentang program.Lihat apa yang dilakukan orang dalam pemrosesan numerik ketika mereka mungkin mendapatkan
NaN
nilai. Ini rumit. Saya lebih suka tidak harus melaluinya untuk pemrosesan boolean biasa.Jika Anda ingin
.isAdult()
menangani informasi yang tidak mencukupi, lakukan itu secara internal, lalu kembalikan salah satutrue
ataufalse
. Jika tidak, setiap kali Anda menggunakannya, Anda perlu memeriksa kode kembali sebelum melakukan hal lain, dan menemukan cara untuk menanganinya. Itu berarti Anda harus memeriksa dokumen untuk melihat apakah suatu fungsi benar-benar melakukan apa yang dikatakan namanya, dan itu akan menjadi bencana bagi keterbacaan.sumber
Idenya cukup bermanfaat. Ada seluruh bidang yang ditujukan untuk menangani ketidakpastian yang disebut Fuzzy Logic .
Untungnya bagi kami programmer, Anda dapat menerapkan logika fuzzy dengan fitur bahasa standar.
Misalnya, dalam kasus yang Anda berikan, informasi yang tidak pasti mudah ditentukan dengan bertanya kepada pengguna. Jadi enum tri-state seperti yang Anda gambarkan akan bekerja dengan baik.
Ada segala macam cara lain untuk menjadi tidak pasti. Pertanyaan-pertanyaan tersebut meliputi:
Banyak dari pertanyaan-pertanyaan itu dapat diatasi dengan menggunakan probabilitas dalam kisaran 0,0 (salah) hingga 1,0 (benar), dan menerapkan matematika floating point.
Seorang ahli kimia komputasi dan ilmuwan komputer bernama David E. Shaw menerapkan hal semacam ini ke Wall Street dan sekarang bernilai sekitar $ 2,5 miliar. Jadi ya, ini berguna. :-)
sumber
Bertahun-tahun yang lalu saya bermain dengan beberapa algoritma yang keluar untuk menetapkan kepercayaan pada nilai-nilai. Menyenangkan. Pada akhirnya apa yang saya peroleh dari itu adalah bahwa boolean sering dibuat-buat. Benar-benar harus trilean nilai true / false / lainnya. Dalam eksperimen yang sepertinya mengarah pada kode "terbaik" untuk saya pada saat itu. Saya sejak menyerah dan melakukan apa yang dilakukan orang lain, sambil berpikir secara internal betapa lebih sederhana itu BISA jika kita berhenti melakukan hal-hal dengan cara lama yang sama ... :-)
sumber
Pernyataan Case atau Switch akan bekerja dengan baik untuk ini, dengan menggunakan bilangan bulat untuk menangani switch secara sewenang-wenang.
Juga, di Ruby, sementara 'nil' kembali sebagai false dalam beberapa keadaan, jika Anda menggunakan operator kesetaraan,
nil == false
kembalifalse
, sehingga Anda bisa menggunakan rubynil
untuk menangani logika ternary.sumber
Opsi lain dalam kasus Anda mungkin untuk membalikkan kontrol dengan menerapkan prinsip "katakan jangan tanya" dan mengubahnya menjadi (maaf tentang kata dewasa, penyumbatan otak):
di mana
OnlyAllowAdultsToLoginStrategy
mengimplementasikan antarmuka:sumber
void userIsAdult()
harus dilakukan Mungkin maksudmubool userIsAdult()
?Anak saya bertanya kepada saya bagaimana menerapkan tes yang mirip ini secara efisien. Bendera yang diuji hanya benar / salah, tetapi korek api memiliki tiga status (Pasti benar, pasti salah, atau saya tidak peduli). Tentu saja ini dapat diimplementasikan dengan struktur data 2bit dan sedikit memutar-mutar, tetapi kode semacam itu benar-benar perlu dikomentari karena tujuannya tidak mudah untuk dilihat hanya dengan melihat kode.
sumber
C telah menerapkan fitur ini di sebagian besar fungsi perpustakaan. mis. strcmp membandingkan 2 string dan mengembalikan 0 jika mereka sama, 1 (yaitu bilangan bulat positif) jika yang pertama 'lebih besar' dari yang ke-2, dan -1 (yaitu bilangan negatif apa pun) jika yang kedua lebih besar dari yang pertama .
Pendekatan yang sama dapat digunakan di tempat lain, + / 0 / - sebagai tri-state Anda. Ini juga memungkinkan Anda melakukan logika boolean pada nilai-nilai jika Anda tahu 0 jika salah dan nilai lainnya benar.
sumber
Untuk C ++, Boost sebenarnya mengimplementasikan Tribool yang dideskripsikan sebagai:
sumber
Kotak centang VB6 memiliki kemampuan ini. Nilai kotak centang bisa 0 = tidak aktif, 1 = aktif, 2 = berwarna abu-abu
sumber