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

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

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

challenge icon

التحدي

سهل

لنبنِ فئة 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:

  1. اسم owner
  2. Balance الأولي (number)
  3. 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}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت