مراجعة - نظام المخزون
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 67 من 70.
التحدي
سهللنقم ببناء نظام كامل لإدارة المخزون للعبة تقمص أدوار (RPG)! ستقوم بإنشاء تسلسل هرمي لأنواع العناصر وفئة مدير لتنظيمها — مما يجمع بين الوراثة (inheritance)، وتعدد الأشكال (polymorphism)، والتركيب (composition) في مشروع واحد متماسك.
ستقوم بتنظيم الكود الخاص بك عبر خمسة ملفات:
Item.lua: الفئة الأساسية لجميع العناصر. كل عنصر لهnameوvalue(بالعملات الذهبية). قم بتضمين تابع:getInfo()الذي يعيد سلسلة نصية بتنسيق"{name}: {value} gold".Weapon.lua: عنصر متخصص يرث من Item. الأسلحة لها سمةdamageإضافية. قم بإعادة تعريف (Override) لـ: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: اجمع كل شيء معاً! قم بإنشاء مخزون واملأه بالعناصر بناءً على المدخلات التي تتلقاها. ثم قم بسرد جميع العناصر واطبع القيمة الإجمالية للمخزون في السطر الأخير.
جمال هذا التصميم يكمن في تعدد الأشكال (polymorphism) أثناء العمل — لا يحتاج Inventory الخاص بك إلى معرفة ما إذا كان يخزن Weapon أو Potion. إنه ببساطة يستدعي :getInfo() وكل عنصر يستجيب بشكل مناسب بناءً على نوعه.
ستتلقى ستة مدخلات تصف عنصرين لإضافتهما:
- نوع العنصر الأول (
"weapon"أو"potion") - اسم العنصر الأول
- قيمة العنصر الأول (رقم)
- نوع العنصر الثاني (
"weapon"أو"potion") - اسم العنصر الثاني
- قيمة العنصر الثاني (رقم)
بالنسبة للأسلحة، استخدم ضرراً ثابتاً قدره 25. بالنسبة للجرعات، استخدم مقدار شفاء ثابتاً قدره 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 نقطة حياة
-- TODO: إنشاء حقيبة (inventory)
-- TODO: إنشاء العنصر الأول بناءً على type1 ("weapon" أو "potion")
-- وإضافته إلى الحقيبة
-- TODO: إنشاء العنصر الثاني بناءً على type2 ("weapon" أو "potion")
-- وإضافته إلى الحقيبة
-- TODO: استدعاء listItems() لطباعة معلومات كل عنصر
-- TODO: طباعة "Total: {value} gold" باستخدام getTotalValue()
جميع دروس Object Oriented Programming
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 النهائي