Sistem tipe statis adalah tentang mencegah penggunaan data yang salah.
Ada beberapa contoh jelas dari jenis yang melakukan ini:
- Anda tidak bisa mendapatkan bulan UUID
- Anda tidak dapat melipatgandakan dua string.
Ada contoh yang lebih halus
- Anda tidak dapat membayar untuk sesuatu menggunakan panjang meja
- Anda tidak dapat membuat permintaan HTTP menggunakan nama seseorang sebagai URL.
Kami mungkin tergoda untuk menggunakan double
harga dan panjang, atau menggunakan string
untuk nama dan URL. Tetapi melakukan itu merongrong sistem tipe kami yang mengagumkan, dan memungkinkan penyalahgunaan ini untuk lulus pemeriksaan statis bahasa.
Membuat pound-detik bingung dengan Newton-detik dapat memiliki hasil yang buruk saat runtime .
Ini khususnya masalah dengan string. Mereka sering menjadi "tipe data universal".
Kami biasanya digunakan untuk antarmuka teks dengan komputer, dan kami sering memperluas antarmuka manusia (UI) ini ke antarmuka pemrograman (API). Kami menganggap 34.25 sebagai karakter 34.25 . Kami menganggap tanggal sebagai karakter 05-03-2015 . Kami menganggap UUID sebagai karakter 75e945ee-f1e9-11e4-b9b2-1697f925ec7b .
Tetapi model mental ini membahayakan abstraksi API.
Kata-kata atau bahasanya, sebagaimana ditulis atau diucapkan, tampaknya tidak memainkan peran apa pun dalam mekanisme pemikiran saya.
Albert Einstein
Demikian pula, representasi tekstual tidak boleh memainkan peran apa pun dalam mendesain tipe dan API. Waspadalah string
! (dan tipe "primitif" yang terlalu umum lainnya)
Jenis berkomunikasi "operasi apa yang masuk akal."
Sebagai contoh, saya pernah bekerja pada klien ke HTTP REST API. REST, dilakukan dengan benar, menggunakan entitas hypermedia, yang memiliki hyperlink yang menunjuk ke entitas terkait. Di klien ini, tidak hanya entitas yang diketik (mis. Pengguna, Akun, Berlangganan), tautan ke entitas itu juga diketik (UserLink, AccountLink, SubscriptionLink). Tautan-tautan itu sedikit lebih dari sekadar pembungkus Uri
, tetapi jenis-jenis yang terpisah membuatnya tidak mungkin untuk mencoba menggunakan AkunLink untuk menjemput seorang Pengguna. Seandainya semuanya menjadi Uri
s - atau bahkan lebih buruk, string
- kesalahan ini hanya akan ditemukan saat runtime.
Demikian juga, dalam situasi Anda, Anda memiliki data yang hanya digunakan untuk satu tujuan: untuk mengidentifikasi suatu Operation
. Seharusnya tidak digunakan untuk hal lain, dan kita seharusnya tidak mencoba mengidentifikasi Operation
dengan string acak yang kami buat. Membuat kelas terpisah menambah keterbacaan dan keamanan kode Anda.
Tentu saja, semua hal baik bisa digunakan berlebihan. Mempertimbangkan
berapa banyak kejelasan yang ditambahkan ke kode Anda
seberapa sering digunakan
Jika "tipe" data (dalam arti abstrak) sering digunakan, untuk tujuan yang berbeda, dan antara antarmuka kode, itu adalah kandidat yang sangat baik untuk menjadi kelas yang terpisah, dengan mengorbankan verbositas.