مراجعة - متتبع النقاط
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 69 من 70.
التحدي
سهللنَبْنِ نظامًا لتتبّع النقاط في لوحة ترتيب للألعاب! ستنشئ فئتين تعملان معًا: إحداهما تمثّل إدخالات النقاط الفردية، والأخرى تدير لوحة الترتيب مع إمكانات الفرز المدعومة بزيادة تحميل المعاملات.
ستنظّم شيفرتك في ثلاثة ملفات:
ScoreEntry.lua: أنشئ فئة ScoreEntry تمثّل نقاط لاعب واحد. لكل إدخالplayerNameوscore. أضف طريقة:getInfo()تُعيد سلسلة نصية بالتنسيق"{playerName}: {score} points". الميزة الأساسية هنا هي طريقة التحويل الفوقية__lt: ينبغي أن تكونa < btrueعندما تكون نقاطaأقل من نقاطb، بالطريقة نفسها التي يعمل بها<مع الأعداد.Leaderboard.lua: أنشئ فئة Leaderboard تدير مجموعة من إدخالات النقاط. تحتاج لوحة الترتيب إلى::addEntry(entry): تضيف ScoreEntry إلى القائمة الداخلية:sort(): ترتّب الإدخالات من أعلى النقاط إلى أدناها باستخدامtable.sort. بمفردها، تضعtable.sortالأصغر أولًا، لذا مرّر إليها مقارنة تعكس الترتيب:function(a, b) return b < a end. وتستخدم هذه المقارنة__ltأيضًا.:display(): تطبع معلومات كل إدخال، واحدًا في كل سطر
main.lua: اجمع كل شيء معًا! أنشئ لوحة ترتيب، وأضف إدخالات النقاط استنادًا إلى المدخلات التي تتلقاها، ثم رتّب لوحة الترتيب واعرض النتائج.
تؤدي مقارنة إدخالين باستخدام < إلى استدعاء طريقة التحويل الفوقية __lt، وبالتالي يمكن لـ table.sort ترتيب كائنات ScoreEntry. اجعل معنى __lt هو "أقل من"، واعكس الترتيب في استدعاء الفرز: فلو كان معنى __lt هو "أكبر من"، فستكون كل مقارنة باستخدام < بين إدخالين في أي موضع من البرنامج معكوسة المعنى.
ستتلقى ستة مدخلات تمثّل ثلاثة لاعبين:
- اسم اللاعب الأول
- نقاط اللاعب الأول (عدد)
- اسم اللاعب الثاني
- نقاط اللاعب الثاني (عدد)
- اسم اللاعب الثالث
- نقاط اللاعب الثالث (عدد)
في ملفك الرئيسي، أنشئ لوحة ترتيب، وأضف الإدخالات الثلاثة كلها، واستدعِ :sort()، ثم استدعِ :display() لعرض النتائج المرتبة.
على سبيل المثال، إذا كانت المدخلات هي Alice و1500 وBob و2300 وCharlie و1800، فينبغي أن يكون الناتج:
Bob: 2300 points
Charlie: 1800 points
Alice: 1500 pointsإذا كانت المدخلات هي Zara و500 وMax و750 وLuna و600، فينبغي أن يكون الناتج:
Max: 750 points
Luna: 600 points
Zara: 500 pointsجرّب بنفسك
-- الملف الرئيسي: اجمع كل الأجزاء معًا
local ScoreEntry = require('ScoreEntry')
local Leaderboard = require('Leaderboard')
-- اقرأ مدخلات ثلاثة لاعبين
local name1 = io.read()
local score1 = tonumber(io.read())
local name2 = io.read()
local score2 = tonumber(io.read())
local name3 = io.read()
local score3 = tonumber(io.read())
-- TODO: أنشئ Leaderboard جديدة
-- TODO: أنشئ كائنات ScoreEntry لكل لاعب
-- TODO: أضف المدخلات الثلاثة إلى لوحة المتصدرين
-- TODO: رتّب لوحة المتصدرين
-- TODO: اعرض النتائج المرتبة
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال9التركيب و Mixins
علاقة "يحتوي على" (Has-A)التفويض (Delegation)Mixins بسيطةتطبيق Mixins متعددةMixins مقابل الوراثةملخص - تجميع الروبوت12التحديات النهائية
مراجعة - نظام المخزونمراجعة - مدير المستخدمينمراجعة - متتبع النقاطاختبار OOP النهائيتدرّب بنفسك: مترجم Lua عبر الإنترنت