Buka webinar "Validasi Lancar sebagai Alat Validasi Data"



Halo lagi! Sebagai bagian dari peluncuran kursus Pengembang C #, kami mengadakan pelajaran terbuka tradisional tentang alat Validasi Fasih . Di webinar, kami memeriksa bagaimana cara menyingkirkan sekelompok seandainya dengan memeriksa kebenaran pengisian data pelanggan, mempelajari implementasi internal perpustakaan dan bagaimana menerapkan pendekatan Antarmuka Fasih ke dalam praktik. Webinar ini dipandu oleh Alexei Yagur , Ketua Tim di YouDo.



Mengapa validasi diperlukan?


Wikipedia memberi tahu kami bahwa validasi (mulai lat. Validus "sehat, kuat, kuat") adalah bukti bahwa persyaratan pengguna, produk, layanan, atau sistem tertentu terpenuhi. Sebagai aturan, validasi dilakukan seperlunya, dengan asumsi analisis kondisi penggunaan yang ditentukan dan penilaian kesesuaian karakteristik produk dengan persyaratan yang ada. Hasil validasi adalah kesimpulan tentang kemungkinan menggunakan produk untuk kondisi tertentu.

Adapun alat Validasi Fasih , pengetahuannya akan memungkinkan kita untuk:

  • menghemat waktu saat menyelesaikan tugas yang terkait dengan validasi data;
  • untuk membawa cek buatan sendiri yang tersebar ke satu bentuk;
  • pamerkan pengetahuan Anda tentang validasi kopi kepada rekan kerja :)

Tapi ini semua teori, mari kita mulai berlatih.

Validasi Studi Kasus: Interaktif


Jadi, implementasi praktis validasi dalam C # adalah sebagai berikut:



Kami memiliki Pelanggan kelas, yang memiliki sekumpulan bidang paling sederhana: Nama Depan - nama, Nama Belakang - nama belakang, Usia - usia. Dan ada kelas CustomerManager tertentu yang menyimpan, seperti yang kita lihat, pengguna baru (pembeli) di Gudang Pelanggan dan menampilkan informasi ke konsol yang telah berhasil ditambahkan oleh pelanggan.

Mari kita coba menambahkan custom dan manajer yang akan mengelola custom:

void Main() { var customer = new Customer { FirstName = " ", LastName = "", Age = 57, }; var manager = new CustomerManager(); manager.Add(customer); } 

Hasil eksekusi akan menjadi output di konsol teks berikut:

.

Seperti yang Anda lihat, sejauh ini bagus. Tetapi apa yang terjadi jika data "rusak" tiba-tiba muncul di basis data kami. Misalnya, jika informasi yang salah dimasukkan di bidang (nomor telepon, bukan nama, usia dengan tanda minus, dll.):

 { FirstName = "+79123456789", LastName = "valde@mar.ru", Age = -14, }; 

Akibatnya, kita akan melihat bahwa pengukur khusus dengan kumpulan data yang tidak dapat dipahami juga akan ditambahkan:

+79123456789 valde@mar.ru .

Secara alami, kami tidak ingin memiliki data seperti itu di repositori kami. Bagaimana kita melindungi diri kita sendiri? Opsi termudah adalah mengembalikan kesalahan jika, misalnya, kami tidak memiliki semua karakter - huruf. Untuk melakukan ini, kami menetapkan kondisi untuk FirstName menggunakan if, dan jika kondisinya tidak terpenuhi, kami menghentikan fungsi menggunakan return dan menampilkan pesan "Kesalahan nama" pada konsol. Kami melakukan hal yang sama dengan LastName. Sedangkan untuk Umur, di sini kami memeriksa kisaran angka, misalnya:

if (customer.Age < 14 || customer.Age > 180)

Sekarang mari kita asumsikan bahwa kita perlu menambahkan bidang tambahan untuk pembeli , misalnya telepon. Kami akan memvalidasi telepon menggunakan kondisi bahwa nilai yang dimasukkan harus dimulai dengan "+79" dan hanya menyertakan angka. Semua ini dengan sendirinya akan menjadi desain yang agak rumit, tetapi jika kita ingin menambahkan lebih banyak email?

Bagaimanapun, setelah melakukan operasi di atas, kita mendapatkan banyak ifs dan lembar kode yang besar . Tidak akan mudah bagi pengembang luar untuk memahami kode tersebut. Apa yang harus dilakukan

