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

اصطلاحات التسمية

جزء من قسم 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() في العمل دون تغيير.

challenge icon

التحدي

سهل

لنقم ببناء فئة BankAccount تشير بشكل صحيح إلى الحقول التي يُقصد بها أن تكون خاصة باستخدام اصطلاح تسمية الشرطة السفلية (underscore)!

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • BankAccount.lua: قم بإنشاء فئة تدير معلومات الحساب. يجب أن يقوم المنشئ :new(ownerName, initialBalance) بتخزين اسم المالك كحقل عام (owner) والرصيد كحقل خاص (_balance). قم بتضمين ثلاث طرق (methods):
    • :getBalance() — يرجع الرصيد الحالي
    • :deposit(amount) — يضيف المبلغ إلى _balance
    • :getOwner() — يرجع اسم المالك
  • main.lua: قم باستدعاء وحدة BankAccount الخاصة بك، واقرأ اسم المالك، والرصيد الأولي، ومبلغ الإيداع من المدخلات. أنشئ حساباً، وقم بإجراء إيداع، ثم اطبع المالك والرصيد النهائي.

ستتلقى ثلاثة مدخلات:

  1. اسم المالك
  2. الرصيد الأولي (رقم)
  3. مبلغ الإيداع (رقم)

يجب أن يكون مخرجك عبارة عن سطرين يظهران المالك والرصيد النهائي بعد الإيداع:

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}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming