Tipe data terbaik untuk menyimpan variabel tiga atau tiga variabel

13

Penafian: Saya tahu bahwa tipe data sedikit subjektif untuk bahasa scripting / pemrograman yang Anda gunakan, saya suka menulis dengan Python sebagai pilihan; meskipun saya senang mendengar tentang lanugage / implementasi.

Apa tipe data terbaik untuk menyimpan variabel tiga negara? Sesuatu yang mampu atau mewakili Positif, Netral, dan Negatif.

Contoh: Integer -1, 0, 1.

  • Pro: Sangat ringkas.
  • Pro: Berpotensi efisien, Dapat disimpan sebagai integer bertanda 2-bit tunggal.
  • Pro: dapat digunakan sebagai skala, seperti pengganda titik mengambang.

Contoh 2: 0, null, 1(atau permutasi ada)

  • Pro: Use case yang tidak netral bisa berupa biner.
  • Con: Membutuhkan datatype dinamis
  • Con: Berpotensi tidak ringkas.

Contoh 3: +, (string kosong),-

  • Pro: Sangat ringkas.
  • Con: Dapat menggunakan logika string untuk menentukan status.
  • Pro ?: Representasi grafis intuitif.

Mungkin ada beberapa logika biner pintar yang dapat melakukan sesuatu yang pintar yang bahkan tidak bisa saya bayangkan, mungkin ada terlalu banyak pertimbangan yang bergantung pada use case.

Juga, apakah ada pertimbangan ketika mengadaptasi status terner untuk disimpan dalam mesin basis data? Seperti Innodb untuk referensi.

ThorSummoner
sumber
12
Enum : python , java , C # , C , C ++ , go ...
Ibidem, tapi saya akan menambahkan bahwa dalam banyak bahasa, jenis yang disebutkan memberi Anda lebih banyak keamanan daripada mencoba menyemir mereka menjadi beberapa jenis lainnya.
Blrfl
4
Pertanyaan ini sangat tergantung pada use-case. Secara umum, semua pilihan implementasi yang tercantum tampaknya sesuai untuk beberapa tujuan yang berbeda, pada waktu yang berbeda.
rwong
2
Dalam. NET Anda dapat menggunakan boolean yang dapat dibatalkan. Sebagian besar database akan memungkinkan Anda untuk menyimpan boolean (atau bit seperti yang sering disebut) dengan status nullable. Anda juga dapat menggunakan arang untuk penyimpanan. Char akan memungkinkan lebih banyak ruang di lain waktu tanpa harus mengubah mekanisme penyimpanan.
Adam Zuckerman
1
Pointer ke bool juga bisa digunakan. Bool dipaksa ke 0 dan 1 dan jika pointer NULL Anda memiliki status ketiga. Tergantung pada langauge tentu saja.
Devolus

Jawaban:

7

Terlepas dari enum yang merupakan cara yang jelas dan paling jelas untuk mengekspresikan ini, sistem yang digunakan untuk sistem interoperable di mana enum spesifik bahasa tidak dapat diekspresikan adalah opsi -1/0/1.

Anda mungkin ingin mencoba bitmask, di mana 0 berarti 0, 1 berarti 'bit 2 set' dan 2 berarti 'bit 3 set' (yaitu Anda memiliki 3 bit yang bisa hidup atau mati. Selama Anda tidak mendefinisikan 3, atau bit 1 dan 2 ditetapkan, maka Anda baik. Opsi ini terbaik jika Anda berpikir Anda mungkin perlu 4 atau lebih bendera di masa depan sebagai 4, 8, 16 dll menetapkan bit berikutnya).

Semua ini masuk ke dalam tipe data 8-bit tunggal sehingga tidak akan membuang-buang memori atau memerlukan konversi (seperti sistem berbasis karakter, kadang-kadang karakter 16-bit digunakan, kadang-kadang 8-bit tergantung pada platform Anda).

Saya tidak akan menganggap null dalam hal apa pun. Mungkin dalam database, tetapi hanya di mana saya bisa menjamin sistem memiliki dukungan yang berbeda untuk NULLs, dan bahkan kemudian itu bisa menjadi rawan kesalahan jika seseorang tidak secara eksplisit membuat perbedaan dan berakhir dengan 0 ketika itu benar-benar nol.

gbjbaanb
sumber
Jawaban terbaik di sini IMO. NULL bisa jadi itu tidak ditambahkan dalam DB, bukan bahwa negaranya adalah 'NULL' memiliki -1,0,1 dan mungkin NULL - null secara jelas menunjukkan bahwa bidang tersebut tidak pernah diisi!
Ken
3