Menghubungkan Validasi Lancar


LINQPad memiliki kemampuan untuk menghubungkan perpustakaan Fluent Validation, yang kami lakukan . Selain itu, kami membuat kelas CustomerValidator lain, yang akan menjadi validator. Karenanya, kami meresepkan semua aturan yang diperlukan di dalamnya. Kami membuat penyesuaian tambahan, dan menghapus banyak jika, karena mereka tidak lagi diperlukan.

Akibatnya, kode akhir kami akan terlihat seperti ini:

 void Main() { var customer = new Customer { FirstName = "Alex2", LastName = "Petrov1", Age = 10, Phone = "+791234567893", Email = "adsf@fadsf3.com" }; var manager = new CustomerManager(); manager.Add(customer); } class Customer { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public string Phone { get; set; } public string Email { get; set; } } class CustomerManager { CustomerRepository _repository; CustomerValidator _validator; public CustomerManager() { _repository = new CustomerRepository(); _validator = new CustomerValidator(); } public void Add(Customer customer) { if (!ValidateCustomer(customer)) { return; } _repository.Add(customer); Console.WriteLine($" {customer.FirstName} {customer.LastName}  ."); } private bool ValidateCustomer(Customer customer) { var result = _validator.Validate(customer); if (result.IsValid) { return true; } foreach(var error in result.Errors) { Console.WriteLine(error.ErrorMessage); } return false; } } class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { var msg = "   {PropertyName}:  {PropertyValue}"; RuleFor(c => c.FirstName) .Must(c => c.All(Char.IsLetter)).WithMessage(msg); RuleFor(c => c.LastName) .Must(c => c.All(Char.IsLetter)).WithMessage(msg); RuleFor(c => c.Age) .GreaterThan(14).WithMessage(msg) .LessThan(180).WithMessage(msg); RuleFor(c => c.Phone) .Must(IsPhoneValid).WithMessage(msg) .Length(12).WithMessage("    {MinLength}  {MaxLength}.  : {TotalLength}"); RuleFor(c => c.Email) .NotNull().WithMessage(msg) .EmailAddress(); } private bool IsPhoneValid(string phone) { return !(!phone.StartsWith("+79") || !phone.Substring(1).All(c => Char.IsDigit(c))); } } class CustomerRepository { Random _random; public CustomerRepository() { _random = new Random(); } public void Add(Customer customer) { var sleepInSeconds = _random.Next(2, 7); Thread.Sleep(1000 * sleepInSeconds); } } 

Dan sedikit lebih banyak teori


Saya ingin menambahkan beberapa kata tentang Validasi Lancar. Alat ini disebut demikian karena antarmuka "cairan". Sekali lagi, Wikipedia memberi tahu kita bahwa antarmuka yang lancar adalah cara untuk mengimplementasikan API berorientasi objek, yang bertujuan untuk meningkatkan keterbacaan kode sumber program. Definisi, seperti yang kita lihat, mengandung banyak kata-kata indah dan panjang, yang tidak selalu jelas. Tetapi kita dapat mengatakan sebaliknya:
"Antarmuka yang lancar adalah cara untuk mengimplementasikan API berorientasi objek di mana metode mengembalikan antarmuka yang sama di mana mereka dipanggil."
Alexey Yagur
Adapun perpustakaan itu sendiri, itu mencakup komponen - komponen berikut:

  1. Logika dasar . Berikut ini tautan ke GitHub di mana Anda dapat melihat logika utama.
  2. Logika bantu . FluentValidation.ValidatorAttribute bertanggung jawab atas logika ini.
  3. Bagian sensitif konteks . Lihat FluentValidation.AspNetCore , FluentValidation.Mvc5 dan FluentValidation.WebApi .
  4. Tes . Oleh karena itu, kami tertarik pada FluentValidation.Tests.AspNetCore , FluentValidation.Tests.Mvc5 , FluentValidation.Tests.WebApi dan FluentValidation.Tests .

Itu saja, langkah demi langkah langkah dalam menulis kode, lihat videonya . Selain itu, Anda mungkin tertarik dengan tambahan interaktif tentang topik "Variabel dalam teks kesalahan" , yang diadakan guru di dekat bagian akhir webinar.

Sampai jumpa di Kursus Pengembang C # !

Source: https://habr.com/ru/post/id472604/


All Articles