Menu
Coddy logo textTech

כללי מתן שמות

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

ב-Lua, כל שדות הטבלה נגישים לציבור כברירת מחדל. כל אחד יכול לקרוא או לשנות ישירות את self.health. אף ש-Lua אינה אוכפת פרטיות, מתכנתים משתמשים במוסכמות שמות כדי להעביר את כוונתם: לסמן אילו שדות יש להתייחס אליהם כאל פרטי מימוש פנימיים.

המוסכמה המקובלת היא להוסיף קו תחתון בתחילת שמות של שדות פרטיים:

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. עם זאת, הוא משמש כאזהרה ברורה למתכנתים אחרים (ולך בעתיד): "השדה הזה מיועד להיות פרטי. יש לגשת אליו דרך מתודות במקום זאת."

המוסכמה הזו חשובה משום שהיא מפרידה בין הממשק (במה אחרים אמורים להשתמש) לבין המימוש (איך הוא פועל באופן פנימי). אם בהמשך תצטרך להוסיף אימות או לשנות את אופן אחסון הבריאות, תשנה רק את המתודות: קוד שמשתמש ב־:getHealth() ימשיך לפעול ללא שינוי.

challenge icon

אתגר

קל

בואו נבנה מחלקה BankAccount שמציינת כראוי אילו שדות מיועדים להיות פרטיים באמצעות מוסכמת השמות עם קו תחתון!

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

  • BankAccount.lua: צרו מחלקה שמנהלת פרטי חשבון. הבנאי :new(ownerName, initialBalance) צריך לשמור את שם הבעלים כשדה ציבורי (owner) ואת היתרה כשדה פרטי (_balance). כללו שלוש מתודות:
    • :getBalance(): מחזירה את היתרה הנוכחית
    • :deposit(amount): מוסיפה את הסכום אל _balance
    • :getOwner(): מחזירה את שם הבעלים
  • main.lua: טענו את המודול BankAccount שלכם, קראו מהקלט את שם הבעלים, את היתרה הראשונית ואת סכום ההפקדה. צרו חשבון, בצעו הפקדה, ואז הדפיסו את שם הבעלים ואת היתרה הסופית.

תקבלו שלושה נתוני קלט:

  1. שם הבעלים
  2. היתרה הראשונית (מספר)
  3. סכום ההפקדה (מספר)

הפלט שלכם צריך להיות שתי שורות המציגות את שם הבעלים ואת היתרה הסופית לאחר ההפקדה:

Owner: {ownerName}
Balance: {finalBalance}

לדוגמה, אם נתוני הקלט הם Maria, 500 ו-150, הפלט צריך להיות:

Owner: Maria
Balance: 650

זכרו: הקידומת של קו תחתון ב-_balance מסמנת למתכנתים אחרים שיש לגשת לשדה הזה דרך מתודות כמו :getBalance() ו-:deposit(), ולא ישירות. השדה owner ללא קו תחתון מציין שאין בעיה לגשת אליו באופן ציבורי.

נסו בעצמכם

-- טענו את המודול BankAccount באמצעות require
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 אונליין