متغيرات النسخة
جزء من قسم البرمجة كائنية التوجه في رحلة 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 أو عدادات أو أي حالة قابلة للتغيير تكون فريدة لذلك الكائن.
التحدي
سهللنبنِ نظام ShoppingCart حيث تحافظ كل عربة على قائمة منفصلة خاصة بها من المنتجات. سيوضح هذا كيف تحافظ متغيرات instance على عزل البيانات بين الكائنات: إن إضافة عناصر إلى عربة واحدة لن تؤثر في عربة أخرى!
ستنظم التعليمات البرمجية الخاصة بك عبر ملفين:
ShoppingCart.lua: عرّف classShoppingCartحيث يمتلك كل instance جدولproductsخاصًا به. ضمّن:- منشئ
:new()يهيئ قائمة products فارغة لكل عربة - طريقة
:addProduct(productName)تضيف منتجًا إلى قائمة هذه العربة - طريقة
:listProducts()تطبع كل منتج في سطر منفصل
- منشئ
main.lua: اطلب وحدة ShoppingCart وأنشئ عربتين منفصلتين. أضف منتجات مختلفة إلى كل عربة لإثبات أنهما تحافظان على مخزوني inventory مستقلين.
ستتلقى أربعة inputs:
- المنتج الأول المراد إضافته إلى العربة A
- المنتج الثاني المراد إضافته إلى العربة A
- المنتج الأول المراد إضافته إلى العربة B
- المنتج الثاني المراد إضافته إلى العربة B
في ملف main الخاص بك:
- أنشئ عربتي تسوق:
cartAوcartB - أضف المنتجين الأولين إلى
cartA - أضف المنتجين الأخيرين إلى
cartB - اطبع
Cart A:ثم اعرض منتجات العربة A - اطبع
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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت