نسخ مستقلة
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 10 من 70.
من الجوانب الأساسية في البرمجة كائنية التوجه أن كل instance يحافظ على حالته separate الخاصة به. عند إنشاء كائنين من الفئة نفسها، فإنهما مستقلان تمامًا: تغيير أحدهما لا يؤثر في الآخر.
تأمل هذا المثال:
local Counter = {}
Counter.__index = Counter
function Counter:new(start)
local instance = {}
setmetatable(instance, self)
instance.value = start or 0
return instance
end
function Counter:increment()
self.value = self.value + 1
end
-- إنشاء عدّادين منفصلين
local counterA = Counter:new(10)
local counterB = Counter:new(5)
counterA:increment()
counterA:increment()
print(counterA.value) -- المخرجات: 12
print(counterB.value) -- المخرجات: 5على الرغم من أن كلا العدادين يأتيان من الفئة Counter نفسها، فإن زيادة counterA لا تؤثر في counterB. لكل كائن حقل value خاص به مخزّن في جدول المثيل الخاص به.
هذا الاستقلال هو ما يجعل الكائنات مفيدة. يمكنك إنشاء عشرات اللاعبين في لعبة، بحيث يتتبّع كل منهم صحته ونتيجته الخاصة. يمكنك إدارة حسابات بنكية متعددة، لكل منها رصيد مختلف.
يحدّد الصنف البنية والسلوك، لكن كل مثيل يعيش حياته الخاصة ببياناته الخاصة.
التحدي
سهللنثبت أن الكائنات من الفئة نفسها تعيش حقًا حياة مستقلة! ستبني فئة Wallet وتنشئ مثيلين منفصلين من المحافظ، ثم تعدّلهما بشكل مستقل لإثبات أن التغييرات التي تطرأ على إحداهما لا تؤثر في الأخرى.
ستنظّم شيفرتك عبر ملفين:
Wallet.lua: عرّف فئةWalletباستخدام نمط المُنشئ القياسي. يجب أن تتعقب كل محفظةbalanceالخاصة بها. أدرج:- مُنشئ
:new(startingBalance)يهيّئ المحفظة بالمبلغ المُعطى - طريقة
:add(amount)تزيد الرصيد - طريقة
:spend(amount)تقلّل الرصيد
- مُنشئ
main.lua: اطلب وحدة Wallet وأنشئ مثيلين منفصلين من المحافظ. نفّذ عمليات مختلفة على كل منهما لإظهار أنهما يحافظان على حالة مستقلة.
ستتلقى أربعة مدخلات:
- الرصيد الابتدائي للمحفظة A
- الرصيد الابتدائي للمحفظة B
- المبلغ المراد إضافته إلى المحفظة A
- المبلغ المراد إنفاقه من المحفظة B
في ملفك الرئيسي:
- أنشئ
walletAباستخدام الرصيد الابتدائي الأول - أنشئ
walletBباستخدام الرصيد الابتدائي الثاني - أضف المبلغ المحدد إلى
walletA - أنفق المبلغ المحدد من
walletB - اطبع الرصيدين في سطرين منفصلين
اطبع الرصيدين النهائيين بهذا التنسيق الدقيق:
Wallet A: [balance]
Wallet B: [balance]على سبيل المثال، إذا كانت المدخلات هي 100 و50 و25 و10، فيجب أن يكون الناتج:
Wallet A: 125
Wallet B: 40لاحظ كيف أن الإضافة إلى المحفظة A لا تغيّر المحفظة B، وأن الإنفاق من المحفظة B لا يؤثر في المحفظة A: إذ يحافظ كل مثيل على رصيده المنفصل الخاص به.
جرّب بنفسك
-- تتطلب وحدة Wallet
local Wallet = require('Wallet')
-- قراءة المدخلات
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())
-- TODO: أنشئ walletA بالرصيد الابتدائي الأول
-- TODO: أنشئ walletB بالرصيد الابتدائي الثاني
-- TODO: أضف المبلغ المحدد إلى walletA
-- TODO: أنفق المبلغ المحدد من walletB
-- TODO: اطبع الأرصدة النهائية بالتنسيق المطلوب
-- التنسيق: "Wallet A: [balance]" و "Wallet B: [balance]"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت