مختبر تحقق التسجيل
Signup Validation Lab
مختبر تحقق التسجيل — Signup Validation Lab
التحقق من بيانات المستخدم نقطة يلتقي فيها كل ما تعلمته: استثناءات مخصصة، تسلسل هرمي، إطلاق والتقاط، وجمع أخطاء متعددة. في هذا المختبر ستبني منظومة تحقق كاملة من نموذج تسجيل — كما تجدها في تطبيقات Python الحقيقية.
لماذا التسجيل مثالاً ممتازاً؟ لأن المستخدم يرسل بيانات متعددة في آنٍ واحد، وأي منها قد يكون خاطئاً. التحقق الجيد لا يقف عند أول خطأ ويعود بـ “البريد غير صالح” — بل يجمع جميع المشاكل ويُرسلها دفعة واحدة حتى يُصلح المستخدم كل شيء في مرة واحدة لا عشر مرات.
بنية المنظومة
سنبني المنظومة على ثلاث طبقات:
ValidationError (الأب)
├── EmailError — أخطاء البريد الإلكتروني
├── PasswordError — أخطاء كلمة المرور
└── UsernameError — أخطاء اسم المستخدم
كل مُحقّق (validator) يُطلق الاستثناء المناسب. المنسّق (composer) يشغّل جميع المُحققين ويُقرر: هل نتوقف عند أول خطأ أم نجمعها كلها؟
خطوة 1: تسلسل هرمي الاستثناءات
خطوة 2: المُحققون الفرديون
كل مُحقق يفحص قاعدة واحدة. إذا فشلت، يُطلق الاستثناء المناسب:
التحدي الأول: مُحقق البريد
التحدي الثاني: مُحقق كلمة المرور
التحدي الثالث: مُحقق اسم المستخدم
خطوة 3: التحقق المُركّب — التوقف عند أول خطأ
الآن ننسّق المُحققين الثلاثة معاً. أبسط شكل: نتوقف عند أول خطأ.
التحدي الرابع: التحقق المُركّب مع تقرير الحقل الفاشل
خطوة 4: جمع جميع الأخطاء — Collect ALL Errors
التوقف عند أول خطأ مزعج للمستخدم — يصلح البريد ويُرسل، ثم يكتشف أن كلمة المرور خاطئة أيضاً. النمط الأفضل: اجمع جميع الأخطاء وأرجعها دفعة واحدة.
التحدي الخامس: جمع الأخطاء بنفسك
ملاحظات عملية
التقط المحدد، لا العام: في كل validator نلتقط ValidationError (الأب) لا Exception — هذا يضمن أن أخطاء البرمجة نفسها مثل AttributeError تصل للأعلى ولا تُخفى.
الترتيب جزء من العقد: عندما تُوقف عند أول خطأ، ترتيب استدعاء المُحققين يُحدد أي خطأ يظهر أولاً. هذا سلوك ضمني يجب أن تعرفه وتوثقه.
نص الرسالة للمطور، واجهة المستخدم لشيء آخر: استثناءات التحقق تحمل رسائل دقيقة للمطور. في تطبيق حقيقي، طبقة العرض (HTTP handler، CLI) تُحوّلها لرسائل ودية للمستخدم.
لا تستخدم استثناءات للتحكم في التدفق العادي: الاستثناءات للأحداث الاستثنائية. التحقق من المدخلات في حدوده مقبول، لكن لا تستخدم raise/except كـ if/else مُبطّن.
خلاصة المختبر
بنيت في هذا المختبر منظومة تحقق كاملة:
- تسلسل هرمي يُتيح التقاط محددداً أو عاماً بحسب الحاجة
- مُحققون فرديون بمسؤولية واحدة لكل منهم
- منسّق يتوقف عند أول خطأ — مناسب للسيناريوهات التسلسلية
- منسّق يجمع الأخطاء — مناسب للنماذج التي تعرض كل المشاكل دفعة واحدة
هذه الأنماط مباشرة ستجدها في مكتبات Python الكبيرة مثل Pydantic وDjango Forms وMarshmallow — التي تبني فوق نفس الأفكار بمزيد من المرونة. الآن أنت تفهم ما تفعله تحت الغطاء.