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

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

جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 48 من 70.

challenge icon

التحدي

سهل

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

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

  • Vault.lua: قم بإنشاء فئة حيث يتم تخزين كل من المحتويات وكلمة المرور في متغيرات محلية (local variables) داخل المنشئ (constructor) — مخفية تماماً عن الوصول الخارجي. يجب أن يقوم المنشئ :new(contents, password) بتخزين هذه القيم في متغيرات محلية، ثم تحديد طريقة (method) مباشرة على مثيل الكائن (object instance):
    • :open(attemptedPassword) — يتحقق مما إذا كانت كلمة المرور المحاولة تطابق كلمة المرور المخزنة. إذا كانت صحيحة، فإنه يعيد المحتويات السرية. إذا كانت غير صحيحة، فإنه يعيد "Access Denied".
  • main.lua: اطلب وحدة Vault الخاصة بك واقرأ ثلاثة مدخلات: المحتويات السرية المراد تخزينها، وكلمة المرور المراد تعيينها، ومحاولة كلمة المرور. قم بإنشاء خزنة بالمحتويات وكلمة المرور، ثم حاول فتحها بكلمة المرور المحاولة واطبع النتيجة. أثبت أيضاً أن المحتويات خاصة حقاً من خلال محاولة الوصول إلى vault.contents مباشرة وطباعة ما تحصل عليه.

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

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

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

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

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

Result: Gold Coins
Direct access: nil

إذا كانت المدخلات هي Diamond، و mypass، و wrongpass، فيجب أن يكون المخرج:

Result: Access Denied
Direct access: nil

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

جرّب بنفسك

-- استدعاء وحدة Vault
local Vault = require('Vault')

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

-- مهام: إنشاء خزنة بالمحتويات وكلمة المرور

-- مهام: محاولة فتح الخزنة باستخدام كلمة المرور المحاولة

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

-- مهام: محاولة الوصول إلى vault.contents مباشرة وطباعة ما ستحصل عليه
-- الطباعة بالتنسيق التالي: "Direct access: {whatYouGetFromVaultContents}"

جميع دروس Object Oriented Programming