Banyak bahasa menyukai C++
,, C#
dan Java
memungkinkan Anda membuat objek yang mewakili tipe sederhana seperti integer
atau float
. Menggunakan antarmuka kelas, Anda dapat menimpa operator dan melakukan logika seperti memeriksa jika nilai melebihi aturan bisnis 100.
Saya bertanya-tanya apakah mungkin dalam beberapa bahasa untuk mendefinisikan aturan ini sebagai penjelasan atau atribut dari variabel / properti.
Misalnya, C#
Anda dapat menulis:
[Range(0,100)]
public int Price { get; set; }
Atau mungkin di dalam C++
kamu bisa menulis:
int(0,100) x = 0;
Saya belum pernah melihat hal seperti ini dilakukan, tetapi mengingat seberapa tergantung kita pada validasi data sebelum penyimpanan. Aneh bahwa fitur ini belum ditambahkan ke bahasa.
Bisakah Anda memberi contoh bahasa di mana ini mungkin?
java
c#
c++
annotations
attributes
Reactgular
sumber
sumber
data Bool = True | False
dan untuk apa yang Anda inginkan, Anda dapat mengatakandata Cents = 0 | 1 | 2 | ...
memiliki lihat "Tipe Data Aljabar" (yang seharusnya lebih tepat disebut tipe hindley-milner tetapi orang-orang bingung dengan inferensi tipe yang mengganggu) en.wikipedia.org/wiki/Algebraic_data_typetype
kata kunci dalam Pascal. Orientasi objek lebih merupakan pola desain daripada properti "atomar" dari bahasa pemrograman.Jawaban:
Pascal memiliki tipe subrange, yaitu mengurangi jumlah angka yang masuk ke dalam variabel.
Ada juga memiliki gagasan rentang: http://en.wikibooks.org/wiki/Ada_Programming/Types/range
Dari Wikipedia ....
bisa juga dilakukan
Dan di sinilah ia menjadi dingin
C tidak memiliki tipe subrange yang ketat, tetapi ada cara untuk meniru satu (setidaknya terbatas) dengan menggunakan bitfield untuk meminimalkan jumlah bit yang digunakan.
struct {int a : 10;} my_subrange_var;}
. Ini dapat berfungsi sebagai batas atas untuk konten variabel (secara umum saya akan mengatakan: jangan gunakan bitfield untuk ini , ini hanya untuk membuktikan suatu hal).Banyak solusi untuk tipe integer panjang sewenang-wenang dalam bahasa lain lebih tepatnya terjadi pada tingkat pustaka, yaitu C ++ memungkinkan untuk solusi berbasis template.
Ada bahasa yang memungkinkan untuk memantau keadaan variabel dan menghubungkan pernyataan untuk itu. Misalnya dalam Clojurescript
Fungsi
mytest
dipanggil ketikaa
telah berubah (viareset!
atauswap!
) memeriksa apakah kondisi terpenuhi. Ini bisa menjadi contoh untuk menerapkan perilaku subrange dalam bahasa yang mengikat akhir (lihat http://blog.fogus.me/2011/09/23/clojurescript-watchers-and-validators/ ).sumber
for y in Year_Type loop ...
menghilangkan masalah seperti buffer overflows.Ada juga adalah bahasa yang memungkinkan batasan untuk tipe sederhana, sebenarnya di Ada itu praktik yang baik untuk menentukan tipe Anda sendiri untuk program Anda untuk menjamin kebenaran.
Itu digunakan untuk waktu yang lama oleh DoD, mungkin masih tapi saya sudah lupa penggunaannya saat ini.
sumber
Lihat Membatasi rentang tipe nilai dalam C ++ untuk contoh cara membuat tipe nilai rentang-diperiksa dalam C ++.
Ringkasan eksekutif: Gunakan templat untuk membuat tipe nilai yang memiliki nilai minimum dan maksimum bawaan, yang dapat Anda gunakan seperti ini:
Anda bahkan tidak benar-benar membutuhkan templat di sini; Anda bisa menggunakan kelas dengan efek yang sama. Menggunakan templat memungkinkan Anda menentukan jenis yang mendasarinya. Juga, penting untuk dicatat bahwa tipe di
percent
atas tidak akan menjadifloat
, tetapi merupakan contoh dari template. Ini mungkin tidak memenuhi aspek 'tipe sederhana' dari pertanyaan Anda.Tipe sederhana hanya itu - sederhana. Mereka sering digunakan sebagai blok bangunan untuk membuat alat yang Anda butuhkan daripada digunakan secara langsung.
sumber
Beberapa bentuk terbatas dari niat Anda adalah setahu saya mungkin di Jawa dan C # melalui kombinasi Anotasi dan Pola Proksi Dinamis (terdapat implementasi bawaan untuk proxy dinamis di Jawa dan C #).
Versi Java
Anotasi:
Kelas Wrapper membuat instance Proxy:
InvocationHandler berfungsi sebagai bypass pada setiap panggilan metode:
Contoh-Antarmuka untuk Penggunaan:
Metode Utama:
Keluaran:
C # -Versi
Anotasi (dalam C # disebut atribut):
Sub-Kelas DynamicObject:
ExampleClass:
Pemakaian:
Kesimpulannya, Anda melihat bahwa Anda bisa mendapatkan sesuatu seperti itu untuk bekerja di Jawa , tetapi itu tidak sepenuhnya nyaman, karena
Kemampuan kelas DynamicObject di C # menghapus batasan antarmuka, seperti yang Anda lihat dalam implementasi C #. Sayangnya, perilaku dinamis ini menghapus keamanan tipe statis dalam kasus ini, jadi pemeriksaan runtime diperlukan untuk menentukan apakah metode panggilan pada proxy dinamis diizinkan.
Jika batasan tersebut dapat diterima untuk Anda, maka ini dapat berfungsi sebagai dasar untuk penggalian lebih lanjut!
sumber
public virtual int Min { get; private set; }
adalah trik bagus yang akan mempersingkat kode Anda secara signifikanKisaran adalah kasus khusus dari invarian. Dari Wikipedia:
Rentang
[a, b]
dapat dideklarasikan sebagai variabel x bertipeInteger
dengan invarian x> = a dan x <= b .Oleh karena itu, jenis subrange Ada atau Pascal tidak sepenuhnya diperlukan. Mereka dapat diimplementasikan dengan tipe integer dengan invarian.
sumber
Fitur khusus untuk tipe rentang terbatas tidak diperlukan dalam C ++ dan bahasa lain dengan sistem tipe kuat.
Di C ++, sasaran Anda dapat dipenuhi relatif hanya dengan tipe yang ditentukan pengguna . Dan dalam aplikasi di mana berbagai jenis terbatas diinginkan, mereka hampir tidak cukup . Sebagai contoh, seseorang juga ingin kompiler memverifikasi bahwa perhitungan unit fisik ditulis dengan benar, sehingga kecepatan / waktu menghasilkan akselerasi, dan mengambil akar kuadrat dari akselerasi / waktu menghasilkan kecepatan. Melakukan hal ini dengan mudah membutuhkan kemampuan untuk mendefinisikan sistem tipe, tanpa secara eksplisit menyebutkan setiap tipe yang bisa muncul dalam formula. Ini bisa dilakukan di C ++ .
sumber