AzLearn

بناء سجل درجات

Build a Gradebook

تطبيق ~25 دقيقة

بناء سجل درجات — Build a Gradebook

في مشاريع Go ستجمع كثيراً بين slice و map و struct. هذا الدرس يبني سجل درجات صغيراً خطوة خطوة.

سجل الدرجات مثال مناسب لأنه يجبرك على التفكير في شكل البيانات قبل الحساب. لو كتبت الأسماء في شريحة منفصلة والدرجات في شريحة أخرى، ستحتاج دائماً أن تتأكد أن الفهارس متطابقة. هذا تصميم هش. عندما تجمع الاسم والدرجة داخل struct واحد، فأنت تقول إن هاتين القيمتين تنتميان لنفس الطالب. ثم تستخدم slice عندما تريد قائمة مرتبة من الطلاب، وتستخدم map عندما تريد الوصول السريع لطالب باسم أو رقم.

الهدف من الدرس أن ترى متى تستخدم كل بنية، لا أن تحفظ المثال. struct يصف الشيء، slice تجمع عدة أشياء، وmap تربط مفتاحاً بقيمة. هذه ثلاث أدوات ستظهر في API responses، إعدادات البرامج، نتائج قواعد البيانات، وملفات JSON.

الخطوة 1: هيكل للطالب

ابدأ بتسمية البيانات التي تتكرر مع كل طالب.

main.go

لاحظ أن أسماء الحقول تبدأ بحرف كبير: Name وScore. في ملف واحد لا يهم كثيراً، لكنك ستتعلم لاحقاً أن الحرف الكبير يجعل الحقل exported خارج الحزمة. حتى الآن، المهم أن الحقول واضحة، وأن إنشاء القيم داخل الشريحة يقرأ مثل جدول صغير.

الخطوة 2: احسب المتوسط

المتوسط يحتاج المرور على كل العناصر. هنا range أوضح من التعامل المباشر مع الفهارس.

main.go

التحقق من len(students) == 0 ليس تفصيلاً ثانوياً. لو قسمت على صفر سيصبح السلوك غير مناسب، والأفضل أن تحدد أنت ما معنى متوسط قائمة فارغة. في هذا المثال رجعنا 0 لأن الدرس بسيط، لكن في تطبيق حقيقي قد ترجع خطأ أو تعرض رسالة “لا توجد بيانات”. المهم أن الحالة الحدية لا تبقى مصادفة.

الخطوة 3: استخدم map للوصول السريع

إذا كنت تبحث بالاسم كثيراً، فالـ map أنسب من البحث داخل slice كل مرة.

main.go

استخدمنا الصيغة sara, ok := byName["سارة"] لأن القراءة من map قد تفشل إذا لم يوجد المفتاح. لا تعتمد على القيمة الصفرية وحدها، خصوصاً لو كان Score يساوي صفر قد يكون درجة حقيقية أو نتيجة عدم وجود الطالب. المتغير ok يجعل الفرق صريحاً.

كيف تختار البنية المناسبة

إذا كان السؤال “ما بيانات الطالب؟” فالجواب struct. إذا كان السؤال “ما كل الطلاب؟” فالجواب غالباً []Student. إذا كان السؤال “أعطني طالباً معيناً بسرعة” فالجواب map[string]Student أو map[int]Student حسب المفتاح. هذا التفكير أهم من المثال نفسه، لأنه يمنعك من استخدام map لكل شيء أو slice لكل شيء.

من الأخطاء الشائعة أيضاً تعديل نسخة من struct ثم توقع أن تتغير القيمة الأصلية في مكان آخر. في هذا الدرس نقرأ ونحسب فقط، لكن عندما تبدأ التحديثات ستحتاج أن تعرف هل تتعامل مع قيمة، مؤشر، أو قيمة محفوظة داخل map. ابدأ دائماً بالسؤال: أين تعيش البيانات، ومن يملك تعديلها؟

الخطوة 4: تقرير صغير

الآن اجمع الأجزاء: أعلى درجة، المتوسط، وعدد الطلاب.

تحدي — Challenge

خلاصة

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