Menu
Coddy logo textTech

סיכום – כספת מאובטחת

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Lua של Coddy. שיעור 48 מתוך 70.

challenge icon

אתגר

קל

בואו נבנה מחלקה בשם Vault שמשתמשת בפרטיות המבוססת על סגירה (closure) כדי ליצור מערכת אחסון מאובטחת באמת! הכספת תחזיק תוכן סודי שאפשר לגשת אליו רק באמצעות הסיסמה הנכונה.

תארגן את הקוד שלך בשני קבצים:

  • Vault.lua: צור מחלקה שבה גם התוכן וגם הסיסמה נשמרים במשתנים מקומיים בתוך הבנאי: מוסתרים לחלוטין מגישה מבחוץ. הבנאי :new(contents, password) צריך לשמור את הערכים האלה במשתנים מקומיים, ואז להגדיר מתודה ישירות על מופע האובייקט:
    • :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() יש גישה אליהם דרך סגירה, אבל לשום דבר אחר אין גישה אליהם, אפילו לא אל vault.contents, vault._contents או vault.password. זוהי הסתרת מידע אמיתית!

נסו בעצמכם

-- טען את המודול Vault
local Vault = require('Vault')

-- קרא את הקלטים
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: צור כספת עם התוכן והסיסמה

-- TODO: נסה לפתוח את הכספת באמצעות הסיסמה שהוזנה לניסיון

-- TODO: הדפס את התוצאה בפורמט: "Result: {resultFromOpen}"

-- TODO: נסה לגשת ישירות אל vault.contents והדפס את מה שמתקבל
-- הדפס בפורמט: "Direct access: {whatYouGetFromVaultContents}"

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Lua אונליין