مراجعة - نظام المخزون
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 67 من 70.
التحدي
سهللنبنِ نظامًا كاملًا لإدارة المخزون في لعبة تقمّص أدوار! ستنشئ تسلسلًا هرميًا لأنواع العناصر وفئة مدير لتنظيمها، جامعًا بين الوراثة وتعدد الأشكال والتركيب في مشروع متماسك واحد.
ستنظّم شفرتك عبر خمسة ملفات:
Item.lua: الفئة الأساسية لجميع العناصر. يمتلك كل عنصرnameوvalue(بالعملات الذهبية). ضمّن طريقة:getInfo()تُرجع سلسلة نصية بالتنسيق"{name}: {value} gold".Weapon.lua: عنصر متخصص يرث من Item. تمتلك الأسلحة سمة إضافية هيdamage. أعد تعريف:getInfo()لتُرجع"{name}: {value} gold, {damage} damage".Potion.lua: عنصر متخصص آخر يرث من Item. تمتلك الجرعات سمةhealAmount. أعد تعريف:getInfo()لتُرجع"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: فئة مدير تخزّن مجموعة من العناصر. ضمّن طريقة:addItem(item)لإضافة أي نوع من العناصر، وطريقة:listItems()تطبع:getInfo()لكل عنصر (عنصرًا واحدًا في كل سطر)، وطريقة:getTotalValue()تُرجع مجموع قيم جميع العناصر.main.lua: اجمع كل شيء معًا! أنشئ مخزونًا واملأه بالعناصر استنادًا إلى المدخلات التي تتلقاها. ثم اعرض جميع العناصر واطبع القيمة الإجمالية للمخزون في السطر الأخير.
يكمن جمال هذا التصميم في تعدد الأشكال أثناء العمل. لا يحتاج Inventory إلى معرفة ما إذا كان يخزّن Weapon أم Potion. فهو يستدعي :getInfo() فقط، ويستجيب كل عنصر بشكل مناسب استنادًا إلى نوعه.
ستتلقى ستة مدخلات تصف عنصرين ستتم إضافتهما:
- نوع العنصر الأول (
"weapon"أو"potion") - اسم العنصر الأول
- قيمة العنصر الأول (رقم)
- نوع العنصر الثاني (
"weapon"أو"potion") - اسم العنصر الثاني
- قيمة العنصر الثاني (رقم)
بالنسبة إلى الأسلحة، استخدم قيمة damage ثابتة تساوي 25. وبالنسبة إلى الجرعات، استخدم قيمة heal ثابتة تساوي 50.
بعد إضافة العنصرين، استدعِ :listItems() لطباعة معلومات كل عنصر، ثم اطبع Total: {value} gold في السطر الأخير.
على سبيل المثال، إذا كانت المدخلات هي weapon وIron Sword و150 وpotion وHealth Elixir و75، فيجب أن يكون الناتج:
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldإذا كانت المدخلات هي potion وMana Potion و50 وweapon وSteel Axe و200، فيجب أن يكون الناتج:
Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 goldجرّب بنفسك
-- main.lua: اجمع كل شيء معاً
local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')
-- اقرأ المدخلات للعنصر الأول
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())
-- اقرأ المدخلات للعنصر الثاني
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- قيم ثابتة: الأسلحة لديها 25 ضرراً، الجرعات تشفي 50 HP
-- TODO: أنشئ مخزوناً
-- TODO: أنشئ العنصر الأول بناءً على type1 ("weapon" or "potion")
-- وأضفه إلى المخزون
-- TODO: أنشئ العنصر الثاني بناءً على type2 ("weapon" or "potion")
-- وأضفه إلى المخزون
-- TODO: استدعِ listItems() لطباعة معلومات كل عنصر
-- TODO: اطبع "Total: {value} gold" باستخدام getTotalValue()
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت