اصطلاحات التسمية
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 43 من 70.
في لغة Lua، تكون جميع حقول الجداول قابلة للوصول بشكل عام افتراضيًا. يمكن لأي شخص قراءة أو تعديل self.health مباشرةً. وبينما لا تفرض Lua الخصوصية، يستخدم المبرمجون اصطلاحات التسمية للتعبير عن القصد—مما يشير إلى الحقول التي يجب التعامل معها كتفاصيل تنفيذ داخلية.
العرف السائد هو بدء أسماء الحقول الخاصة بشرطة سفلية:
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- عام: يمكن الوصول إليه مباشرة
_health = 100, -- خاص: استخدم الدوال بدلاً من ذلك
_score = 0 -- خاص: تتبع داخلي
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endلا تغير الشرطة السفلية (underscore) طريقة عمل Lua—لا يزال من الممكن الوصول إلى player._health تقنياً. ومع ذلك، فهي تعمل كتحذير واضح للمبرمجين الآخرين (ولنفسك في المستقبل): "هذا الحقل مخصص ليكون خاصاً. قم بالوصول إليه من خلال الدوال (methods) بدلاً من ذلك."
تكمن أهمية هذه الاتفاقية في أنها تفصل بين الواجهة (ما يجب على الآخرين استخدامه) والتنفيذ (كيفية عملها داخلياً). إذا احتجت لاحقاً إلى إضافة تحقق من الصحة أو تغيير كيفية تخزين الصحة، فستقوم فقط بتعديل الدوال—ويستمر الكود الذي يستخدم :getHealth() في العمل دون تغيير.
التحدي
سهللنقم ببناء فئة BankAccount تشير بشكل صحيح إلى الحقول التي يُقصد بها أن تكون خاصة باستخدام اصطلاح تسمية الشرطة السفلية (underscore)!
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
BankAccount.lua: قم بإنشاء فئة تدير معلومات الحساب. يجب أن يقوم المنشئ:new(ownerName, initialBalance)بتخزين اسم المالك كحقل عام (owner) والرصيد كحقل خاص (_balance). قم بتضمين ثلاث طرق (methods)::getBalance()— يرجع الرصيد الحالي:deposit(amount)— يضيف المبلغ إلى_balance:getOwner()— يرجع اسم المالك
main.lua: قم باستدعاء وحدة BankAccount الخاصة بك، واقرأ اسم المالك، والرصيد الأولي، ومبلغ الإيداع من المدخلات. أنشئ حساباً، وقم بإجراء إيداع، ثم اطبع المالك والرصيد النهائي.
ستتلقى ثلاثة مدخلات:
- اسم المالك
- الرصيد الأولي (رقم)
- مبلغ الإيداع (رقم)
يجب أن يكون مخرجك عبارة عن سطرين يظهران المالك والرصيد النهائي بعد الإيداع:
Owner: {ownerName}
Balance: {finalBalance}على سبيل المثال، إذا كانت المدخلات هي Maria، و 500، و 150، فيجب أن يكون المخرج:
Owner: Maria
Balance: 650تذكر: بادئة الشرطة السفلية في _balance تشير للمبرمجين الآخرين إلى أنه يجب الوصول إلى هذا الحقل من خلال طرق مثل :getBalance() و :deposit()، وليس بشكل مباشر. أما حقل owner بدون شرطة سفلية فيشير إلى أنه من المقبول الوصول إليه علنًا.
ورقة مرجعية
في لغة Lua، تكون جميع حقول الجداول قابلة للوصول بشكل عام افتراضيًا. للتوضيح بشأن الحقول التي يجب معاملتها كتفاصيل تنفيذ داخلية، استخدم اصطلاح التسمية بالشرطة السفلية عن طريق إضافة شرطة سفلية (_) كبادئة للحقول الخاصة.
لا تفرض الشرطة السفلية الخصوصية—إنها إشارة للمبرمجين الآخرين بأن الحقل يجب الوصول إليه من خلال الدوال (methods) بدلاً من الوصول المباشر.
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- عام: يمكن الوصول إليه مباشرة
_health = 100, -- خاص: استخدم الدوال بدلاً من ذلك
_score = 0 -- خاص: تتبع داخلي
}
setmetatable(obj, Player)
return obj
end
function Player:getHealth()
return self._health
end
function Player:takeDamage(amount)
self._health = self._health - amount
endيفصل هذا الاصطلاح بين الواجهة (ما يجب على الآخرين استخدامه) والتنفيذ (كيف يعمل داخليًا)، مما يجعل الكود أكثر قابلية للصيانة عند الحاجة إلى إجراء تغييرات.
جرّب بنفسك
-- استدعاء وحدة BankAccount
local BankAccount = require('BankAccount')
-- قراءة المدخلات
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())
-- TODO: إنشاء BankAccount جديد باستخدام ownerName و initialBalance
-- TODO: إجراء إيداع باستخدام depositAmount
-- TODO: طباعة المالك والرصيد النهائي بالتنسيق المطلوب
-- التنسيق:
-- Owner: {ownerName}
-- Balance: {finalBalance}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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 للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال