التحقق من صحة البيانات في C++: المكتبات والطرق (libvalidate, nlohmann/json, Boost)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التحقق من صحة البيانات في C++: نظرة عامة على المكتبات والطرق العملية



التحقق من صحة البيانات هو أحد الجوانب الرئيسية لتطوير برامج موثوقة بلغة C++. يسمح الفحص الصحيح للبيانات المدخلة بمنع أخطاء التنفيذ، والثغرات الأمنية، والسلوك غير المحدد. على عكس اللغات ذات الكتابة الديناميكية، تتطلب C++ من المطور تحكمًا صريحًا في الأنواع والتنسيقات. في هذه المقالة، سنستعرض كلاً من الطرق اليدوية والمكتبات المتخصصة التي تسهل عملية التحقق من الصحة.



1. التحقق اليدوي: التقنيات الأساسية



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



#include <iostream>#include <string>#include <cctype>

bool validateEmail(const std::string& email) { if (email.empty()) return false; size_t atPos = email.find('@'); if (atPos == std::string::npos || atPos == 0) return false; size_t dotPos = email.rfind('.'); if (dotPos == std::string::npos || dotPos <= atPos + 1) return false; if (dotPos == email.length() - 1) return false; return true;}

int main() { std::string testEmail = "user@example.com"; std::cout << (validateEmail(testEmail) ? "Valid" : "Invalid") << std::endl; return 0;}


العيوب: صعوبة الصيانة، تكرار الكود، عدم وجود واجهة موحدة.



2. مكتبة libvalidate



libvalidate هي مكتبة خفيفة الوزن للتحقق التصريحي من صحة البيانات في C++17 والإصدارات الأحدث. تسمح بوصف قواعد التحقق بأسلوب تسلسلي، يشبه أدوات التحقق في PHP أو Python.



التثبيت

المكتبة موزعة كـ header-only. يكفي نسخ validate.hpp إلى المشروع أو ربطها عبر CMake:

# مثال FetchContentinclude(FetchContent)FetchContent_Declare(libvalidate    GIT_REPOSITORY https://github.com/username/libvalidate.git    GIT_TAG v1.0.0)FetchContent_MakeAvailable(libvalidate)


مثال على الاستخدام

#include "validate.hpp"#include <iostream>#include <string>

int main() { using namespace validate;

// التحقق من رقم (العمر) int age = 25; auto ageResult = check(age) .min(18, "يجب أن لا يقل العمر عن 18 عامًا") .max(120, "يجب أن لا يزيد العمر عن 120 عامًا");

if (!ageResult.valid()) { std::cerr << ageResult.error() << std::endl; }

// التحقق من سلسلة نصية (كلمة المرور) std::string password = "P@ssw0rd"; auto passResult = check(password) .minLength(8, "يجب أن تحتوي كلمة المرور على 8 أحرف على الأقل") .matches(R"((?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*)", "يجب أن تحتوي كلمة المرور على أحرف كبيرة وصغيرة وأرقام");

if (!passResult.valid()) { std::cerr << passResult.error() << std::endl; }

// التحقق المدمج من كائن struct User { std::string name; int age; std::string email; };

User user{"Alice", 30, "alice@example.com"}; auto userResult = check(user) .field(&User::name, "name") .minLength(2) .maxLength(50) .field(&User::age, "age") .range(18, 100) .field(&User::email, "email") .email(); // التحقق المدمج من البريد الإلكتروني

if (!userResult.valid()) { for (const auto& err : userResult.errors()) { std::cerr << err.field << ": " << err.message << std::endl; } }

return 0;}


الميزات:

  • دعم القواعد المدمجة: min, max, range, email, regex, notEmpty.
  • إمكانية إنشاء

توصيات