شرح المفهوم
يجمع هذا الدرس دروس الإعداد الأولى في سكربت واحد صغير وكامل. لقد تدربت بالفعل على تشغيل الملفات، وتصحيح الأخطاء النحوية (syntax)، وتصحيح الأخطاء (debugging)، وإعادة الهيكلة (refactoring)، واختبار الدوال المساعدة البسيطة (simple helpers)، وفصل البيانات عن العرض. الآن ستستخدم هذه العادات في مكان واحد. السكربت في هذا الدرس لا يزال صغيراً عن قصد. وهذا ما يجعله مفيداً. يجب أن يكون مشروع المبتدئين سهل التشغيل، سهل القراءة، وسهل التغيير دون خوف. إذا فتح زميل في الفريق هذا الملف غداً، فيجب أن يفهم ما يفعله في أقل من دقيقة. هنا، ستبني منسق ملفات تعريف (profile formatter) صغيراً ينشئ سجلات عينة، ويتحقق من أن البيانات معقولة، ويطبع مخرجات نظيفة. لا شيء معقد. مجرد سكربت يبدو وكأنه مشروع مصغر حقيقي بدلاً من تمرين منفصل. بحلول نهاية هذا الدرس، يجب أن تكون قادراً على: • شرح كيفية عمل إنشاء البيانات والتحقق منها وعرضها معاً في ملف واحد، • تشغيل مشروع مصغر من البداية إلى النهاية دون تخمين ما سيحدث بعد ذلك، • الإشارة إلى المكان الدقيق الذي ستضاف فيه الميزات المستقبلية مثل وسائط سطر الأوامر (CLI arguments) أو تصدير JSON. لماذا هذا مهم: يحدث التعلم الحقيقي عندما تتوقف المفاهيم المنفصلة عن الشعور بالانفصال وتبدأ في العمل معاً في برنامج واحد.
أين تضع الكود
- عرف متغيرات اللون والموضع في الأعلى.
- أنشئ منطق رسم الأشكال أو وضعها في المنتصف.
- اعرض المخرجات (طباعة، لوحة، SVG، أو كتلة منسقة) في النهاية.
مرجع الأوامر
- اجعل الـ docstring الخاص بالوحدة عملياً ليعرف شخص آخر كيفية تشغيل الملف فوراً.
- استخدم دالة تحقق صغيرة قبل الطباعة لتفشل البيانات السيئة الواضحة مبكراً.
- اجعل `render_profile()` تُرجع سلسلة نصية (string)؛ هذا يجعل التنسيق سهل الاختبار وإعادة الاستخدام.
- تعامل مع `main()` كخطوة التجميع النهائية حيث يتكامل المشروع.
دليل خطوة بخطوة
- شغل السكربت تماماً كما هو موضح في الـ docstring العلوي وتأكد من أن كل ملف تعريف يُطبع في سطر خاص به.
- أضف ملف تعريف آخر وتحقق مما إذا كانت قاعدة الذهب مقابل المعيار لا تزال تعمل بالطريقة التي تتوقعها.
- أعطِ أحد ملفات التعريف درجة سلبية مؤقتاً، اقرأ رسالة التأكيد (assertion message)، ثم استعد البيانات.
- غير التنسيق في `render_profile()` دون لمس `build_profiles()` أو `validate_profiles()`.
- اكتب جملة واحدة تصف فيها أين ستضيف وسائط سطر الأوامر (command-line arguments) إذا أردت أن يقبل هذا المشروع مدخلات حقيقية لاحقاً.
تمارين تطبيقية
- قارن هذه النسخة القائمة على `dataclass` بدرس `TypedDict` الذي سبقه. أيهما يبدو أنظف لمشروع صغير، ولماذا؟
- أضف دالة تُرجع ملف التعريف الأعلى نقاطاً دون تغيير طريقة عمل العرض.
- اكتب ملاحظة قصيرة تشرح لماذا يجب أن يكون التحقق (validation) قبل حلقة الطباعة، وليس بعدها.
تحديات برمجية
- أضف دالة تصدير JSON تحول ملفات التعريف إلى قواميس (dictionaries) مع الحفاظ على عارض النص (text renderer) دون تغيير.
- رتب ملفات التعريف حسب النقاط قبل الطباعة وتأكد من أن بقية الملف لا تزال سهلة القراءة.
مهام تمرين صغيرة
- احفظ هذا الملف كمشروع مصغر شخصي، وليس مجرد تمرين درسي.
- اكتب سطراً واحداً في ملاحظاتك: هذا هو أول سكربت تعمل فيه عدة أفكار بايثون معاً.
- اقرأ الملف من الأعلى إلى الأسفل مرة واحدة دون تشغيله وتحقق مما إذا كان التسلسل يبدو واضحاً.
خطأ شائع
Mixing x and y axes or using wrong coordinate origin causes shapes to appear in unexpected places.
تحدٍ مصغّر من الواقع
Draw one square, one triangle, and one circle, then move X marker 2 steps right and 1 step down.