مراجعة - الخزنة الآمنة
جزء من قسم Object Oriented Programming في رحلة Lua على Coddy — الدرس 48 من 70.
التحدي
سهللنقم ببناء فئة Vault تستخدم الخصوصية القائمة على الإغلاق (closure-based privacy) لإنشاء نظام تخزين آمن حقاً! ستحتفظ الخزنة بمحتويات سرية لا يمكن الوصول إليها إلا من خلال تقديم كلمة المرور الصحيحة.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Vault.lua: قم بإنشاء فئة حيث يتم تخزين كل من المحتويات وكلمة المرور في متغيرات محلية (local variables) داخل المنشئ (constructor) — مخفية تماماً عن الوصول الخارجي. يجب أن يقوم المنشئ:new(contents, password)بتخزين هذه القيم في متغيرات محلية، ثم تحديد طريقة (method) مباشرة على مثيل الكائن (object instance)::open(attemptedPassword)— يتحقق مما إذا كانت كلمة المرور المحاولة تطابق كلمة المرور المخزنة. إذا كانت صحيحة، فإنه يعيد المحتويات السرية. إذا كانت غير صحيحة، فإنه يعيد"Access Denied".
main.lua: اطلب وحدة Vault الخاصة بك واقرأ ثلاثة مدخلات: المحتويات السرية المراد تخزينها، وكلمة المرور المراد تعيينها، ومحاولة كلمة المرور. قم بإنشاء خزنة بالمحتويات وكلمة المرور، ثم حاول فتحها بكلمة المرور المحاولة واطبع النتيجة. أثبت أيضاً أن المحتويات خاصة حقاً من خلال محاولة الوصول إلىvault.contentsمباشرة وطباعة ما تحصل عليه.
سوف تتلقى ثلاثة مدخلات:
- المحتويات السرية لتخزينها في الخزنة
- كلمة المرور لحماية الخزنة
- محاولة كلمة مرور لمحاولة فتح الخزنة
يجب أن يتكون مخرجك من سطرين:
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
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكال