Validasi nomor adalah rangkaian pemeriksaan yang menentukan apakah sebuah deretan karakter layak diterima sebagai nomor menurut satu skema tertentu. Pekerjaan itu tidak selesai dalam satu langkah, melainkan berlapis: kumpulan karakter diperiksa lebih dahulu, lalu panjangnya, dan terakhir digit pemeriksa yang dihitung dari sisa nomor. Setelah membaca halaman ini Anda akan tahu urutan yang benar, jenis kesalahan yang bisa ditangkap setiap lapis, dan mengapa hasil pemeriksaan perlu dinyatakan dengan hati-hati.
Apa yang dimaksud dengan validasi nomor?
Dalam percakapan sehari-hari, kata validasi sering dipakai untuk dua hal yang berbeda. Yang pertama adalah memastikan masukan berbentuk benar: tidak ada huruf di tempat yang seharusnya angka, tidak ada spasi terselip, dan jumlah karakternya sesuai. Yang kedua adalah memastikan isi nomor itu masuk akal menurut aturan penerbitnya. Dua pekerjaan ini sering digabung dalam satu tombol, padahal kesimpulan yang dihasilkannya berbeda.
Pembedaan itu penting karena setiap lapis hanya mampu menjawab satu pertanyaan. Lapis karakter menjawab apakah semua lambang yang diketik termasuk yang diizinkan. Lapis panjang menjawab apakah jumlah karakternya cocok dengan kebiasaan skema tersebut. Lapis digit pemeriksa menjawab apakah lambang terakhir konsisten dengan lambang sebelumnya. Tidak satu pun dari ketiganya dapat menjawab apakah nomor itu pernah diterbitkan kepada seseorang atau sesuatu.
Pandangan yang lebih berguna adalah menganggap validasi sebagai penyaring bertingkat, bukan sebagai penentu kebenaran. Setiap tingkat menyaring sejumlah kemungkinan salah ketik dengan biaya yang berbeda. Semakin dalam tingkatnya, semakin berat perhitungannya, dan semakin sempit pula jenis kesalahan yang dapat ditangkapnya.
Tiga lapis penyaring: kumpulan karakter, panjang, dan digit pemeriksa
Tabel berikut merangkum apa yang dikerjakan setiap lapis beserta jenis galat yang biasanya tertangkap olehnya.
| Lapis | Yang diperiksa | Galat yang sering tertangkap |
|---|---|---|
| Kumpulan karakter | Lambang yang diizinkan skema | Huruf tertukar angka, lambang asing, spasi tersisip |
| Panjang | Jumlah karakter yang diharapkan | Satu karakter hilang, satu karakter berlebih, potongan nomor tersalin |
| Digit pemeriksa | Hubungan aritmetika antarkarakter | Salah ketik satu karakter, sebagian salah ketik tukar posisi |
Urutan di atas bukan pilihan gaya, melainkan syarat. Bila pemeriksaan panjang dijalankan sebelum pembersihan pemisah, nomor yang ditulis dengan titik atau tanda hubung akan terhitung terlalu panjang dan dinyatakan salah. Sebaliknya, bila digit pemeriksa dihitung atas masukan yang masih mengandung spasi, hasil aritmetikanya menyimpang jauh dan pengguna menerima kesimpulan yang menyesatkan.
Lapis ketiga juga punya batas yang perlu dinyatakan terbuka. Digit pemeriksa dihitung dengan penjumlahan berbobot yang kemudian diambil sisanya terhadap sebuah modulus, lalu dipetakan menjadi satu lambang. Karena aturannya terbuka, siapa pun yang memahami aritmetikanya dapat menghitung lambang yang benar. Artinya lapis ini menyaring kesalahan tidak sengaja, bukan mencegah nomor karangan.
Mengapa format yang cocok belum berarti nomornya nyata?
Kesalahpahaman yang paling sering muncul adalah menganggap lolosnya pemeriksaan sebagai bukti keberadaan. Padahal digit pemeriksa hanya menunjukkan bahwa deretan karakter itu konsisten dengan dirinya sendiri. Ia tidak membawa keterangan tentang siapa pemiliknya, apakah nomornya masih aktif, atau apakah nomor itu boleh dipakai untuk suatu keperluan.
Jawaban atas pertanyaan seperti itu baru muncul pada lapis yang berbeda sama sekali, yaitu pencarian ke daftar resmi milik penerbit. Pencarian semacam itu memerlukan jaringan, bisa gagal karena gangguan layanan, dan hasilnya berubah seiring waktu. Karena sifatnya berbeda, kesimpulan dari kedua lapis itu tidak boleh dicampur menjadi satu kata seperti sah.
Semua contoh dan angka yang muncul di halaman ini adalah data sintetis yang dibuat hanya untuk menjelaskan tiga lapis pemeriksaan. Tidak ada satu pun yang menunjuk orang, rekening, atau dokumen yang benar-benar ada, dan lolosnya sebuah contoh tidak boleh dipakai sebagai bukti bahwa nomor apa pun nyata atau dapat digunakan.
Satu nomor bisa cocok dengan beberapa skema
Deretan karakter tidak membawa label asal. Sebuah deretan angka dengan panjang tertentu bisa saja memenuhi aturan satu negara sekaligus aturan negara lain, terutama bila keduanya memakai kumpulan karakter yang sama dan aturan digit pemeriksa yang mirip. Ketika hal itu terjadi, memilih satu skema secara diam-diam adalah kesalahan yang mahal, karena pengguna akan menerima pesan galat tentang aturan yang tidak pernah ia maksudkan.
Pendekatan yang lebih jujur adalah menampilkan semua skema yang benar-benar lolos sebagai daftar kemungkinan, lengkap dengan alasan mengapa masing-masing cocok. Pengguna yang tahu dari mana nomornya berasal dapat memilih baris yang tepat, sedangkan sistem tidak perlu menebak asal negara hanya dari bentuk masukan.
Cara ini juga mengubah bentuk pesan galat. Bukannya menyatakan nomor salah, sistem menyatakan bahwa tidak ada skema yang dikenali cocok dengan masukan tersebut. Kalimat itu lebih tepat karena menggambarkan keadaan sistem, bukan menghakimi data yang dimasukkan pengguna.
Normalisasi: spasi, tanda hubung, dan huruf besar
Sebelum semua lapis berjalan, masukan perlu dinormalkan. Langkah ini membuang pemisah yang dipakai manusia agar nomor mudah dibaca, seperti spasi, tanda hubung, titik, dan garis miring, lalu menyamakan bentuk huruf. Skema yang memakai huruf biasanya tidak membedakan huruf besar dan huruf kecil, sehingga penyamaan itu membuat dua tulisan yang sama diterima sebagai satu nilai.
Normalisasi juga menyatukan bentuk lebar penuh yang sering muncul ketika pengguna menempel dari aplikasi lain. Tanpa langkah ini, karakter yang terlihat sama di layar akan dianggap berbeda oleh pemeriksaan karakter, dan pengguna menerima penolakan yang sulit ia pahami.
Perlu ditegaskan bahwa normalisasi bukan perbaikan data. Ia tidak memperbaiki karakter yang salah ketik dan bukan pula langkah pengamanan. Fungsinya hanya membuat aturan yang sama dapat diterapkan pada tulisan yang berbeda bentuk, sehingga satu nomor tidak diperlakukan sebagai dua nilai yang berlainan.
Untuk pengembang: membagi pemeriksaan menjadi berlapis
Susunlah pemeriksaan sebagai rangkaian fungsi kecil yang masing-masing melaporkan hasilnya sendiri, bukan sebagai satu fungsi besar yang mengembalikan benar atau salah. Dengan begitu antarmuka dapat menyebut bagian mana yang gagal, dan pengguna tahu apakah ia perlu memperbaiki tulisan, mengganti nomor, atau menghubungi pihak lain.
Pisahkan pula hasil menjadi beberapa keadaan yang berbeda. Keadaan pertama adalah digit pemeriksa terpenuhi, yaitu nilai lolos algoritma yang diterbitkan skema. Keadaan kedua adalah bentuknya cocok tetapi digit pemeriksanya tidak terpenuhi. Keadaan ketiga adalah skema tersebut tidak menerbitkan algoritma digit pemeriksa, sehingga hanya bentuk yang dapat dipastikan. Keadaan keempat adalah tidak ada aturan yang tersedia untuk masukan itu.
Keadaan ketiga dan keempat paling sering disalahartikan. Yang pertama bukan berarti nomor tidak sah, dan yang kedua bukan berarti nomor palsu. Pilihan kata pada dua keadaan itu menentukan apakah pengguna akan mencoba memperbaiki data atau justru membuang data yang sebenarnya benar. Anda dapat melihat bagaimana pembedaan ini diterapkan pada alat validasi nomor di situs ini, yang menampilkan setiap keadaan secara terpisah.
Selanjutnya, simpan aturan skema sebagai data, bukan sebagai rangkaian kondisi yang tersebar di dalam kode. Skema berubah dari waktu ke waktu, dan bentuk data membuat perubahan itu dapat ditinjau tanpa menyentuh alur bisnis. Bagi tim yang sedang menyiapkan berkas uji, keselarasan antar bidang juga perlu dijaga; gagasan itu diuraikan pada catatan konsistensi bidang.
Uji setiap lapis secara terpisah, bukan hanya hasil akhirnya. Kesalahan pada pemeriksaan panjang akan tampak sama dengan kesalahan pada perhitungan digit pemeriksa bila yang diuji hanya jawaban akhirnya, padahal tindak lanjut kedua keadaan itu berbeda. Pengujian berlapis juga memudahkan penambahan skema baru, karena lapis yang tidak berubah tidak perlu diuji ulang seluruhnya.
Tetapkan pula satu tempat sebagai sumber kebenaran untuk daftar skema. Bila daftar itu disalin ke beberapa bagian sistem, salinan yang tertinggal akan menghasilkan penolakan yang tidak dapat dijelaskan kepada pengguna. Satu sumber kebenaran membuat perilaku seluruh sistem dapat ditinjau dari satu halaman saja, dan memastikan setiap lapis membaca aturan yang sama persis.
Langkah berikutnya
Mulailah dari daftar keadaan yang ingin Anda bedakan di antarmuka, lalu sambungkan setiap keadaan dengan bukti yang mendasarinya. Bila Anda ingin melihat bagaimana tiap lapis diterapkan pada berbagai skema, buka alat validasi nomor dan bandingkan hasilnya dengan pembahasan keluarga algoritma digit pemeriksa. Untuk nomor yang tidak punya algoritma publik sama sekali, lanjutkan ke pembahasan nomor tanpa digit pemeriksa.