Saya 100% di papan dengan kasus yang satu harus pasti menggunakan kedua sisi klien dan validasi data server-side.
Namun, dalam kerangka dan lingkungan tempat saya bekerja, pendekatan yang saya lihat tidak pernah KERING. Sebagian besar waktu tidak ada rencana atau pola - validasi ditulis dalam spesifikasi model, dan validasi ditulis dalam bentuk pada tampilan. (Catatan: Sebagian besar pengalaman tangan pertama saya adalah dengan Rails, Sinatra, dan PHP dengan jQuery)
Memikirkan hal itu, sepertinya tidak akan sulit untuk membuat generator yang, mengingat serangkaian validasi (misalnya nama model, bidang, kondisi), dapat menghasilkan materi sisi klien dan sisi server yang diperlukan. Sebagai alternatif, alat tersebut dapat mengambil validasi sisi-server (seperti validates
kode dalam model ActiveRecord) dan menghasilkan validasi sisi-klien (seperti plugin jQuery, yang kemudian akan diterapkan ke formulir.
Jelas, di atas hanyalah "hei aku punya ide" merenung, dan bukan proposal formal. Hal semacam ini tentunya lebih sulit daripada yang terlihat ketika ide itu mengenai saya.
Itu membawa saya ke pertanyaan: Bagaimana pendekatan Anda merancang teknik "tulis sekali, jalankan di server dan klien" untuk validasi data?
Subtopik terkait: Apakah alat seperti itu ada untuk kerangka kerja tertentu atau teknologi client-server? Apa tantangan atau tantangan utama dengan mencoba mempertahankan hanya satu set validasi?
sumber
form_for
untuk secara otomatis memberikan kode validasi sisi klien yang sangat berguna.Satu pertimbangan yang sering membatasi solusi adalah perjalanan pulang-pergi jaringan. Klien seharusnya memvalidasi data pengguna tanpa mengirim pesan melalui jaringan. Dengan kata lain, ketika pengguna menekan tombol kirim, klien seharusnya memvalidasi data secara lokal.
Pertama, mari kita asumsikan bahwa kita tidak memiliki batasan ini. Kami dapat berkomunikasi dengan titik akhir jaringan yang bagus dalam mengartikulasikan masalah validasi. Misalnya, ketika Anda mengirimkan catatan Pengguna baru Anda ke sana, daripada merespons dengan kode kesalahan HTTP vanilla, itu bisa mengembalikan respons JSON terperinci yang merinci masalah dan klien akan dengan cerdas memperbarui tampilan untuk mencerminkan masalah yang ditemui. Titik akhir memainkan peran gateway validasi.
KERING tetapi tidak tanpa kekurangan. Pertama, itu tergantung pada jaringan pulang pergi mengenakan pajak server kami dengan validasi yang bisa ditangani pihak klien. Kedua, desain mengantisipasi bahwa semua operasi CRUD akan terjadi melalui titik akhir kami, tetapi bagaimana dengan saat pengembang dan proses memotong lapisan akses data kami dengan langsung terhadap basis data ?
Mari kita kembali solusi kami untuk mengatasi kekurangan ini. Alih-alih, mari simpan dan komunikasikan validasi kami sebagai metadata:
Baik klien dan server akan memiliki beberapa mekanisme (misalnya mesin) untuk menafsirkan dan menerapkan data ini. (Ada yang menyebut ini monad gratis karena memisahkan bagian deklaratif dari penerjemahnya.) Dalam JavaScript kita bisa memetakan setiap informasi untuk fungsi yang berfungsi. Untuk mem-boot, kita dapat mengajarkan semua lapisan arsitektur kita, termasuk basis data kita, untuk menegakkan validasi secara konsisten.
sumber
Salah satu caranya adalah dengan menggunakan bahasa / kerangka kerja yang sama di sisi server dan klien.
Misalnya
Node.js :: Klien / Server dalam JavaScript GET :: Klien / Server di Jawa
Dalam hal ini, sebagian besar kode "Objek Domain" akan menjadi umum, yang akan mencakup validasi. Kerangka kerja akan meminta kode seperti yang diperlukan. Misalnya kode yang sama akan dipanggil di browser sebelum "kirim" dan pada layanan web sisi server.
EDIT (Juni / 2014): Dengan Java 8, sekarang juga mudah untuk mengintegrasikan kode validasi JS di Aplikasi Java. Java 8 memiliki mesin eksekusi JS baru yang lebih permanen (Misalnya: menggunakan invokeDynamic).
sumber
Saya hanya memikirkan masalah yang sama. Saya sedang berpikir untuk menggunakan ANTLR untuk mendapatkan pohon sintaksis abstrak di C # dan javascript. Dari sana Anda menggunakan walker pohon untuk menerapkan tindakan yang ditentukan dalam bahasa ke objek yang akan divalidasi.
Jadi, Anda bisa menyimpan deskripsi validasi yang diperlukan di mana pun Anda suka - mungkin dalam database.
Inilah cara saya mendekati masalah.
sumber