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

مراجعة - الخزنة الآمنة

جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 48 من 70.

challenge icon

التحدي

سهل

لنبنِ فئة Vault تستخدم الخصوصية القائمة على الإغلاق لإنشاء نظام تخزين آمن حقًا! ستحتفظ الخزنة بمحتويات سرية لا يمكن الوصول إليها إلا بتقديم كلمة المرور الصحيحة.

ستنظّم التعليمات البرمجية عبر ملفين:

  • Vault.lua: أنشئ فئة حيث يتم تخزين كلٍّ من contents وpassword في متغيرات local داخل المُنشئ: مخفيين تمامًا عن الوصول من الخارج. يجب أن يخزّن المُنشئ :new(contents, password) هذه القيم في متغيرات local، ثم يعرّف method مباشرةً على كائن instance:
    • :open(attemptedPassword): يتحقق مما إذا كانت attempted password تطابق password المخزنة. إذا كانت correct، يعيد contents السرية. وإذا كانت incorrect، يعيد "Access Denied".
  • main.lua: استخدم Require لوحدة Vault واقرأ ثلاثة inputs: contents السرية المراد تخزينها، وpassword المراد تعيينها، ومحاولة password. أنشئ خزنة باستخدام contents وpassword، ثم حاول فتحها باستخدام attempted password واطبع result. أظهر أيضًا أن contents خاصة حقًا من خلال محاولة الوصول إلى vault.contents مباشرةً وطباعة ما تحصل عليه.

ستتلقى ثلاثة inputs:

  1. contents السرية المراد تخزينها في الخزنة
  2. password لحماية الخزنة
  3. محاولة password لفتح الخزنة

يجب أن يتكون output من سطرين:

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

على سبيل المثال، إذا كانت inputs هي Gold Coins وsecret123 وsecret123، فيجب أن يكون output:

Result: Gold Coins
Direct access: nil

إذا كانت inputs هي Diamond وmypass وwrongpass، فيجب أن يكون output:

Result: Access Denied
Direct access: nil

الفكرة الأساسية هنا هي أن كلًّا من contents وpassword موجود فقط كمتغيرات local داخل المُنشئ. يمكن لـ:open() الوصول إليها عبر closure، لكن لا يمكن لأي شيء آخر ذلك، ولا حتى vault.contents أو vault._contents أو vault.password. هذا هو التغليف الحقيقي!

جرّب بنفسك

-- تتطلب وحدة Vault
local Vault = require('Vault')

-- اقرأ المدخلات
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: أنشئ vault بالمحتويات وكلمة المرور

-- TODO: حاول فتح الـ vault بكلمة المرور المحاوَلة

-- TODO: اطبع النتيجة بالتنسيق: "Result: {resultFromOpen}"

-- TODO: حاول الوصول إلى vault.contents مباشرة واطبع ما تحصل عليه
-- Print in the format: "Direct access: {whatYouGetFromVaultContents}"

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

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