Saya tidak bermaksud menulis jawaban yang jelas untuk pertanyaan ini secara langsung; seperti yang saya sampaikan di atas, pertanyaan ini sangat tergantung pada use-case. Secara umum, semua pilihan implementasi yang tercantum tampaknya sesuai untuk beberapa tujuan yang berbeda, pada waktu yang berbeda.

Namun, saya ingin menarik perhatian Anda pada prinsip-prinsip yang mendasari dan latar belakang pengetahuan ini, sehingga Anda dapat membuat keputusan sendiri berdasarkan informasi.


Pada catatan yang lebih ringan, baca juga lelucon ini: "Seorang pengusaha bertanya kepada seorang akuntan; apa itu dua tambah dua?"

Permintaan maaf kepada semua akuntan dan non-akuntan. Penyebutan saya tentang lelucon ini dimaksudkan untuk menyoroti kebebasan dari sesuatu yang akan kita definisikan segera, dan tanggung jawab dan konsekuensi (keduanya dalam arti logis) yang mengikutinya.


Pertanyaan: apa tabel kebenaran dari logika tiga nilai?

Menjawab:

... bangkit dari kursinya, pergi ke pintu, menutupnya, kembali dan duduk. Bersandar di meja,

... Dan mengeluarkan grafik yang digambar tangan di selembar kertas.

Operasi: Logis Dan - Rahasia - Draft untuk Q3 2014

   FalseTrue Third
FalseFalseFalse?????
True FalseTrue ?????
Third???????????????

... dia berkata dengan suara rendah, " seberapa besar nilai sihir yang kamu inginkan?"

Seorang perancang grafis bertanya kepada seorang programmer, "Bisakah Anda memberi contoh logika tiga nilai?"

Programmer menjawab, "Bisakah Anda memberi saya dua warna, yang sama hitam dan putihnya?"

Desainer grafis: "jadi ... hitam, dan putih?"

Programmer: "tepatnya. Sekarang saya akan memberi warna ketiga - tetapi saya harus menentukannya sebagai nomor ARGB. Saya harap Anda tidak keberatan."

Desainer grafis: "Saya bekerja dengan ARGB setiap hari ..."

Black#FF000000
White#FFFFFFFF
Nothing#00000000

Ucapan. Di atas, Hitam dan Putih adalah warna yang sepenuhnya buram. Warna ketiga, Tidak ada, sepenuhnya transparan. Ketika dicampur bersama dalam berbagai rasio, Hitam dan Putih bercampur menjadi berbagai abu-abu, tetapi mencampur dalam Tidak ada yang tidak mengubah apa pun.

rwong
sumber
Saya cukup tertarik dengan penggunaan tabel kebenaran, Sekali lagi membuka mata saya tentang makna di balik pertanyaan saya sendiri.
ThorSummoner
1

Jika ketiga keadaan yang mungkin memiliki makna yang melekat, gunakan sesuatu yang cocok untuk makna yang melekat itu. Sebagai contoh, jika keadaan yang memungkinkan adalah 1, 2 atau 3, atau jika 100, 200 dan 300, gunakan bilangan bulat. Jika status yang memungkinkan adalah ya, tidak, atau tidak dikenal, Anda dapat menggunakan boolean opsional atau pointer ke objek boolean, dengan kemungkinan tidak memiliki nilai, nilai "ya", atau nilai "tidak". Meskipun beberapa orang mungkin tidak menyukainya.

Jika ada cara yang jelas bagaimana bilangan bulat dapat ditafsirkan sebagai status yang mungkin, Anda mungkin menggunakan bilangan bulat. Katakan fungsi perbandingan yang menyatakan "kurang", "sama", "lebih besar" mungkin menggunakan -1, 0 dan +1. Meskipun beberapa orang mungkin tidak menemukan apa yang Anda temukan jelas.

Jika ada cara yang jelas bagaimana huruf dapat diartikan sebagai keadaan yang memungkinkan, Anda dapat menggunakan karakter. Misalnya, jika status Anda "merah", "hijau" atau "biru", Anda dapat menggunakan huruf 'r', 'g' dan 'b'. Sekali lagi, apa yang jelas bagi Anda ...

Jenis yang disebutkan selalu merupakan kemungkinan. Suatu string selalu merupakan suatu kemungkinan, tetapi Anda kehilangan tipe memeriksa dalam kebanyakan bahasa.

Beberapa orang menggunakan tiga nilai boolean untuk mewakili "is in state 1", "is in state 2", "is in state 3".

Apa pun yang Anda lakukan, Anda harus dibimbing dengan mencoba menggunakan sesuatu yang jelas dan dapat dimengerti, tidak membuat Anda mendapat masalah jika tiba-tiba Anda memiliki empat negara, dan mari kompilator menemukan kesalahan sebanyak mungkin.

gnasher729
sumber
0

Apa tipe data terbaik untuk menyimpan variabel tiga negara? Sesuatu yang mampu atau mewakili Positif, Netral, dan Negatif.

Ini sangat tergantung pada bahasa, apa yang Anda lakukan, tingkat abstraksi (yang juga tergantung pada bahasa dan sebagainya).

Saya terutama menggunakan C ++ dan ada banyak pilihan di sini. Yang paling sederhana adalah enum tribool_state { false_val, true_val, undetermined_val }. Ini akan cukup jika skenario penggunaan Anda adalah fungsi tunggal yang mengembalikan jenis nilai ini.

Saya mungkin akan menggunakan boost::optional<bool>jika saya ingin menyatakan hasil boolean yang mungkin tidak mungkin didapat (mis. Periksa apakah data jaringan yang diterima sudah lengkap, kemudian proses nilai boolean jika itu yang terjadi).

Saya akan menggunakan boost::tribooljika saya ingin mengungkapkan hasil boolean fuzzy yang didukung penuh tri-state logika boolean (misalnya true || indetermined -> true, false && indetermined -> false, true && indetermined -> indetermineddan sebagainya).

Demikian pula, dalam python, saya akan menggunakan seperangkat konstanta, atau kelas (sekali lagi, tergantung pada jenis semantik / operasi yang saya perlukan dalam kode klien):

Sebagai contoh, saya akan menggunakan:

POSITIVE, INDETERMINED, NEGATIVE = 1, 0, -1

jika saya memiliki kasus sederhana dari fungsi yang mengembalikan satu dari tiga hasil.

Jika saya memiliki pustaka penuh yang membutuhkan logika boolean tri-state, saya akan mengimplementasikan tipe nilai sebagai kelas.

utnapistim
sumber
0

Jika Anda menggunakan Java, Anda bisa menggunakan objek Boolean: karena itu adalah objek dan berisi boolean, ia bisa menyimpan nilai true, false, dan null. Saya tidak yakin apakah ini cara terbaik.

Daniel
sumber
-6

Di Microsoft.NET, ada tipe "Tuple" yang dapat digunakan untuk kebutuhan Anda. Kunjungi http://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx

Shadakshari
sumber
Per halaman itu: Sebuah tupel adalah struktur data yang memiliki jumlah dan urutan elemen tertentu. Contoh tuple adalah struktur data dengan tiga elemen (dikenal sebagai 3-tuple atau triple) yang digunakan untuk menyimpan pengidentifikasi seperti nama seseorang di elemen pertama, satu tahun di elemen kedua, dan pendapatan orang tersebut untuk tahun itu di elemen ketiga. .NET Framework secara langsung mendukung tupel dengan satu hingga tujuh elemen. Selain itu, Anda bisa membuat tupel dari delapan elemen atau lebih dengan menumpuk objek tuple di properti Istirahat dari objek Tuple <T1, T2, T3, T4, T5, T5, T6, T7, TRest>.
Adam Zuckerman
1
Yang mengatakan bahwa tuple dapat menyimpan semua jenis hingga satu oktaf (8 dimensi).
Adam Zuckerman
Pilihan Lang saya, Python, juga berisi tipe data tuple, yang menurut saya sedikit bacaan , bagi saya, bahwa tuple sesuai untuk data ternary. Atau berpotensi nilai indeks tuple akan menjadi data yang akan disimpan untuk kasus penggunaan dan tuple akan lebih seperti konstanta. Sesuatu tentang mereferensikan global, atau bahkan konstanta yang dilokalisasikan oleh indeks sepertinya merupakan praktik yang buruk bagi saya, kecuali jika Anda berada di bawah kendala yang melarang kemewahan.
ThorSummoner
2
Sebuah tuple adalah tipe data yang dapat menyimpan banyak elemen, sesuatu seperti struct, hanya didefinisikan secara dinamis. Jadi itu akan menyimpan 3 variabel dari jenis yang diinginkan OP. Itu tidak berfungsi untuk memberikan batasan pada konten yang diinginkannya.
gbjbaanb