فتح ندوة عبر الإنترنت "التحقق من صحة Fluent كأداة للتحقق من صحة البيانات"



مرحبا مرة أخرى! كجزء من إطلاق دورة C # Developer ، عقدنا درسًا تقليديًا مفتوحًا حول أداة التحقق من Fluent . في الندوة عبر الإنترنت ، درسنا كيفية التخلص من مجموعة كبيرة من الأمثلة على ذلك من خلال التحقق من صحة ملء بيانات العميل ، ودرسنا التنفيذ الداخلي للمكتبة وكيفية تطبيق نهج واجهة Fluent في التطبيق. استضاف الندوة أليكسي ياجور ، قائد فريق العمل في YouDo.



لماذا التحقق من الصحة ضروري؟


تخبرنا Wikipedia بأن التحقق من الصحة (من lat. Validus "صحي ، قوي ، قوي") هو دليل على تلبية متطلبات مستخدم معين أو منتج أو خدمة أو نظام معين. كقاعدة عامة ، يتم التحقق من الصحة حسب الضرورة ، بافتراض تحليل شروط الاستخدام المحددة وتقييم مدى توافق خصائص المنتج مع المتطلبات الحالية. نتيجة التحقق من الصحة هي الاستنتاج حول إمكانية استخدام المنتج لظروف معينة.

بالنسبة لأداة التحقق من الصحة بطلاقة ، فإن معرفته ستتيح لنا:

  • توفير الوقت عند حل المهام المتعلقة بالتحقق من صحة البيانات ؛
  • لإحضار الشيكات المحلية المتناثرة إلى نموذج واحد ؛
  • اظهار علمك التحقق من صحة القهوة للزملاء :)

ولكن هذه هي كل النظرية ، دعنا نمارس بشكل أفضل.

دراسة حالة التحقق من الصحة: ​​التفاعلية


لذلك ، التنفيذ العملي للتحقق من الصحة في C # على النحو التالي:



لدينا فئة عميل ، والتي لديها أبسط مجموعة من الحقول: الاسم الأول - الاسم ، اسم العائلة - الاسم الأخير ، العمر - العمر. وهناك فئة CustomerManager معينة تحفظ ، كما نرى ، مستخدمًا جديدًا (مشترًا) في CustomerRepository وتعرض المعلومات على وحدة التحكم التي تمت إضافتها بنجاح.

دعونا نحاول إضافة مخصص ومدير سيتولى إدارة العرف:

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

ستكون نتيجة التنفيذ هي الإخراج في وحدة التحكم بالنص التالي:

.

كما ترون ، حتى الآن جيد جدا. ولكن ماذا يحدث إذا ظهرت البيانات "الفاسدة" فجأة في قاعدة البيانات الخاصة بنا. على سبيل المثال ، إذا تم إدخال معلومات غير صحيحة في الحقول (رقم الهاتف بدلاً من الاسم ، فعمر علامة الطرح ، إلخ):

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

نتيجةً لذلك ، سنرى أيضًا عدادًا مخصصًا مع مجموعة بيانات غير مفهومة:

+79123456789 valde@mar.ru .

بطبيعة الحال ، لا نريد الحصول على مثل هذه البيانات في مستودعنا. كيف نحمي أنفسنا؟ الخيار الأسهل هو إرجاع خطأ إذا لم يكن لدينا جميع الأحرف - على سبيل المثال. للقيام بذلك ، قمنا بتعيين الشرط لـ FirstName باستخدام إذا ، وإذا لم يتم استيفاء الشرط ، فسنوقف الوظيفة باستخدام الإرجاع وعرض الرسالة "خطأ في الاسم" على وحدة التحكم. نحن نفعل نفس الشيء مع اسم العائلة. بالنسبة إلى العمر ، هنا نتحقق من نطاق الأرقام ، على سبيل المثال:

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

لنفترض الآن أننا بحاجة إلى إضافة حقول إضافية للمشتري ، على سبيل المثال ، هاتف. سنقوم بالتحقق من صحة الهاتف باستخدام شرط أن القيم التي تم إدخالها يجب أن تبدأ بـ "+79" وتضمين الأرقام فقط. كل هذا في حد ذاته سيكون تصميمًا مرهقًا إلى حد ما ، ولكن إذا أردنا إضافة المزيد من رسائل البريد الإلكتروني؟

على أي حال ، بعد القيام بالعمليات المذكورة أعلاه ، نحصل على مجموعة كبيرة من التعليمات البرمجية وقائمة كبيرة من التعليمات البرمجية . لن يكون من السهل على مطور خارجي أن يفهم هذه الشفرة. ماذا تفعل؟

ربط التحقق من بطلاقة


لدى LINQPad القدرة على توصيل مكتبة التحقق من الصحة بطلاقة ، وهو ما نقوم به . بالإضافة إلى ذلك ، نقوم بإنشاء CustomerValidator فئة أخرى ، والتي ستكون مدقق. وفقا لذلك ، نحن نصف جميع القواعد اللازمة في ذلك. نجري تعديلات إضافية ، ونزيل العدادات المتعددة ، لأنه لم تعد هناك حاجة إليها.

نتيجة لذلك ، سيبدو رمزنا النهائي كما يلي:

 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); } } 

ونظرية أكثر بقليل


أود أن أضيف بعض الكلمات عن التحقق من صحة بطلاقة. تسمى هذه الأداة بهذه الطريقة بسبب واجهة "الموائع". مرة أخرى ، تخبرنا ويكيبيديا أن واجهة الموائع هي وسيلة لتطبيق واجهة برمجة تطبيقات موجهة للكائنات ، تهدف إلى زيادة إمكانية قراءة الكود المصدري للبرنامج. التعريف ، كما نرى ، يحتوي على العديد من الكلمات الجميلة والطويلة ، والتي ليست واضحة دائمًا. ولكن يمكننا أن نقول خلاف ذلك:
"واجهة الموائع هي طريقة لتطبيق واجهة برمجة تطبيقات موجهة للكائنات حيث تُرجع الطرق نفس الواجهة التي تم استدعاؤها."
أليكسي ياجور
بالنسبة للمكتبة نفسها ، فهي تشمل المكونات التالية:

  1. المنطق الأساسي . فيما يلي رابط لـ GitHub حيث يمكنك رؤية المنطق الرئيسي.
  2. المنطق المساعد . FluentValidation.ValidatorAttribute هو المسؤول عن هذا المنطق.
  3. السياق الحساسة جزء . انظر FluentValidation.AspNetCore و FluentValidation.Mvc5 و FluentValidation.WebApi .
  4. الاختبارات . وفقًا لذلك ، نحن مهتمون بـ FluentValidation.Tests.AspNetCore و FluentValidation.Tests.Mvc5 و FluentValidation.Tests.WebApi و FluentValidation.Tests .

هذا كل شيء ، خطوة بخطوة في كتابة التعليمات البرمجية ، راجع الفيديو . بالإضافة إلى ذلك ، قد تكون مهتمًا بتفاعلية إضافية حول موضوع "المتغيرات في نصوص الأخطاء" ، والتي عقدها المعلم بالقرب من نهاية الندوة.

نراكم في دورة المطور C # !

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


All Articles