Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

متغيرات النسخة

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 12 من 70.

مرحبًا بك في فصل جديد يركّز على كيفية إدارة الكائنات لبياناتها الداخلية. لقد تعلّمت إنشاء الفئات وinstance: حان الوقت الآن لاستكشاف كيفية تخزين كل instance لحالتها الفريدة وإدارتها.

متغيرات instance هي حقول تنتمي حصريًا إلى كائن واحد. عندما تُسنِد قيمة إلى self.something داخل method أو constructor، تبقى تلك البيانات في تلك instance المحددة فقط. وتمتلك الكائنات الأخرى من الفئة نفسها نسخًا منفصلة خاصة بها.

يصبح هذا مهمًا بشكل خاص عند تخزين بيانات معقدة مثل الجداول. تأمل نظام مخزون يحمل فيه كل عنصر أغراضًا مختلفة:

local Inventory = {}
Inventory.__index = Inventory

function Inventory:new()
    local instance = {}
    setmetatable(instance, self)
    instance.items = {}  -- يحصل كل مثيل على جدوله الفارغ الخاص به
    return instance
end

function Inventory:addItem(item)
    table.insert(self.items, item)
end

السطر الأساسي هو instance.items = {}. من خلال إنشاء جدول empty جديد داخل المُنشئ، يحصل كل كائن inventory على قائمته المميزة own. أما إذا عرّفت items داخل جدول class نفسه، فستشارك جميع instances الجدول نفسه عن طريق الخطأ: إذ إن إضافة سيف إلى شخصية واحدة ستمنحه للجميع!

local bag1 = Inventory:new()
local bag2 = Inventory:new()

bag1:addItem("Sword")
bag2:addItem("Potion")

print(#bag1.items)  -- المخرجات: 1
print(#bag2.items)  -- المخرجات: 1

يحافظ كل inventory على مجموعته الخاصة. ينطبق هذا النمط كلما احتاجت instance إلى تتبّع بيانات تتغير بشكل مستقل: list أو عدادات أو أي حالة قابلة للتغيير تكون فريدة لذلك الكائن.

challenge icon

التحدي

سهل

لنبنِ نظام ShoppingCart حيث تحافظ كل عربة على قائمة منفصلة خاصة بها من المنتجات. سيوضح هذا كيف تحافظ متغيرات instance على عزل البيانات بين الكائنات: إن إضافة عناصر إلى عربة واحدة لن تؤثر في عربة أخرى!

ستنظم التعليمات البرمجية الخاصة بك عبر ملفين:

  • ShoppingCart.lua: عرّف class ShoppingCart حيث يمتلك كل instance جدول products خاصًا به. ضمّن:
    • منشئ :new() يهيئ قائمة products فارغة لكل عربة
    • طريقة :addProduct(productName) تضيف منتجًا إلى قائمة هذه العربة
    • طريقة :listProducts() تطبع كل منتج في سطر منفصل
  • main.lua: اطلب وحدة ShoppingCart وأنشئ عربتين منفصلتين. أضف منتجات مختلفة إلى كل عربة لإثبات أنهما تحافظان على مخزوني inventory مستقلين.

ستتلقى أربعة inputs:

  1. المنتج الأول المراد إضافته إلى العربة A
  2. المنتج الثاني المراد إضافته إلى العربة A
  3. المنتج الأول المراد إضافته إلى العربة B
  4. المنتج الثاني المراد إضافته إلى العربة B

في ملف main الخاص بك:

  1. أنشئ عربتي تسوق: cartA وcartB
  2. أضف المنتجين الأولين إلى cartA
  3. أضف المنتجين الأخيرين إلى cartB
  4. اطبع Cart A: ثم اعرض منتجات العربة A
  5. اطبع Cart B: ثم اعرض منتجات العربة B

على سبيل المثال، إذا كانت inputs هي Apple وBread وMilk وEggs، فينبغي أن يكون Output كما يلي:

Cart A:
Apple
Bread
Cart B:
Milk
Eggs

تذكّر: المفتاح هو تهيئة products كجدول جديد فارغ داخل المنشئ. يضمن ذلك حصول كل instance من العربة على قائمة منفصلة خاصة بها، بدلًا من مشاركة جدول واحد بين جميع العربات.

جرّب بنفسك

-- تتطلب وحدة ShoppingCart
local ShoppingCart = require('ShoppingCart')

-- اقرأ المدخلات
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()

-- TODO: أنشئ عربتي تسوق: cartA و cartB

-- TODO: أضف product1 و product2 إلى cartA

-- TODO: أضف product3 و product4 إلى cartB

-- TODO: اطبع "Cart A:" ثم اسرد منتجات cartA

-- TODO: اطبع "Cart B:" ثم اسرد منتجات cartB
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت