اصطلاحات التسمية
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 43 من 70.
في Lua، تكون جميع حقول الجداول متاحةً للعامة افتراضيًا. يمكن لأي شخص قراءة self.health أو تعديلها مباشرةً. وعلى الرغم من أن Lua لا تفرض الخصوصية، يستخدم المبرمجون اصطلاحات التسمية للتعبير عن القصد: والإشارة إلى الحقول التي ينبغي التعامل معها على أنها تفاصيل تنفيذ داخلية.
الاصطلاح القياسي هو وضع شرطة سفلية في بداية private field:
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لا تغيّر الشرطة السفلية طريقة عمل Lua: يظل player._health قابلًا للوصول إليه تقنيًا. ومع ذلك، فهي تُعدّ تحذيرًا واضحًا للمبرمجين الآخرين (ولذاتك في المستقبل): "هذا الحقل مخصّص ليكون private. يمكنك الوصول إليه من خلال methods بدلًا من ذلك."
هذا الاصطلاح مهم لأنه يفصل بين الواجهة (ما ينبغي للآخرين استخدامه) والتنفيذ (كيفية عمله داخليًا). إذا احتجت لاحقًا إلى إضافة التحقق أو تغيير طريقة تخزين الصحة، فلن تعدّل سوى methods: يستمر الكود الذي يستخدم :getHealth() في العمل دون تغيير.
التحدي
سهللنبنِ فئة BankAccount توضّح بشكل صحيح الحقول التي يُفترض أن تكون private باستخدام اصطلاح التسمية بشرطة سفلية!
ستنظّم شيفرتك عبر ملفين:
BankAccount.lua: أنشئ فئة تدير معلومات account. يجب أن يخزّن Constructor:new(ownerName, initialBalance)اسم owner كحقل public (owner) وBalance كحقل private (_balance). أدرج ثلاثة methods::getBalance(): يعيد Balance الحالي:deposit(amount): يضيف amount إلى_balance:getOwner(): يعيد اسم owner
main.lua: اطلب module BankAccount، واقرأ اسم owner وBalance الأولي وamount الإيداع من inputs. أنشئ account، وأجرِ إيداعًا، ثم اطبع owner وfinal Balance.
ستتلقى ثلاثة inputs:
- اسم owner
- Balance الأولي (number)
- amount الإيداع (number)
يجب أن يتكون output من سطرين يعرضان owner وfinal Balance بعد الإيداع:
Owner: {ownerName}
Balance: {finalBalance}على سبيل المثال، إذا كانت inputs هي Maria و500 و150، فيجب أن يكون output:
Owner: Maria
Balance: 650تذكّر: تشير السابقة underscore في _balance إلى المبرمجين الآخرين إلى أن هذا field يجب الوصول إليه من خلال methods مثل :getBalance() و:deposit()، وليس directly. أما field owner من دون underscore، فيشير إلى أنه من المقبول الوصول إليه بشكل public.
جرّب بنفسك
-- تتطلب وحدة 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}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت