Untuk beberapa sistem, nilai waktu 9999-12-31 digunakan sebagai "akhir waktu" sebagai akhir waktu yang dapat dihitung komputer. Tetapi bagaimana jika itu berubah? Bukankah lebih baik mendefinisikan waktu ini sebagai variabel bawaan?
Dalam bahasa pemrograman C dan lainnya, biasanya ada variabel seperti MAX_INT
atau mirip untuk mendapatkan nilai terbesar yang bisa dimiliki integer. Mengapa tidak ada fungsi yang sama MAX_TIME
yaitu mengatur variabel ke "akhir waktu" yang untuk banyak sistem biasanya adalah 9999-12-31. Untuk menghindari masalah hardcoding ke tahun yang salah (9999) dapatkah sistem ini memperkenalkan variabel untuk "akhir waktu"?
** Contoh nyata **
End of validity date: 31/12/9999.
(dokumen resmi terdaftar seperti ini) Blogger ingin menulis halaman yang selalu di atas, halaman selamat datang. Jadi diberikan tanggal sejauh mungkin di masa depan:
3000? Ya, halaman sambutan yang Anda hadapi diposting pada 1 Januari 3000. Jadi halaman ini akan disimpan di bagian atas blog selamanya =) Ini sebenarnya diposting pada 31 Agustus 2007.
Jawaban:
Tanyakan pada diri Anda mengapa Anda perlu variabel seperti itu di tempat pertama.
Kemungkinan besar, Anda berbohong tentang data Anda: setiap kali Anda membutuhkan variabel "akhir waktu", Anda tidak mengacu pada akhir waktu yang sebenarnya; melainkan Anda mengungkapkan hal-hal seperti "tidak ada batas atas untuk tanggal ini", "acara ini berlanjut tanpa batas waktu", atau serupa.
Maka solusi yang benar adalah dengan mengekspresikan maksud ini secara langsung alih-alih mengandalkan nilai ajaib: gunakan jenis tanggal yang dapat dibatalkan (di mana
null
menunjukkan "tidak ada tanggal akhir yang ditetapkan"), tambahkan bidang boolean "tidak terbatas", gunakan pembungkus polimorfik (yang dapat dapat berupa tanggal nyata atau nilai "tidak terbatas" khusus), atau apa pun yang ditawarkan oleh bahasa pemrograman Anda.Tentu saja, solusi yang tepat tidak selalu layak, jadi Anda mungkin akhirnya menggunakan nilai ajaib, tetapi ketika Anda melakukannya, Anda harus memutuskan nilai yang sesuai berdasarkan per-kasus, karena tanggal mana yang dilakukan dan tidak masuk akal tergantung pada domain yang Anda modelkan - jika Anda menyimpan cap waktu log, 01/01/2999 adalah "akhir waktu" yang masuk akal; kemungkinan aplikasi Anda masih digunakan hampir 1000 tahun dari sekarang, menurut saya, praktis nol. Pertimbangan serupa berlaku untuk aplikasi kalender. Tetapi bagaimana jika perangkat lunak Anda menangani data ilmiah, katakanlah, prediksi jangka panjang tentang iklim Bumi? Mereka mungkin benar-benar ingin melihat seribu tahun ke depan. Atau selangkah lebih maju; astronomi, bidang yang sangat masuk akal dalam rentang waktu yang sangat besar dalam urutan miliaran tahun, baik ke jalan dan masa depan. Bagi mereka, 01/01/2999 adalah maksimum sewenang-wenang yang sangat konyol. OTOH, sistem kalender yang mampu menangani rentang waktu sepuluh triliun tahun ke depan hampir tidak praktis untuk sistem pelacakan penunjukan dokter gigi, jika hanya karena kapasitas penyimpanan.
Dengan kata lain, tidak ada pilihan tunggal terbaik untuk nilai yang salah dan sewenang-wenang menurut definisi. Inilah sebabnya mengapa sangat tidak biasa untuk melihat yang didefinisikan dalam bahasa pemrograman apa pun; yang biasanya tidak menamakannya "akhir waktu", melainkan sesuatu seperti
DATE_MAX
(atauDate.MAX
), dan menganggapnya sebagai "nilai terbesar yang dapat disimpan dalam tipe data tanggal", bukan "akhir zaman" atau "tanpa batas".sumber
null
dalam hal ini tidak digunakan sebagai nilai khusus, itu digunakan sebagai makna yang benarnull
, yaitu "hilang". Jadi jika bidang AndaExpiryDate
, mana yang lebih benar:null
(artinya tidak ada tanggal kedaluwarsa) atauEND_OF_TIME
(yang tidak ada, sejauh yang kami tahu). Jelasnull
atauNoValue
sesuatu yang serupa adalah solusi yang lebih baik.Sebagai sebuah industri, kita telah dikenal picik dan sewenang-wenang dalam upaya menyelamatkan beberapa byte misalnya
31 Des 99IMHO, taruhan terbaik adalah tetap menggunakan tingkat abstraksi utama yang sesuai pada 'tanggal maksimum', dan berharap solusi umum telah mengatasi masalah ini sebelum waktunya tiba.
misalnya dalam .NET, DateTime.MaxValue sewenang-wenang
23:59:59.9999999, December 31, 9999, exactly one 100-nanosecond tick before 00:00:00, January 1, 10000
. Jadi, jika asumsi saya tentang umur panjang saya salah, dan tahun 10.000 tiba, saya agak berharap bahwa kompilasi ulang aplikasi saya dengan versi kerangka kerja yang lebih baru akan meluasDateTime.MaxValue
(misalnya dengan mengubah jenis yang mendasarinya) ke nilai sewenang-wenang baru dan menendang masalah lebih jauh di jalan selama beberapa milenium.Edit
(Memperkuat poin tdammers 'bahwa daripada menipu tanggal buatan, bahwa lebih tepat untuk secara eksplisit menyoroti fakta kepada konsumen bahwa kita tidak memiliki tanggal akhir.)
Sebagai alternatif untuk menggunakan
null
, yang memiliki konsekuensi negatif menjadi tipe yang kompatibel dengan semua jenis referensi (termasuk. Net Nullable`), yang kemungkinan akan menyebabkan masalah NRE pada konsumen yang lupa untuk memeriksa, dalam bahasa FP, adalah hal biasa untuk menggunakan Opsi atau Mungkin Ketik pembungkus di sekitar nilai yang mungkin, atau mungkin tidak dikembalikan.Kode palsu:
Manfaat melakukan ini adalah memaksa konsumen untuk bernalar atas kedua kasus. Pencocokan pola juga biasa di sini:
sumber
NaT
" nilai, dll.Anda mungkin menginginkan
algebraic data type
varian dengan infinite besardate
. Kemudian tentukan perbandingan, di manainfinite
varian akan selalu lebih besar daripada yang laindate
.Contoh dalam Scala:
http://ideone.com/K5Kuk
sumber
Menyimpan waktu Anda sebagai 64 bit IEE754 angka floating point presisi ganda, dan Anda dapat menggunakan
+INF
. Jangan gunakan presisi tunggal, itu hanya akurat hingga 7 digit yang agak rendah untuk kencan.sumber
Cocoa / Objective-C memiliki metode pabrik [NSDate distantPast] dan [NSDate distantFuture] yang mewakili jenis barang yang Anda maksud.
Nilai yang dikembalikan oleh implementasi saat ini adalah konstanta yang mewakili sekitar 0 AD dan 4000 AD, meskipun ini tidak dijamin atau didokumentasikan.
sumber
Biasanya tidak ada nilai seperti itu, karena itu tidak akan berguna sebagai bahasa konstruksi.
MAX_INT
dan kerabatnya semua melayani tujuan. Mereka dapat digunakan dalam kode Anda untuk memeriksa terhadap luapan. Ini berguna jika Anda akan membuat dan mengelola objek data besar dalam array, vektor, apa pun. Ini juga merupakan nilai spesifik platform yang cukup.Kasus penggunaan untuk
MAX_DATE
nilai lebih sulit dilihat. Biasanya ini hanya nilai-nilai, mereka tidak digunakan sebagai bagian dari struktur program, sehingga nilai yang berputar-putar tidak akan memiliki konsekuensi yang merusak bagi program (meskipun mungkin untuk data). Juga, tipe tanggal dan waktu dalam C, C ++ dll. Biasanya lebih tegas didefinisikan; dan orang-orang yang menulis program tidak perlu khawatir bahwa itu akan berubah di antara platform.sumber
Pada satu proyek yang kami lakukan, kami memiliki situasi di mana ukuran beberapa database dilakukan dengan cara yang tidak akan berkelanjutan setelah 30 tahun menggunakan perangkat lunak. Ketika klien bertanya kepada insinyur utama kami pada saat itu: "Ya, apa yang akan kita lakukan setelah 30 tahun menggunakan perangkat lunak Anda?" Insinyur utama kami, dingin seperti mentimun, menjawab sambil mengangkat bahu: "Kami akan pergi dan minum bir!"
Intinya, gunakan saja tanggal yang cukup jauh di masa depan. Kemungkinan perangkat lunak Anda akan ditingkatkan atau diganti saat itu. :)
sumber